diff --git a/Makefile b/Makefile index 701aa7ed189..35298d8ea39 100644 --- a/Makefile +++ b/Makefile @@ -265,6 +265,7 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/vf_globalconstvar.o \ $(libcppdir)/vf_globalstaticvar.o \ $(libcppdir)/vf_impossiblevalues.o \ + $(libcppdir)/vf_infercondition.o \ $(libcppdir)/vf_iteratorinfer.o \ $(libcppdir)/vf_iterators.o \ $(libcppdir)/vf_number.o \ @@ -484,7 +485,7 @@ validateRules: ###### Build -$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/check.h lib/checkuninitvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyze.h lib/vf_analyzers.h lib/vf_array.h lib/vf_arraybool.h lib/vf_arrayelement.h lib/vf_bailout.h lib/vf_bitand.h lib/vf_common.h lib/vf_debug.h lib/vf_enumvalue.h lib/vf_functionreturn.h lib/vf_globalconstvar.h lib/vf_globalstaticvar.h lib/vf_impossiblevalues.h lib/vf_iteratorinfer.h lib/vf_iterators.h lib/vf_number.h lib/vf_pointeralias.h lib/vf_rightshift.h lib/vf_sameexpressions.h lib/vf_settokenvalue.h lib/vf_string.h lib/vf_symbolicinfer.h lib/vf_unknownfunctionreturn.h lib/vfvalue.h +$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/check.h lib/checkuninitvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyze.h lib/vf_analyzers.h lib/vf_array.h lib/vf_arraybool.h lib/vf_arrayelement.h lib/vf_bailout.h lib/vf_bitand.h lib/vf_common.h lib/vf_debug.h lib/vf_enumvalue.h lib/vf_functionreturn.h lib/vf_globalconstvar.h lib/vf_globalstaticvar.h lib/vf_impossiblevalues.h lib/vf_infercondition.h lib/vf_iteratorinfer.h lib/vf_iterators.h lib/vf_number.h lib/vf_pointeralias.h lib/vf_rightshift.h lib/vf_sameexpressions.h lib/vf_settokenvalue.h lib/vf_string.h lib/vf_symbolicinfer.h lib/vf_unknownfunctionreturn.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp $(libcppdir)/tokenize.o: lib/tokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h @@ -709,6 +710,9 @@ $(libcppdir)/vf_globalstaticvar.o: lib/vf_globalstaticvar.cpp lib/astutils.h lib $(libcppdir)/vf_impossiblevalues.o: lib/vf_impossiblevalues.cpp lib/astutils.h lib/calculate.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vf_impossiblevalues.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_impossiblevalues.cpp +$(libcppdir)/vf_infercondition.o: lib/vf_infercondition.cpp lib/astutils.h lib/config.h lib/errortypes.h lib/infer.h lib/library.h lib/mathlib.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_infercondition.h lib/vf_settokenvalue.h lib/vfvalue.h + $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_infercondition.cpp + $(libcppdir)/vf_iteratorinfer.o: lib/vf_iteratorinfer.cpp lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vf_common.h lib/vf_iteratorinfer.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_iteratorinfer.cpp diff --git a/lib/cppcheck.vcxproj b/lib/cppcheck.vcxproj index b5c0b1474c5..7439f69795d 100644 --- a/lib/cppcheck.vcxproj +++ b/lib/cppcheck.vcxproj @@ -100,6 +100,7 @@ + @@ -205,6 +206,7 @@ + diff --git a/lib/lib.pri b/lib/lib.pri index 72833b6476a..2765845d151 100644 --- a/lib/lib.pri +++ b/lib/lib.pri @@ -93,6 +93,7 @@ HEADERS += $${PWD}/addoninfo.h \ $${PWD}/vf_globalconstvar.h \ $${PWD}/vf_globalstaticvar.h \ $${PWD}/vf_impossiblevalues.h \ + $${PWD}/vf_infercondition.h \ $${PWD}/vf_iteratorinfer.h \ $${PWD}/vf_iterators.h \ $${PWD}/vf_number.h \ @@ -181,6 +182,7 @@ SOURCES += $${PWD}/valueflow.cpp \ $${PWD}/vf_globalconstvar.cpp \ $${PWD}/vf_globalstaticvar.cpp \ $${PWD}/vf_impossiblevalues.cpp \ + $${PWD}/vf_infercondition.cpp \ $${PWD}/vf_iteratorinfer.cpp \ $${PWD}/vf_iterators.cpp \ $${PWD}/vf_number.cpp \ diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index e9b738ba8e5..ba1e85fd9d8 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -110,7 +110,6 @@ #include "vf_settokenvalue.h" #include -#include #include #include #include @@ -4114,103 +4113,12 @@ static ValueFlow::Value inferCondition(const std::string& op, const Token* varTo return ValueFlow::Value{}; if (varTok->hasKnownIntValue()) return ValueFlow::Value{}; - std::vector r = infer(IntegralInferModel{}, op, varTok->values(), val); + std::vector r = infer(ValueFlow::makeIntegralInferModel(), op, varTok->values(), val); if (r.size() == 1 && r.front().isKnown()) return r.front(); return ValueFlow::Value{}; } -struct IteratorInferModel : InferModel { - virtual ValueFlow::Value::ValueType getType() const = 0; - bool match(const ValueFlow::Value& value) const override { - return value.valueType == getType(); - } - ValueFlow::Value yield(MathLib::bigint value) const override - { - ValueFlow::Value result(value); - result.valueType = getType(); - result.setKnown(); - return result; - } -}; - -struct EndIteratorInferModel : IteratorInferModel { - ValueFlow::Value::ValueType getType() const override { - return ValueFlow::Value::ValueType::ITERATOR_END; - } -}; - -struct StartIteratorInferModel : IteratorInferModel { - ValueFlow::Value::ValueType getType() const override { - return ValueFlow::Value::ValueType::ITERATOR_END; - } -}; - -static bool isIntegralOnlyOperator(const Token* tok) { - return Token::Match(tok, "%|<<|>>|&|^|~|%or%"); -} - -static bool isIntegralOrPointer(const Token* tok) -{ - if (!tok) - return false; - if (astIsIntegral(tok, false)) - return true; - if (astIsPointer(tok)) - return true; - if (Token::Match(tok, "NULL|nullptr")) - return true; - if (tok->valueType()) - return false; - // These operators only work on integers - if (isIntegralOnlyOperator(tok)) - return true; - if (isIntegralOnlyOperator(tok->astParent())) - return true; - if (Token::Match(tok, "+|-|*|/") && tok->isBinaryOp()) - return isIntegralOrPointer(tok->astOperand1()) && isIntegralOrPointer(tok->astOperand2()); - return false; -} - -static void valueFlowInferCondition(TokenList& tokenlist, - const Settings& settings) -{ - for (Token* tok = tokenlist.front(); tok; tok = tok->next()) { - if (!tok->astParent()) - continue; - if (tok->hasKnownIntValue()) - continue; - if (Token::Match(tok, "%comp%|-") && tok->astOperand1() && tok->astOperand2()) { - if (astIsIterator(tok->astOperand1()) || astIsIterator(tok->astOperand2())) { - static const std::array, 2> iteratorModels = {EndIteratorInferModel{}, - StartIteratorInferModel{}}; - for (const ValuePtr& model : iteratorModels) { - std::vector result = - infer(model, tok->str(), tok->astOperand1()->values(), tok->astOperand2()->values()); - for (ValueFlow::Value value : result) { - value.valueType = ValueFlow::Value::ValueType::INT; - setTokenValue(tok, std::move(value), settings); - } - } - } else if (isIntegralOrPointer(tok->astOperand1()) && isIntegralOrPointer(tok->astOperand2())) { - std::vector result = - infer(IntegralInferModel{}, tok->str(), tok->astOperand1()->values(), tok->astOperand2()->values()); - for (ValueFlow::Value& value : result) { - setTokenValue(tok, std::move(value), settings); - } - } - } else if (Token::Match(tok->astParent(), "?|&&|!|%oror%") || - Token::Match(tok->astParent()->previous(), "if|while (") || - (astIsPointer(tok) && isUsedAsBool(tok, settings))) { - std::vector result = infer(IntegralInferModel{}, "!=", tok->values(), 0); - if (result.size() != 1) - continue; - ValueFlow::Value value = result.front(); - setTokenValue(tok, std::move(value), settings); - } - } -} - struct SymbolicConditionHandler : SimpleConditionHandler { static bool isNegatedBool(const Token* tok) @@ -6213,7 +6121,7 @@ void ValueFlow::setValues(TokenList& tokenlist, VFA(valueFlowAfterAssign(tokenlist, symboldatabase, errorLogger, settings, skippedFunctions)), VFA_CPP(valueFlowAfterSwap(tokenlist, symboldatabase, errorLogger, settings)), VFA(valueFlowCondition(SimpleConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings, skippedFunctions)), - VFA(valueFlowInferCondition(tokenlist, settings)), + VFA(analyzeInferCondition(tokenlist, settings)), VFA(valueFlowSwitchVariable(tokenlist, symboldatabase, errorLogger, settings)), VFA(valueFlowForLoop(tokenlist, symboldatabase, errorLogger, settings)), VFA(valueFlowSubFunction(tokenlist, symboldatabase, errorLogger, settings)), diff --git a/lib/valueflow.h b/lib/valueflow.h index 1f7554048ef..ba88e12106e 100644 --- a/lib/valueflow.h +++ b/lib/valueflow.h @@ -22,6 +22,7 @@ //--------------------------------------------------------------------------- #include "config.h" +#include "errortypes.h" #include "mathlib.h" #include "vfvalue.h" diff --git a/lib/vf_analyze.h b/lib/vf_analyze.h index 0ae58676ec2..72b321743f1 100644 --- a/lib/vf_analyze.h +++ b/lib/vf_analyze.h @@ -29,6 +29,7 @@ #include "vf_globalconstvar.h" // IWYU pragma: export #include "vf_globalstaticvar.h" // IWYU pragma: export #include "vf_impossiblevalues.h" // IWYU pragma: export +#include "vf_infercondition.h" // IWYU pragma: export #include "vf_iteratorinfer.h" // IWYU pragma: export #include "vf_iterators.h" // IWYU pragma: export #include "vf_number.h" // IWYU pragma: export diff --git a/lib/vf_infercondition.cpp b/lib/vf_infercondition.cpp new file mode 100644 index 00000000000..78e3a0fed77 --- /dev/null +++ b/lib/vf_infercondition.cpp @@ -0,0 +1,128 @@ +/* + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2024 Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "vf_infercondition.h" + +#include "astutils.h" +#include "infer.h" +#include "mathlib.h" +#include "token.h" +#include "tokenlist.h" +#include "valueflow.h" +#include "valueptr.h" +#include "vfvalue.h" + +#include "vf_settokenvalue.h" + +#include +#include +#include +#include + +namespace ValueFlow +{ + struct IteratorInferModel : InferModel { + virtual Value::ValueType getType() const = 0; + bool match(const Value& value) const override { + return value.valueType == getType(); + } + Value yield(MathLib::bigint value) const override + { + Value result(value); + result.valueType = getType(); + result.setKnown(); + return result; + } + }; + + struct EndIteratorInferModel : IteratorInferModel { + Value::ValueType getType() const override { + return Value::ValueType::ITERATOR_END; + } + }; + + struct StartIteratorInferModel : IteratorInferModel { + Value::ValueType getType() const override { + return Value::ValueType::ITERATOR_END; + } + }; + + static bool isIntegralOnlyOperator(const Token* tok) { + return Token::Match(tok, "%|<<|>>|&|^|~|%or%"); + } + + static bool isIntegralOrPointer(const Token* tok) + { + if (!tok) + return false; + if (astIsIntegral(tok, false)) + return true; + if (astIsPointer(tok)) + return true; + if (Token::Match(tok, "NULL|nullptr")) + return true; + if (tok->valueType()) + return false; + // These operators only work on integers + if (isIntegralOnlyOperator(tok)) + return true; + if (isIntegralOnlyOperator(tok->astParent())) + return true; + if (Token::Match(tok, "+|-|*|/") && tok->isBinaryOp()) + return isIntegralOrPointer(tok->astOperand1()) && isIntegralOrPointer(tok->astOperand2()); + return false; + } + + void analyzeInferCondition(TokenList& tokenlist, const Settings& settings) + { + for (Token* tok = tokenlist.front(); tok; tok = tok->next()) { + if (!tok->astParent()) + continue; + if (tok->hasKnownIntValue()) + continue; + if (Token::Match(tok, "%comp%|-") && tok->astOperand1() && tok->astOperand2()) { + if (astIsIterator(tok->astOperand1()) || astIsIterator(tok->astOperand2())) { + static const std::array, 2> iteratorModels = {EndIteratorInferModel{}, + StartIteratorInferModel{}}; + for (const ValuePtr& model : iteratorModels) { + std::vector result = + infer(model, tok->str(), tok->astOperand1()->values(), tok->astOperand2()->values()); + for (Value value : result) { + value.valueType = Value::ValueType::INT; + setTokenValue(tok, std::move(value), settings); + } + } + } else if (isIntegralOrPointer(tok->astOperand1()) && isIntegralOrPointer(tok->astOperand2())) { + std::vector result = + infer(makeIntegralInferModel(), tok->str(), tok->astOperand1()->values(), tok->astOperand2()->values()); + for (Value& value : result) { + setTokenValue(tok, std::move(value), settings); + } + } + } else if (Token::Match(tok->astParent(), "?|&&|!|%oror%") || + Token::Match(tok->astParent()->previous(), "if|while (") || + (astIsPointer(tok) && isUsedAsBool(tok, settings))) { + std::vector result = infer(makeIntegralInferModel(), "!=", tok->values(), 0); + if (result.size() != 1) + continue; + Value value = result.front(); + setTokenValue(tok, std::move(value), settings); + } + } + } +} diff --git a/lib/vf_infercondition.h b/lib/vf_infercondition.h new file mode 100644 index 00000000000..2bb5a3b6d2b --- /dev/null +++ b/lib/vf_infercondition.h @@ -0,0 +1,30 @@ +/* -*- C++ -*- + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2024 Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef vfInferConditionH +#define vfInferConditionH + +class TokenList; +class Settings; + +namespace ValueFlow +{ + void analyzeInferCondition(TokenList& tokenlist, const Settings& settings); +} + +#endif // vfInferConditionH diff --git a/oss-fuzz/Makefile b/oss-fuzz/Makefile index 542c3d359a9..bf367a1913a 100644 --- a/oss-fuzz/Makefile +++ b/oss-fuzz/Makefile @@ -108,6 +108,7 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/vf_globalconstvar.o \ $(libcppdir)/vf_globalstaticvar.o \ $(libcppdir)/vf_impossiblevalues.o \ + $(libcppdir)/vf_infercondition.o \ $(libcppdir)/vf_iteratorinfer.o \ $(libcppdir)/vf_iterators.o \ $(libcppdir)/vf_number.o \ @@ -162,7 +163,7 @@ simplecpp.o: ../externals/simplecpp/simplecpp.cpp ../externals/simplecpp/simplec tinyxml2.o: ../externals/tinyxml2/tinyxml2.cpp ../externals/tinyxml2/tinyxml2.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -w -c -o $@ ../externals/tinyxml2/tinyxml2.cpp -$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/check.h ../lib/checkuninitvar.h ../lib/color.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/suppressions.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyze.h ../lib/vf_analyzers.h ../lib/vf_array.h ../lib/vf_arraybool.h ../lib/vf_arrayelement.h ../lib/vf_bailout.h ../lib/vf_bitand.h ../lib/vf_common.h ../lib/vf_debug.h ../lib/vf_enumvalue.h ../lib/vf_functionreturn.h ../lib/vf_globalconstvar.h ../lib/vf_globalstaticvar.h ../lib/vf_impossiblevalues.h ../lib/vf_iteratorinfer.h ../lib/vf_iterators.h ../lib/vf_number.h ../lib/vf_pointeralias.h ../lib/vf_rightshift.h ../lib/vf_sameexpressions.h ../lib/vf_settokenvalue.h ../lib/vf_string.h ../lib/vf_symbolicinfer.h ../lib/vf_unknownfunctionreturn.h ../lib/vfvalue.h +$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/check.h ../lib/checkuninitvar.h ../lib/color.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/suppressions.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyze.h ../lib/vf_analyzers.h ../lib/vf_array.h ../lib/vf_arraybool.h ../lib/vf_arrayelement.h ../lib/vf_bailout.h ../lib/vf_bitand.h ../lib/vf_common.h ../lib/vf_debug.h ../lib/vf_enumvalue.h ../lib/vf_functionreturn.h ../lib/vf_globalconstvar.h ../lib/vf_globalstaticvar.h ../lib/vf_impossiblevalues.h ../lib/vf_infercondition.h ../lib/vf_iteratorinfer.h ../lib/vf_iterators.h ../lib/vf_number.h ../lib/vf_pointeralias.h ../lib/vf_rightshift.h ../lib/vf_sameexpressions.h ../lib/vf_settokenvalue.h ../lib/vf_string.h ../lib/vf_symbolicinfer.h ../lib/vf_unknownfunctionreturn.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp $(libcppdir)/tokenize.o: ../lib/tokenize.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/color.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/suppressions.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h @@ -387,6 +388,9 @@ $(libcppdir)/vf_globalstaticvar.o: ../lib/vf_globalstaticvar.cpp ../lib/astutils $(libcppdir)/vf_impossiblevalues.o: ../lib/vf_impossiblevalues.cpp ../lib/astutils.h ../lib/calculate.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vf_impossiblevalues.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_impossiblevalues.cpp +$(libcppdir)/vf_infercondition.o: ../lib/vf_infercondition.cpp ../lib/astutils.h ../lib/config.h ../lib/errortypes.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_infercondition.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h + $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_infercondition.cpp + $(libcppdir)/vf_iteratorinfer.o: ../lib/vf_iteratorinfer.cpp ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vf_common.h ../lib/vf_iteratorinfer.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_iteratorinfer.cpp