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