diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 9bbd46aea5b..86d5e35273d 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -45,7 +45,12 @@ #include #include -ExprIdToken::ExprIdToken(const Token* tok) : tok(tok), exprid(tok ? tok->exprId() : 0) {} +ExprIdToken::ExprIdToken(const Token* tok) + : tok(tok) +{ + assert(tok); + exprid = tok->exprId(); +} ExprIdToken::ExprIdToken(nonneg int exprId) : exprid(exprId) {} @@ -59,6 +64,9 @@ std::size_t ExprIdToken::Hash::operator()(ExprIdToken etok) const } void ProgramMemory::setValue(const Token* expr, const ValueFlow::Value& value) { + if (!expr) + return; + copyOnWrite(); ValueFlow::Value subvalue = value; diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 1d9b7f98d64..049e953f59f 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -6321,6 +6321,8 @@ const Token* ValueFlow::solveExprValue(const Token* expr, const std::function(const Token*)>& eval, ValueFlow::Value& value) { + if (!expr) + return nullptr; if (!value.isIntValue() && !value.isIteratorValue() && !value.isSymbolicValue()) return expr; if (value.isSymbolicValue() && !Token::Match(expr, "+|-")) diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index 54aeeab3034..294ae8a1d5e 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -941,8 +941,11 @@ struct MultiValueFlowAnalyzer : ValueFlowAnalyzer { MultiValueFlowAnalyzer(const std::unordered_map& args, const Settings& set) : ValueFlowAnalyzer(set) { for (const auto& p:args) { - values[p.first->declarationId()] = p.second; - vars[p.first->declarationId()] = p.first; + const auto declId = p.first->declarationId(); + if (declId == 0) + continue; // TODO: should never happen? + values[declId] = p.second; + vars[declId] = p.first; } } @@ -1075,6 +1078,7 @@ struct MultiValueFlowAnalyzer : ValueFlowAnalyzer { const Variable* var = vars.at(p.first); if (!var) continue; + assert(var->nameToken()); ps[var->nameToken()] = p.second; } return ps;