From 1cd9d0479d107abc27a6b7e70ba15b618c6b72b8 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Thu, 26 Aug 2021 00:46:40 -0500 Subject: [PATCH] Fix 10433: assertion failure in ValueFlow (Interval::fromValues) (#3419) --- lib/symboldatabase.cpp | 3 +-- lib/token.cpp | 3 ++- lib/valueflow.cpp | 2 ++ test/testvalueflow.cpp | 10 ++++++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 8a454a340..f3b1f7028 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7050,8 +7050,7 @@ ValueType::MatchResult ValueType::matchParameter(const ValueType *call, const Va funcVar->scope() && funcVar->scope()->function && funcVar->scope()->function->templateDef; if (type1 == type2) return ValueType::MatchResult::SAME; - if (!templateVar && type1.find("auto") == std::string::npos && type2.find("auto") == std::string::npos && - type1 != type2) + if (!templateVar && type1.find("auto") == std::string::npos && type2.find("auto") == std::string::npos) return ValueType::MatchResult::NOMATCH; } return res; diff --git a/lib/token.cpp b/lib/token.cpp index 501e3ddb7..39f85e20f 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -2409,7 +2409,8 @@ bool Token::hasKnownSymbolicValue(const Token* tok) const return false; return mImpl->mValues && std::any_of(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& value) { - return value.isSymbolicValue() && value.tokvalue && value.tokvalue->exprId() == tok->exprId(); + return value.isKnown() && value.isSymbolicValue() && value.tokvalue && + value.tokvalue->exprId() == tok->exprId(); }); } diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 95d326768..a469c551a 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -5585,6 +5585,8 @@ struct SymbolicConditionHandler : SimpleConditionHandler { const Token* valuetok = lhs ? tok->astOperand2() : tok->astOperand1(); if (valuetok->hasKnownSymbolicValue(vartok)) continue; + if (vartok->hasKnownSymbolicValue(valuetok)) + continue; ValueFlow::Value true_value; ValueFlow::Value false_value; setConditionalValues(tok, !lhs, 0, true_value, false_value); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index c57875535..9491d45cf 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -5822,6 +5822,16 @@ private: " a *const d = arguments[c.arg];\n" "}\n"; valueOfTok(code, "c"); + + code = "void h(char* p, int s) {\n" + " char *q = p+s;\n" + " char buf[100];\n" + " char *b = buf;\n" + " ++b;\n" + " if (p < q && buf < b)\n" + " diff = (buf-b);\n" + "}\n"; + valueOfTok(code, "diff"); } void valueFlowHang() {