From 23fe62587b81efbe8ccbfa014db1157f0a35c6cf Mon Sep 17 00:00:00 2001 From: firewave Date: Sat, 31 Aug 2024 16:22:48 +0200 Subject: [PATCH 1/4] valueflow.cpp: do not perform function call in `valueFlowImpossibleValues()` until necessary --- lib/valueflow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index f551d82221f..ed2668b9c6f 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1063,7 +1063,6 @@ static void valueFlowImpossibleValues(TokenList& tokenList, const Settings& sett flipped = true; else if (!std::equal(tokens.cbegin(), tokens.cend(), branches.cbegin(), &isSameToken)) continue; - const bool isMin = Token::Match(condTok, "<|<=") ^ flipped; std::vector values; for (const Token* tok2 : tokens) { if (tok2->hasKnownIntValue()) { @@ -1083,6 +1082,7 @@ static void valueFlowImpossibleValues(TokenList& tokenList, const Settings& sett }); } } + const bool isMin = Token::Match(condTok, "<|<=") ^ flipped; for (ValueFlow::Value& value : values) { value.setImpossible(); if (isMin) { From eef0e802ba493c5ac2a4b166cc55f98c58880e94 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 30 Sep 2024 01:41:16 +0200 Subject: [PATCH 2/4] valueflow.cpp: reduced variable scope in `valueFlowConditionExpressions()` --- lib/valueflow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index ed2668b9c6f..38105f5852e 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3332,7 +3332,6 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist, Token* parenTok = tok->next(); if (!Token::simpleMatch(parenTok->link(), ") {")) continue; - Token* blockTok = parenTok->link()->tokAt(1); const Token* condTok = parenTok->astOperand2(); if (condTok->exprId() == 0) continue; @@ -3343,6 +3342,7 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist, const bool isOp = condTok->isComparisonOp() || condTok->tokType() == Token::eLogicalOp; const bool is1 = isOp || astIsBool(condTok); + Token* blockTok = parenTok->link()->tokAt(1); Token* startTok = blockTok; // Inner condition { From cbc0062bedfe5fd30fae3ce2d6357c369b07da60 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 30 Sep 2024 01:42:00 +0200 Subject: [PATCH 3/4] valueflow.cpp: reduced variable scope in `LifeTimeStore::byRef()` --- lib/valueflow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 38105f5852e..da7bfbab5ea 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -2072,12 +2072,12 @@ struct LifetimeStore { for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(argtok, settings)) { if (!settings.certainty.isEnabled(Certainty::inconclusive) && lt.inconclusive) continue; - ErrorPath er = errorPath; - er.insert(er.end(), lt.errorPath.cbegin(), lt.errorPath.cend()); if (!lt.token) return false; if (!pred(lt.token)) return false; + ErrorPath er = errorPath; + er.insert(er.end(), lt.errorPath.cbegin(), lt.errorPath.cend()); er.emplace_back(argtok, message); ValueFlow::Value value; From 3201d0113b1bab0049700438c7fe3ab152fa42b6 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 17 Oct 2024 00:37:05 +0200 Subject: [PATCH 4/4] valueflow.cpp: reduced lifetime of object in `valueFlowSymbolicInfer()` --- lib/valueflow.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index da7bfbab5ea..eb2aab78e77 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3699,8 +3699,11 @@ static void valueFlowSymbolicInfer(const SymbolDatabase& symboldatabase, const S if (astIsFloat(tok->astOperand2(), false)) continue; - SymbolicInferModel leftModel{tok->astOperand1()}; - std::vector values = infer(leftModel, tok->str(), 0, tok->astOperand2()->values()); + std::vector values; + { + SymbolicInferModel leftModel{tok->astOperand1()}; + values = infer(leftModel, tok->str(), 0, tok->astOperand2()->values()); + } if (values.empty()) { SymbolicInferModel rightModel{tok->astOperand2()}; values = infer(rightModel, tok->str(), tok->astOperand1()->values(), 0);