diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 30a064146..1d5df0f78 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -551,11 +551,14 @@ bool extractForLoopValues(const Token *forToken, static const Token * getVariableInitExpression(const Variable * var) { - if (!var || !var->declEndToken()) + if (!var) return nullptr; - if (Token::Match(var->declEndToken(), "; %varid% =", var->declarationId())) - return var->declEndToken()->tokAt(2)->astOperand2(); - return var->declEndToken()->astOperand2(); + const Token *varDeclEndToken = var->declEndToken(); + if (!varDeclEndToken) + return nullptr; + if (Token::Match(varDeclEndToken, "; %varid% =", var->declarationId())) + return varDeclEndToken->tokAt(2)->astOperand2(); + return varDeclEndToken->astOperand2(); } static bool isInLoopCondition(const Token * tok) @@ -729,13 +732,6 @@ static void followVariableExpressionError(const Token *tok1, const Token *tok2, errors->push_back(item); } -static void findTokenValue(const Token* const tok, std::function pred, std::function f) -{ - auto x = std::find_if(tok->values().begin(), tok->values().end(), pred); - if (x != tok->values().end()) - f(*x); -} - static bool isSameLifetime(const Token * const tok1, const Token * const tok2) { ValueFlow::Value v1 = getLifetimeObjValue(tok1); @@ -747,18 +743,23 @@ static bool isSameLifetime(const Token * const tok1, const Token * const tok2) static bool compareKnownValue(const Token * const tok1, const Token * const tok2, std::function compare) { - bool result = false; - bool sameLifetime = isSameLifetime(tok1, tok2); - findTokenValue(tok1, std::mem_fn(&ValueFlow::Value::isKnown), [&](const ValueFlow::Value& v1) { - if (v1.isNonValue() || v1.isContainerSizeValue()) - return; - findTokenValue(tok2, std::mem_fn(&ValueFlow::Value::isKnown), [&](const ValueFlow::Value& v2) { - if (v1.valueType == v2.valueType) { - result = compare(v1, v2, sameLifetime); - } - }); - }); - return result; + static const auto isKnownFn = std::mem_fn(&ValueFlow::Value::isKnown); + + const auto v1 = std::find_if(tok1->values().begin(), tok1->values().end(), isKnownFn); + if (v1 == tok1->values().end()) { + return false; + } + if (v1->isNonValue() || v1->isContainerSizeValue()) + return false; + const auto v2 = std::find_if(tok2->values().begin(), tok2->values().end(), isKnownFn); + if (v2 == tok2->values().end()) { + return false; + } + if (v1->valueType != v2->valueType) { + return false; + } + const bool sameLifetime = isSameLifetime(tok1, tok2); + return compare(*v1, *v2, sameLifetime); } bool isEqualKnownValue(const Token * const tok1, const Token * const tok2) diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 200d6e981..2f0451fa9 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -193,13 +193,13 @@ static void fillProgramMemoryFromConditions(ProgramMemory& pm, const Token* tok, fillProgramMemoryFromConditions(pm, tok->scope(), tok, settings); } -static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok, const ProgramMemory& state, ProgramMemory::Map vars) +static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok, const ProgramMemory& state, const ProgramMemory::Map& vars) { int indentlevel = 0; for (const Token *tok2 = tok; tok2; tok2 = tok2->previous()) { bool setvar = false; if (Token::Match(tok2, "[;{}] %var% = %var% ;")) { - for (auto&& p:vars) { + for (const auto& p:vars) { if (p.first != tok2->next()->varId()) continue; const Token *vartok = tok2->tokAt(3); @@ -293,7 +293,6 @@ void ProgramMemoryState::addState(const Token* tok, const ProgramMemory::Map& va { ProgramMemory pm; fillProgramMemoryFromConditions(pm, tok, nullptr); - ProgramMemory local; for (const auto& p:vars) { nonneg int varid = p.first; const ValueFlow::Value &value = p.second; @@ -301,7 +300,7 @@ void ProgramMemoryState::addState(const Token* tok, const ProgramMemory::Map& va if (value.varId) pm.setIntValue(value.varId, value.varvalue); } - local = pm; + ProgramMemory local = pm; fillProgramMemoryFromAssignments(pm, tok, local, vars); replace(pm, tok); }