diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 9be785315..f074abebc 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -544,7 +544,7 @@ unsigned int CppCheck::check(const std::string &path) Tokenizer tokenizer(&mSettings, this); tokenizer.list.appendFileIfNew(path); clangimport::parseClangAstDump(&tokenizer, ast); - ValueFlow::setValues(&tokenizer.list, + ValueFlow::setValues(tokenizer.list, const_cast(tokenizer.getSymbolDatabase()), this, &mSettings, diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 9363dec6c..5af99c21e 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3361,9 +3361,9 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration) if (doValueFlow) { if (mTimerResults) { Timer t("Tokenizer::simplifyTokens1::ValueFlow", mSettings->showtime, mTimerResults); - ValueFlow::setValues(&list, mSymbolDatabase, mErrorLogger, mSettings, mTimerResults); + ValueFlow::setValues(list, mSymbolDatabase, mErrorLogger, mSettings, mTimerResults); } else { - ValueFlow::setValues(&list, mSymbolDatabase, mErrorLogger, mSettings, mTimerResults); + ValueFlow::setValues(list, mSymbolDatabase, mErrorLogger, mSettings, mTimerResults); } } diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index cf3cdb561..03765c69c 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -126,12 +126,12 @@ #include #include -static void bailoutInternal(const std::string& type, TokenList *tokenlist, ErrorLogger *errorLogger, const Token *tok, const std::string &what, const std::string &file, int line, std::string function) +static void bailoutInternal(const std::string& type, TokenList &tokenlist, ErrorLogger *errorLogger, const Token *tok, const std::string &what, const std::string &file, int line, std::string function) { if (function.find("operator") != std::string::npos) function = "(valueFlow)"; - std::list callstack(1, ErrorMessage::FileLocation(tok, tokenlist)); - ErrorMessage errmsg(callstack, tokenlist->getSourceFilePath(), Severity::debug, + std::list callstack(1, ErrorMessage::FileLocation(tok, &tokenlist)); + ErrorMessage errmsg(callstack, tokenlist.getSourceFilePath(), Severity::debug, Path::stripDirectoryPart(file) + ":" + MathLib::toString(line) + ":" + function + " bailout: " + what, type, Certainty::normal); errorLogger->reportErr(errmsg); } @@ -380,7 +380,7 @@ const Token *ValueFlow::parseCompareInt(const Token *tok, ValueFlow::Value &true }); } -static bool isEscapeScope(const Token* tok, const TokenList * tokenlist, const Settings* settings, bool unknown = false) +static bool isEscapeScope(const Token* tok, const Settings* settings, bool unknown = false) { if (!Token::simpleMatch(tok, "{")) return false; @@ -389,7 +389,7 @@ static bool isEscapeScope(const Token* tok, const TokenList * tokenlist, const S if (termTok && termTok->scope() == tok->scope()) return true; std::string unknownFunction; - if (tokenlist && settings->library.isScopeNoReturn(tok->link(), &unknownFunction)) + if (settings->library.isScopeNoReturn(tok->link(), &unknownFunction)) return unknownFunction.empty() || unknown; return false; } @@ -1343,22 +1343,22 @@ static Token * valueFlowSetConstantValue(Token *tok, const Settings *settings, b return tok->next(); } -static void valueFlowNumber(TokenList *tokenlist, const Settings* settings) +static void valueFlowNumber(TokenList &tokenlist, const Settings* settings) { bool isInitList = false; const Token* endInit{}; - for (Token *tok = tokenlist->front(); tok;) { + for (Token *tok = tokenlist.front(); tok;) { if (!isInitList && tok->str() == "{" && (Token::simpleMatch(tok->astOperand1(), ",") || Token::simpleMatch(tok->astOperand2(), ","))) { isInitList = true; endInit = tok->link(); } - tok = valueFlowSetConstantValue(tok, settings, tokenlist->isCPP(), isInitList); + tok = valueFlowSetConstantValue(tok, settings, tokenlist.isCPP(), isInitList); if (isInitList && tok == endInit) isInitList = false; } - if (tokenlist->isCPP()) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + if (tokenlist.isCPP()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->isName() && !tok->varId() && Token::Match(tok, "false|true")) { ValueFlow::Value value(tok->str() == "true"); if (!tok->isTemplateArg()) @@ -1376,9 +1376,9 @@ static void valueFlowNumber(TokenList *tokenlist, const Settings* settings) } } -static void valueFlowString(TokenList *tokenlist, const Settings* settings) +static void valueFlowString(TokenList &tokenlist, const Settings* settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->tokType() == Token::eString) { ValueFlow::Value strvalue; strvalue.valueType = ValueFlow::Value::ValueType::TOK; @@ -1389,11 +1389,11 @@ static void valueFlowString(TokenList *tokenlist, const Settings* settings) } } -static void valueFlowArray(TokenList *tokenlist, const Settings *settings) +static void valueFlowArray(TokenList &tokenlist, const Settings *settings) { std::map constantArrays; - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->varId() > 0) { // array const std::map::const_iterator it = constantArrays.find(tok->varId()); @@ -1463,9 +1463,9 @@ static const Token *getOtherOperand(const Token *tok) return nullptr; } -static void valueFlowArrayBool(TokenList *tokenlist, const Settings *settings) +static void valueFlowArrayBool(TokenList &tokenlist, const Settings *settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->hasKnownIntValue()) continue; const Variable *var = nullptr; @@ -1496,9 +1496,9 @@ static void valueFlowArrayBool(TokenList *tokenlist, const Settings *settings) } } -static void valueFlowArrayElement(TokenList* tokenlist, const Settings* settings) +static void valueFlowArrayElement(TokenList& tokenlist, const Settings* settings) { - for (Token* tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token* tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->hasKnownIntValue()) continue; const Token* indexTok = nullptr; @@ -1573,9 +1573,9 @@ static void valueFlowArrayElement(TokenList* tokenlist, const Settings* settings } } -static void valueFlowPointerAlias(TokenList *tokenlist, const Settings* settings) +static void valueFlowPointerAlias(TokenList &tokenlist, const Settings* settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { // not address of if (!tok->isUnaryOp("&")) continue; @@ -1604,9 +1604,9 @@ static void valueFlowPointerAlias(TokenList *tokenlist, const Settings* settings } } -static void valueFlowBitAnd(TokenList *tokenlist, const Settings* settings) +static void valueFlowBitAnd(TokenList &tokenlist, const Settings* settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->str() != "&") continue; @@ -1635,9 +1635,9 @@ static void valueFlowBitAnd(TokenList *tokenlist, const Settings* settings) } } -static void valueFlowSameExpressions(TokenList *tokenlist, const Settings* settings) +static void valueFlowSameExpressions(TokenList &tokenlist, const Settings* settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->hasKnownIntValue()) continue; @@ -1665,7 +1665,7 @@ static void valueFlowSameExpressions(TokenList *tokenlist, const Settings* setti if (!val.isKnown()) continue; - if (isSameExpression(tokenlist->isCPP(), false, tok->astOperand1(), tok->astOperand2(), settings->library, true, true, &val.errorPath)) { + if (isSameExpression(tokenlist.isCPP(), false, tok->astOperand1(), tok->astOperand2(), settings->library, true, true, &val.errorPath)) { setTokenValue(tok, std::move(val), settings); } } @@ -1723,9 +1723,9 @@ static bool getExpressionRange(const Token *expr, MathLib::bigint *minvalue, Mat return false; } -static void valueFlowRightShift(TokenList *tokenList, const Settings* settings) +static void valueFlowRightShift(TokenList &tokenList, const Settings* settings) { - for (Token *tok = tokenList->front(); tok; tok = tok->next()) { + for (Token *tok = tokenList.front(); tok; tok = tok->next()) { if (tok->str() != ">>") continue; @@ -1818,9 +1818,9 @@ static bool isSameToken(const Token* tok1, const Token* tok2) return false; } -static void valueFlowImpossibleValues(TokenList* tokenList, const Settings* settings) +static void valueFlowImpossibleValues(TokenList& tokenList, const Settings* settings) { - for (Token* tok = tokenList->front(); tok; tok = tok->next()) { + for (Token* tok = tokenList.front(); tok; tok = tok->next()) { if (tok->hasKnownIntValue()) continue; if (Token::Match(tok, "true|false")) @@ -1912,7 +1912,7 @@ static void valueFlowImpossibleValues(TokenList* tokenList, const Settings* sett ValueFlow::Value value{0}; value.setImpossible(); setTokenValue(tok->linkAt(1)->next(), std::move(value), settings); - } else if ((tokenList->isCPP() && Token::simpleMatch(tok, "this")) || tok->isUnaryOp("&")) { + } else if ((tokenList.isCPP() && Token::simpleMatch(tok, "this")) || tok->isUnaryOp("&")) { ValueFlow::Value value{0}; value.setImpossible(); setTokenValue(tok, std::move(value), settings); @@ -1953,11 +1953,11 @@ static void valueFlowEnumValue(SymbolDatabase * symboldatabase, const Settings * } } -static void valueFlowGlobalConstVar(TokenList* tokenList, const Settings *settings) +static void valueFlowGlobalConstVar(TokenList& tokenList, const Settings *settings) { // Get variable values... std::map vars; - for (const Token* tok = tokenList->front(); tok; tok = tok->next()) { + for (const Token* tok = tokenList.front(); tok; tok = tok->next()) { if (!tok->variable()) continue; // Initialization... @@ -1977,7 +1977,7 @@ static void valueFlowGlobalConstVar(TokenList* tokenList, const Settings *settin } // Set values.. - for (Token* tok = tokenList->front(); tok; tok = tok->next()) { + for (Token* tok = tokenList.front(); tok; tok = tok->next()) { if (!tok->variable()) continue; const std::map::const_iterator var = vars.find(tok->variable()); @@ -1987,11 +1987,11 @@ static void valueFlowGlobalConstVar(TokenList* tokenList, const Settings *settin } } -static void valueFlowGlobalStaticVar(TokenList *tokenList, const Settings *settings) +static void valueFlowGlobalStaticVar(TokenList &tokenList, const Settings *settings) { // Get variable values... std::map vars; - for (const Token *tok = tokenList->front(); tok; tok = tok->next()) { + for (const Token *tok = tokenList.front(); tok; tok = tok->next()) { if (!tok->variable()) continue; // Initialization... @@ -2015,9 +2015,9 @@ static void valueFlowGlobalStaticVar(TokenList *tokenList, const Settings *setti else if (tok->astParent()->isAssignmentOp()) { if (tok == tok->astParent()->astOperand1()) vars.erase(tok->variable()); - else if (tokenList->isCPP() && Token::Match(tok->astParent()->tokAt(-2), "& %name% =")) + else if (tokenList.isCPP() && Token::Match(tok->astParent()->tokAt(-2), "& %name% =")) vars.erase(tok->variable()); - } else if (isLikelyStreamRead(tokenList->isCPP(), tok->astParent())) { + } else if (isLikelyStreamRead(tokenList.isCPP(), tok->astParent())) { vars.erase(tok->variable()); } else if (Token::Match(tok->astParent(), "[(,]")) vars.erase(tok->variable()); @@ -2025,7 +2025,7 @@ static void valueFlowGlobalStaticVar(TokenList *tokenList, const Settings *setti } // Set values.. - for (Token *tok = tokenList->front(); tok; tok = tok->next()) { + for (Token *tok = tokenList.front(); tok; tok = tok->next()) { if (!tok->variable()) continue; const std::map::const_iterator var = vars.find(tok->variable()); @@ -2035,14 +2035,14 @@ static void valueFlowGlobalStaticVar(TokenList *tokenList, const Settings *setti } } -static ValuePtr makeAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList* tokenlist, const Settings* settings); -static ValuePtr makeReverseAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList* tokenlist, const Settings* settings); +static ValuePtr makeAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList& tokenlist, const Settings* settings); +static ValuePtr makeReverseAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList& tokenlist, const Settings* settings); static Analyzer::Result valueFlowForward(Token* startToken, const Token* endToken, const Token* exprTok, ValueFlow::Value value, - const TokenList* const tokenlist, + const TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) { @@ -2058,7 +2058,7 @@ static Analyzer::Result valueFlowForward(Token* startToken, const Token* endToken, const Token* exprTok, std::list values, - const TokenList* const tokenlist, + const TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) { @@ -2073,7 +2073,7 @@ template static Analyzer::Result valueFlowForward(Token* startToken, const Token* exprTok, ValueOrValues v, - TokenList* tokenlist, + TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) { @@ -2087,7 +2087,7 @@ static Analyzer::Result valueFlowForward(Token* startToken, static Analyzer::Result valueFlowForwardRecursive(Token* top, const Token* exprTok, std::list values, - const TokenList* const tokenlist, + const TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) { @@ -2105,7 +2105,7 @@ static void valueFlowReverse(Token* tok, const Token* const endToken, const Token* const varToken, std::list values, - const TokenList* tokenlist, + const TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) { @@ -2117,7 +2117,7 @@ static void valueFlowReverse(Token* tok, } // Deprecated -static void valueFlowReverse(const TokenList* tokenlist, +static void valueFlowReverse(const TokenList& tokenlist, Token* tok, const Token* const varToken, ValueFlow::Value val, @@ -2380,11 +2380,11 @@ static bool bifurcate(const Token* tok, const std::set& varids, cons } struct ValueFlowAnalyzer : Analyzer { - const TokenList* tokenlist; + const TokenList& tokenlist; const Settings* settings; ProgramMemoryState pms; - explicit ValueFlowAnalyzer(const TokenList* t = nullptr, const Settings* s = nullptr) : tokenlist(t), settings(s), pms(settings) {} + explicit ValueFlowAnalyzer(const TokenList& t, const Settings* s = nullptr) : tokenlist(t), settings(s), pms(settings) {} virtual const ValueFlow::Value* getValue(const Token* tok) const = 0; virtual ValueFlow::Value* getValue(const Token* tok) = 0; @@ -2423,7 +2423,7 @@ struct ValueFlowAnalyzer : Analyzer { } bool isCPP() const { - return tokenlist->isCPP(); + return tokenlist.isCPP(); } const Settings* getSettings() const { @@ -2983,9 +2983,7 @@ struct SingleValueFlowAnalyzer : ValueFlowAnalyzer { std::unordered_map aliases; ValueFlow::Value value; - SingleValueFlowAnalyzer() : ValueFlowAnalyzer() {} - - SingleValueFlowAnalyzer(ValueFlow::Value v, const TokenList* t, const Settings* s) : ValueFlowAnalyzer(t, s), value(std::move(v)) {} + SingleValueFlowAnalyzer(ValueFlow::Value v, const TokenList& t, const Settings* s) : ValueFlowAnalyzer(t, s), value(std::move(v)) {} const std::unordered_map& getVars() const { return varids; @@ -3118,11 +3116,7 @@ struct ExpressionAnalyzer : SingleValueFlowAnalyzer { bool dependOnThis; bool uniqueExprId; - ExpressionAnalyzer() - : SingleValueFlowAnalyzer(), expr(nullptr), local(true), unknown(false), dependOnThis(false), uniqueExprId(false) - {} - - ExpressionAnalyzer(const Token* e, ValueFlow::Value val, const TokenList* t, const Settings* s) + ExpressionAnalyzer(const Token* e, ValueFlow::Value val, const TokenList& t, const Settings* s) : SingleValueFlowAnalyzer(std::move(val), t, s), expr(e), local(true), @@ -3139,7 +3133,7 @@ struct ExpressionAnalyzer : SingleValueFlowAnalyzer { setupExprVarIds(value.tokvalue); } uniqueExprId = - expr->isUniqueExprId() && (Token::Match(expr, "%cop%") || !isVariableChanged(expr, 0, s, t->isCPP())); + expr->isUniqueExprId() && (Token::Match(expr, "%cop%") || !isVariableChanged(expr, 0, s, t.isCPP())); } static bool nonLocal(const Variable* var, bool deref) { @@ -3223,10 +3217,7 @@ struct ExpressionAnalyzer : SingleValueFlowAnalyzer { }; struct SameExpressionAnalyzer : ExpressionAnalyzer { - - SameExpressionAnalyzer() : ExpressionAnalyzer() {} - - SameExpressionAnalyzer(const Token* e, ValueFlow::Value val, const TokenList* t, const Settings* s) + SameExpressionAnalyzer(const Token* e, ValueFlow::Value val, const TokenList& t, const Settings* s) : ExpressionAnalyzer(e, std::move(val), t, s) {} @@ -3243,9 +3234,7 @@ struct SameExpressionAnalyzer : ExpressionAnalyzer { struct OppositeExpressionAnalyzer : ExpressionAnalyzer { bool isNot; - OppositeExpressionAnalyzer() : ExpressionAnalyzer(), isNot(false) {} - - OppositeExpressionAnalyzer(bool pIsNot, const Token* e, ValueFlow::Value val, const TokenList* t, const Settings* s) + OppositeExpressionAnalyzer(bool pIsNot, const Token* e, ValueFlow::Value val, const TokenList& t, const Settings* s) : ExpressionAnalyzer(e, std::move(val), t, s), isNot(pIsNot) {} @@ -3262,9 +3251,8 @@ struct SubExpressionAnalyzer : ExpressionAnalyzer { using PartialReadContainer = std::vector>; // A shared_ptr is used so partial reads can be captured even after forking std::shared_ptr partialReads; - SubExpressionAnalyzer() : ExpressionAnalyzer(), partialReads(nullptr) {} - SubExpressionAnalyzer(const Token* e, ValueFlow::Value val, const TokenList* t, const Settings* s) + SubExpressionAnalyzer(const Token* e, ValueFlow::Value val, const TokenList& t, const Settings* s) : ExpressionAnalyzer(e, std::move(val), t, s), partialReads(std::make_shared()) {} @@ -3298,9 +3286,8 @@ struct SubExpressionAnalyzer : ExpressionAnalyzer { struct MemberExpressionAnalyzer : SubExpressionAnalyzer { std::string varname; - MemberExpressionAnalyzer() : SubExpressionAnalyzer(), varname() {} - MemberExpressionAnalyzer(std::string varname, const Token* e, ValueFlow::Value val, const TokenList* t, const Settings* s) + MemberExpressionAnalyzer(std::string varname, const Token* e, ValueFlow::Value val, const TokenList& t, const Settings* s) : SubExpressionAnalyzer(e, std::move(val), t, s), varname(std::move(varname)) {} @@ -3774,10 +3761,10 @@ bool ValueFlow::isLifetimeBorrowed(const Token *tok, const Settings *settings) return true; } -static void valueFlowLifetimeFunction(Token *tok, TokenList *tokenlist, ErrorLogger *errorLogger, const Settings *settings); +static void valueFlowLifetimeFunction(Token *tok, TokenList &tokenlist, ErrorLogger *errorLogger, const Settings *settings); static void valueFlowLifetimeConstructor(Token *tok, - TokenList *tokenlist, + TokenList &tokenlist, ErrorLogger *errorLogger, const Settings *settings); @@ -3856,7 +3843,7 @@ const Token* ValueFlow::getEndOfExprScope(const Token* tok, const Scope* default return end; } -static void valueFlowForwardLifetime(Token * tok, TokenList *tokenlist, ErrorLogger *errorLogger, const Settings *settings) +static void valueFlowForwardLifetime(Token * tok, TokenList &tokenlist, ErrorLogger *errorLogger, const Settings *settings) { // Forward lifetimes to constructed variable if (Token::Match(tok->previous(), "%var% {|(") && isVariableDecl(tok->previous())) { @@ -3911,7 +3898,7 @@ static void valueFlowForwardLifetime(Token * tok, TokenList *tokenlist, ErrorLog // TODO: handle `[` if (Token::simpleMatch(parent->astOperand1(), ".")) { const Token* parentLifetime = - getParentLifetime(tokenlist->isCPP(), parent->astOperand1()->astOperand2(), &settings->library); + getParentLifetime(tokenlist.isCPP(), parent->astOperand1()->astOperand2(), &settings->library); if (parentLifetime && parentLifetime->exprId() > 0) { valueFlowForward(const_cast(nextExpression), endOfVarScope, parentLifetime, values, tokenlist, settings); } @@ -3995,11 +3982,11 @@ struct LifetimeStore { } for (const auto& p : forwardToks) { const Context& c = p.second; - valueFlowForwardLifetime(c.tok, c.tokenlist, c.errorLogger, c.settings); + valueFlowForwardLifetime(c.tok, *c.tokenlist, c.errorLogger, c.settings); } } - static LifetimeStore fromFunctionArg(const Function * f, const Token *tok, const Variable *var, TokenList *tokenlist, const Settings* settings, ErrorLogger *errorLogger) { + static LifetimeStore fromFunctionArg(const Function * f, const Token *tok, const Variable *var, TokenList &tokenlist, const Settings* settings, ErrorLogger *errorLogger) { if (!var) return LifetimeStore{}; if (!var->isArgument()) @@ -4024,7 +4011,7 @@ struct LifetimeStore { template bool byRef(Token* tok, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings, Predicate pred, @@ -4065,7 +4052,7 @@ struct LifetimeStore { } bool byRef(Token* tok, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings, SourceLocation loc = SourceLocation::current()) const @@ -4083,7 +4070,7 @@ struct LifetimeStore { template bool byVal(Token* tok, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings, Predicate pred, @@ -4160,7 +4147,7 @@ struct LifetimeStore { } bool byVal(Token* tok, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings, SourceLocation loc = SourceLocation::current()) const @@ -4178,7 +4165,7 @@ struct LifetimeStore { template bool byDerefCopy(Token* tok, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings, Predicate pred, @@ -4214,7 +4201,7 @@ struct LifetimeStore { } bool byDerefCopy(Token* tok, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings, SourceLocation loc = SourceLocation::current()) const @@ -4232,10 +4219,10 @@ struct LifetimeStore { private: Context* mContext; - void forwardLifetime(Token* tok, TokenList* tokenlist, ErrorLogger* errorLogger, const Settings* settings) const { + void forwardLifetime(Token* tok, TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings) const { if (mContext) { mContext->tok = tok; - mContext->tokenlist = tokenlist; + mContext->tokenlist = &tokenlist; mContext->errorLogger = errorLogger; mContext->settings = settings; } @@ -4272,7 +4259,7 @@ static void valueFlowLifetimeUserConstructor(Token* tok, const Function* constructor, const std::string& name, std::vector args, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings) { @@ -4356,7 +4343,7 @@ static void valueFlowLifetimeUserConstructor(Token* tok, } } -static void valueFlowLifetimeFunction(Token *tok, TokenList *tokenlist, ErrorLogger *errorLogger, const Settings *settings) +static void valueFlowLifetimeFunction(Token *tok, TokenList &tokenlist, ErrorLogger *errorLogger, const Settings *settings) { if (!Token::Match(tok, "%name% (")) return; @@ -4427,7 +4414,7 @@ static void valueFlowLifetimeFunction(Token *tok, TokenList *tokenlist, ErrorLog if (returnTok == tok) continue; const Variable *returnVar = ValueFlow::getLifetimeVariable(returnTok); - if (returnVar && returnVar->isArgument() && (returnVar->isConst() || !isVariableChanged(returnVar, settings, tokenlist->isCPP()))) { + if (returnVar && returnVar->isArgument() && (returnVar->isConst() || !isVariableChanged(returnVar, settings, tokenlist.isCPP()))) { LifetimeStore ls = LifetimeStore::fromFunctionArg(f, tok, returnVar, tokenlist, settings, errorLogger); ls.inconclusive = inconclusive; ls.forward = false; @@ -4547,7 +4534,7 @@ static const Function* findConstructor(const Scope* scope, const Token* tok, con static void valueFlowLifetimeClassConstructor(Token* tok, const Type* t, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings) { @@ -4606,7 +4593,7 @@ static void valueFlowLifetimeClassConstructor(Token* tok, } } -static void valueFlowLifetimeConstructor(Token* tok, TokenList* tokenlist, ErrorLogger* errorLogger, const Settings* settings) +static void valueFlowLifetimeConstructor(Token* tok, TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings) { if (!Token::Match(tok, "(|{")) return; @@ -4758,9 +4745,9 @@ static bool isContainerOfPointers(const Token* tok, const Settings* settings) return vt.pointer > 0; } -static void valueFlowLifetime(TokenList *tokenlist, SymbolDatabase* /*db*/, ErrorLogger *errorLogger, const Settings *settings) +static void valueFlowLifetime(TokenList &tokenlist, SymbolDatabase* /*db*/, ErrorLogger *errorLogger, const Settings *settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (!tok->scope()) continue; if (tok->scope()->type == Scope::eGlobal) @@ -5089,9 +5076,9 @@ static const Token * findEndOfFunctionCallForParameter(const Token * parameterTo return nextAfterAstRightmostLeaf(parent); } -static void valueFlowAfterMove(TokenList* tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) +static void valueFlowAfterMove(TokenList& tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) { - if (!tokenlist->isCPP() || settings->standards.cpp < Standards::CPP11) + if (!tokenlist.isCPP() || settings->standards.cpp < Standards::CPP11) return; for (const Scope * scope : symboldatabase->functionScopes) { if (!scope) @@ -5228,7 +5215,7 @@ static const Scope* getLoopScope(const Token* tok) } // -static void valueFlowConditionExpressions(TokenList *tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings &settings) +static void valueFlowConditionExpressions(TokenList &tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings &settings) { for (const Scope * scope : symboldatabase->functionScopes) { if (const Token* incompleteTok = findIncompleteVar(scope->bodyStart, scope->bodyEnd)) { @@ -5251,7 +5238,7 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, const SymbolData continue; if (condTok->hasKnownIntValue()) continue; - if (!isConstExpression(condTok, settings.library, tokenlist->isCPP())) + if (!isConstExpression(condTok, settings.library, tokenlist.isCPP())) continue; const bool is1 = (condTok->isComparisonOp() || condTok->tokType() == Token::eLogicalOp || astIsBool(condTok)); @@ -5287,7 +5274,7 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, const SymbolData } // Check if the block terminates early - if (isEscapeScope(blockTok, tokenlist, &settings)) { + if (isEscapeScope(blockTok, &settings)) { const Scope* scope2 = scope; // If escaping a loop then only use the loop scope if (isBreakOrContinueScope(blockTok->link())) { @@ -5358,7 +5345,7 @@ static std::set getVarIds(const Token* tok) return result; } -static void valueFlowSymbolic(const TokenList* tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) +static void valueFlowSymbolic(const TokenList& tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) { for (const Scope* scope : symboldatabase->functionScopes) { for (Token* tok = const_cast(scope->bodyStart); tok != scope->bodyEnd; tok = tok->next()) { @@ -5378,7 +5365,7 @@ static void valueFlowSymbolic(const TokenList* tokenlist, const SymbolDatabase* continue; if (tok->astOperand2()->exprId() == 0) continue; - if (!isConstExpression(tok->astOperand2(), settings->library, tokenlist->isCPP())) + if (!isConstExpression(tok->astOperand2(), settings->library, tokenlist.isCPP())) continue; if (tok->astOperand1()->valueType() && tok->astOperand2()->valueType()) { if (isTruncated( @@ -5669,7 +5656,7 @@ static void valueFlowForwardAssign(Token* const tok, std::vector vars, std::list values, const bool init, - TokenList* const tokenlist, + TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings* const settings) { @@ -5701,7 +5688,7 @@ static void valueFlowForwardAssign(Token* const tok, } } - if (tokenlist->isCPP() && vars.size() == 1 && Token::Match(vars.front()->typeStartToken(), "bool|_Bool")) { + if (tokenlist.isCPP() && vars.size() == 1 && Token::Match(vars.front()->typeStartToken(), "bool|_Bool")) { for (ValueFlow::Value& value : values) { if (value.isImpossible()) continue; @@ -5761,7 +5748,7 @@ static void valueFlowForwardAssign(Token* const tok, const std::list& values, const bool /*unused*/, const bool init, - TokenList* const tokenlist, + TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings* const settings) { @@ -5841,7 +5828,7 @@ static bool intersects(const C1& c1, const C2& c2) return false; } -static void valueFlowAfterAssign(TokenList *tokenlist, +static void valueFlowAfterAssign(TokenList &tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings *settings, @@ -5978,7 +5965,7 @@ static std::vector getVariables(const Token* tok) return result; } -static void valueFlowAfterSwap(TokenList* tokenlist, +static void valueFlowAfterSwap(TokenList& tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings* settings) @@ -6124,7 +6111,7 @@ struct ConditionHandler { const Token* stop, const Token* exprTok, const std::list& values, - TokenList* tokenlist, + TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) const { @@ -6134,7 +6121,7 @@ struct ConditionHandler { virtual Analyzer::Result forward(Token* top, const Token* exprTok, const std::list& values, - TokenList* tokenlist, + TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) const { @@ -6145,14 +6132,14 @@ struct ConditionHandler { const Token* endToken, const Token* exprTok, const std::list& values, - TokenList* tokenlist, + TokenList& tokenlist, const Settings* settings, SourceLocation loc = SourceLocation::current()) const { return valueFlowReverse(start, endToken, exprTok, values, tokenlist, settings, loc); } - void traverseCondition(const TokenList* tokenlist, + void traverseCondition(const TokenList& tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings, const std::set& skippedFunctions, @@ -6182,7 +6169,7 @@ struct ConditionHandler { continue; if (cond.true_values.empty() || cond.false_values.empty()) continue; - if (!isConstExpression(cond.vartok, settings->library, tokenlist->isCPP())) + if (!isConstExpression(cond.vartok, settings->library, tokenlist.isCPP())) continue; f(cond, tok, scope); } @@ -6190,7 +6177,7 @@ struct ConditionHandler { } } - void beforeCondition(TokenList* tokenlist, + void beforeCondition(TokenList& tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings* settings, @@ -6253,7 +6240,7 @@ struct ConditionHandler { if (Token::simpleMatch(top->previous(), "for (")) { if (top->astOperand2() && top->astOperand2()->astOperand2() && isExpressionChanged( - cond.vartok, top->astOperand2()->astOperand2(), top->link(), settings, tokenlist->isCPP())) { + cond.vartok, top->astOperand2()->astOperand2(), top->link(), settings, tokenlist.isCPP())) { if (settings->debugwarnings) bailout(tokenlist, errorLogger, @@ -6268,7 +6255,7 @@ struct ConditionHandler { const Token* const block = top->link()->next(); const Token* const end = block->link(); - if (isExpressionChanged(cond.vartok, start, end, settings, tokenlist->isCPP())) { + if (isExpressionChanged(cond.vartok, start, end, settings, tokenlist.isCPP())) { // If its reassigned in loop then analyze from the end if (!Token::Match(tok, "%assign%|++|--") && findExpression(cond.vartok->exprId(), start, end, [&](const Token* tok2) { @@ -6338,7 +6325,7 @@ struct ConditionHandler { }); } - void afterCondition(TokenList* tokenlist, + void afterCondition(TokenList& tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings* settings, @@ -6495,7 +6482,7 @@ struct ConditionHandler { cond.vartok->varId(), cond.vartok->variable()->isGlobal(), settings, - tokenlist->isCPP())) + tokenlist.isCPP())) return; // Check if condition in for loop is always false const Token* initTok = getInitTok(top); @@ -6671,7 +6658,7 @@ protected: }; static void valueFlowCondition(const ValuePtr& handler, - TokenList* tokenlist, + TokenList& tokenlist, SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings* settings, @@ -6804,10 +6791,10 @@ static bool isIntegralOrPointer(const Token* tok) return false; } -static void valueFlowInferCondition(TokenList* tokenlist, +static void valueFlowInferCondition(TokenList& tokenlist, const Settings* settings) { - for (Token* tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token* tok = tokenlist.front(); tok; tok = tok->next()) { if (!tok->astParent()) continue; if (tok->hasKnownIntValue()) @@ -6967,7 +6954,7 @@ static void valueFlowForLoopSimplify(Token* const bodyStart, const Token* expr, bool globalvar, const MathLib::bigint value, - TokenList* tokenlist, + TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings) { @@ -6976,7 +6963,7 @@ static void valueFlowForLoopSimplify(Token* const bodyStart, const Token * const bodyEnd = bodyStart->link(); // Is variable modified inside for loop - if (isVariableChanged(bodyStart, bodyEnd, expr->varId(), globalvar, settings, tokenlist->isCPP())) + if (isVariableChanged(bodyStart, bodyEnd, expr->varId(), globalvar, settings, tokenlist.isCPP())) return; for (Token *tok2 = bodyStart->next(); tok2 != bodyEnd; tok2 = tok2->next()) { @@ -7067,7 +7054,7 @@ static void valueFlowForLoopSimplify(Token* const bodyStart, } } -static void valueFlowForLoopSimplifyAfter(Token* fortok, nonneg int varid, const MathLib::bigint num, const TokenList* tokenlist, const Settings* settings) +static void valueFlowForLoopSimplifyAfter(Token* fortok, nonneg int varid, const MathLib::bigint num, const TokenList& tokenlist, const Settings* settings) { const Token *vartok = nullptr; for (const Token *tok = fortok; tok; tok = tok->next()) { @@ -7095,7 +7082,7 @@ static void valueFlowForLoopSimplifyAfter(Token* fortok, nonneg int varid, const } } -static void valueFlowForLoop(TokenList *tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings *settings) +static void valueFlowForLoop(TokenList &tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings *settings) { for (const Scope &scope : symboldatabase->scopeList) { if (scope.type != Scope::eFor) @@ -7173,9 +7160,7 @@ struct MultiValueFlowAnalyzer : ValueFlowAnalyzer { std::unordered_map vars; SymbolDatabase* symboldatabase; - MultiValueFlowAnalyzer() : ValueFlowAnalyzer(), values(), vars(), symboldatabase(nullptr) {} - - MultiValueFlowAnalyzer(const std::unordered_map& args, const TokenList* t, const Settings* set, SymbolDatabase* s) + MultiValueFlowAnalyzer(const std::unordered_map& args, const TokenList& t, const Settings* set, SymbolDatabase* s) : ValueFlowAnalyzer(t, set), values(), vars(), symboldatabase(s) { for (const auto& p:args) { values[p.first->declarationId()] = p.second; @@ -7371,7 +7356,7 @@ bool productParams(const Settings* settings, const std::unordered_mapscopeList) { if (scope.type != Scope::ScopeType::eSwitch) @@ -7550,7 +7535,7 @@ IteratorRange MakeIteratorRange(Iterator start, Iterator last) return {start, last}; } -static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings& settings) +static void valueFlowSubFunction(TokenList& tokenlist, SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings& settings) { int id = 0; for (const Scope* scope : MakeIteratorRange(symboldatabase->functionScopes.crbegin(), symboldatabase->functionScopes.crend())) { @@ -7596,7 +7581,7 @@ static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldat }); // Remove uninit values if argument is passed by value if (argtok->variable() && !argtok->variable()->isPointer() && argvalues.size() == 1 && argvalues.front().isUninitValue()) { - if (CheckUninitVar::isVariableUsage(tokenlist->isCPP(), argtok, settings.library, false, CheckUninitVar::Alloc::NO_ALLOC, 0)) + if (CheckUninitVar::isVariableUsage(tokenlist.isCPP(), argtok, settings.library, false, CheckUninitVar::Alloc::NO_ALLOC, 0)) continue; } @@ -7632,9 +7617,9 @@ static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldat } } -static void valueFlowFunctionDefaultParameter(const TokenList* tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) +static void valueFlowFunctionDefaultParameter(const TokenList& tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) { - if (!tokenlist->isCPP()) + if (!tokenlist.isCPP()) return; for (const Scope* scope : symboldatabase->functionScopes) { @@ -7701,9 +7686,9 @@ static void setFunctionReturnValue(const Function* f, Token* tok, ValueFlow::Val setTokenValue(tok, std::move(v), settings); } -static void valueFlowFunctionReturn(TokenList *tokenlist, ErrorLogger *errorLogger, const Settings* settings) +static void valueFlowFunctionReturn(TokenList &tokenlist, ErrorLogger *errorLogger, const Settings* settings) { - for (Token *tok = tokenlist->back(); tok; tok = tok->previous()) { + for (Token *tok = tokenlist.back(); tok; tok = tok->previous()) { if (tok->str() != "(" || !tok->astOperand1()) continue; @@ -7962,9 +7947,9 @@ static Token* findStartToken(const Variable* var, Token* start, const Library* l return tok; } -static void valueFlowUninit(TokenList* tokenlist, SymbolDatabase* /*symbolDatabase*/, const Settings* settings) +static void valueFlowUninit(TokenList& tokenlist, SymbolDatabase* /*symbolDatabase*/, const Settings* settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (!tok->scope()->isExecutable()) continue; if (!Token::Match(tok, "%var% ;|[")) @@ -7974,7 +7959,7 @@ static void valueFlowUninit(TokenList* tokenlist, SymbolDatabase* /*symbolDataba continue; if (var->nameToken() != tok || var->isInit()) continue; - if (!needsInitialization(var, tokenlist->isCPP())) + if (!needsInitialization(var, tokenlist.isCPP())) continue; if (!var->isLocal() || var->isStatic() || var->isExtern() || var->isReference() || var->isThrow()) continue; @@ -8000,7 +7985,7 @@ static void valueFlowUninit(TokenList* tokenlist, SymbolDatabase* /*symbolDataba // Skip array since we can't track partial initialization from nested subexpressions if (memVar.isArray()) continue; - if (!needsInitialization(&memVar, tokenlist->isCPP())) { + if (!needsInitialization(&memVar, tokenlist.isCPP())) { partial = true; continue; } @@ -8106,9 +8091,7 @@ static bool isContainerSizeChangedByFunction(const Token* tok, } struct ContainerExpressionAnalyzer : ExpressionAnalyzer { - ContainerExpressionAnalyzer() : ExpressionAnalyzer() {} - - ContainerExpressionAnalyzer(const Token* expr, ValueFlow::Value val, const TokenList* t, const Settings* s) + ContainerExpressionAnalyzer(const Token* expr, ValueFlow::Value val, const TokenList& t, const Settings* s) : ExpressionAnalyzer(expr, std::move(val), t, s) {} @@ -8293,7 +8276,7 @@ static const Token* solveExprValue(const Token* expr, ValueFlow::Value& value) value); } -ValuePtr makeAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList* tokenlist, const Settings* settings) +ValuePtr makeAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList& tokenlist, const Settings* settings) { if (value.isContainerSizeValue()) return ContainerExpressionAnalyzer(exprTok, std::move(value), tokenlist, settings); @@ -8301,7 +8284,7 @@ ValuePtr makeAnalyzer(const Token* exprTok, ValueFlow::Value value, co return ExpressionAnalyzer(expr, std::move(value), tokenlist, settings); } -ValuePtr makeReverseAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList* tokenlist, const Settings* settings) +ValuePtr makeReverseAnalyzer(const Token* exprTok, ValueFlow::Value value, const TokenList& tokenlist, const Settings* settings) { if (value.isContainerSizeValue()) return ContainerExpressionAnalyzer(exprTok, std::move(value), tokenlist, settings); @@ -8360,9 +8343,9 @@ static bool isContainerSizeChanged(nonneg int varId, return false; } -static void valueFlowSmartPointer(TokenList *tokenlist, ErrorLogger * errorLogger, const Settings *settings) +static void valueFlowSmartPointer(TokenList &tokenlist, ErrorLogger * errorLogger, const Settings *settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (!tok->scope()) continue; if (!tok->scope()->isExecutable()) @@ -8448,9 +8431,9 @@ static Library::Container::Yield findIteratorYield(Token* tok, const Token** fto return astFunctionYield(tok->astParent()->previous(), settings, ftok); } -static void valueFlowIterators(TokenList *tokenlist, const Settings *settings) +static void valueFlowIterators(TokenList &tokenlist, const Settings *settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (!tok->scope()) continue; if (!tok->scope()->isExecutable()) @@ -8512,9 +8495,9 @@ struct IteratorConditionHandler : SimpleConditionHandler { } }; -static void valueFlowIteratorInfer(TokenList *tokenlist, const Settings *settings) +static void valueFlowIteratorInfer(TokenList &tokenlist, const Settings *settings) { - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (!tok->scope()) continue; if (!tok->scope()->isExecutable()) @@ -8673,7 +8656,7 @@ static std::vector getContainerSizeFromConstructor(const Token return getContainerSizeFromConstructorArgs(args, valueType->container, known); } -static void valueFlowContainerSetTokValue(TokenList* tokenlist, const Settings* settings, const Token* tok, Token* initList) +static void valueFlowContainerSetTokValue(TokenList& tokenlist, const Settings* settings, const Token* tok, Token* initList) { ValueFlow::Value value; value.valueType = ValueFlow::Value::ValueType::TOK; @@ -8693,7 +8676,7 @@ static const Scope* getFunctionScope(const Scope* scope) { return scope; } -static void valueFlowContainerSize(TokenList* tokenlist, +static void valueFlowContainerSize(TokenList& tokenlist, const SymbolDatabase* symboldatabase, ErrorLogger* /*errorLogger*/, const Settings* settings, @@ -8908,7 +8891,7 @@ struct ContainerConditionHandler : ConditionHandler { } }; -static void valueFlowDynamicBufferSize(const TokenList* tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) +static void valueFlowDynamicBufferSize(const TokenList& tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) { auto getBufferSizeFromAllocFunc = [&](const Token* funcTok) -> MathLib::bigint { MathLib::bigint sizeValue = -1; @@ -9077,7 +9060,7 @@ static bool getMinMaxValues(const std::string &typestr, const Settings *settings return getMinMaxValues(&vt, settings->platform, minvalue, maxvalue); } -static void valueFlowSafeFunctions(TokenList* tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) +static void valueFlowSafeFunctions(TokenList& tokenlist, const SymbolDatabase* symboldatabase, const Settings* settings) { for (const Scope *functionScope : symboldatabase->functionScopes) { if (!functionScope->bodyStart) @@ -9173,11 +9156,11 @@ static void valueFlowSafeFunctions(TokenList* tokenlist, const SymbolDatabase* s } } -static void valueFlowUnknownFunctionReturn(TokenList *tokenlist, const Settings *settings) +static void valueFlowUnknownFunctionReturn(TokenList &tokenlist, const Settings *settings) { if (settings->checkUnknownFunctionReturn.empty()) return; - for (Token *tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { if (!tok->astParent() || tok->str() != "(" || !tok->previous()->isName()) continue; if (settings->checkUnknownFunctionReturn.find(tok->previous()->str()) == settings->checkUnknownFunctionReturn.end()) @@ -9202,11 +9185,11 @@ static void valueFlowUnknownFunctionReturn(TokenList *tokenlist, const Settings } } -static void valueFlowDebug(TokenList* tokenlist, ErrorLogger* errorLogger, const Settings* settings) +static void valueFlowDebug(TokenList& tokenlist, ErrorLogger* errorLogger, const Settings* settings) { if (!settings->debugnormal && !settings->debugwarnings) return; - for (Token* tok = tokenlist->front(); tok; tok = tok->next()) { + for (Token* tok = tokenlist.front(); tok; tok = tok->next()) { if (tok->getTokenDebug() != TokenDebug::ValueFlow) continue; if (tok->astParent() && tok->astParent()->getTokenDebug() == TokenDebug::ValueFlow) @@ -9216,7 +9199,7 @@ static void valueFlowDebug(TokenList* tokenlist, ErrorLogger* errorLogger, const ErrorPath errorPath = v.errorPath; errorPath.insert(errorPath.end(), v.debugPath.cbegin(), v.debugPath.cend()); errorPath.emplace_back(tok, ""); - errorLogger->reportErr({errorPath, tokenlist, Severity::debug, "valueFlow", msg, CWE{0}, Certainty::normal}); + errorLogger->reportErr({errorPath, &tokenlist, Severity::debug, "valueFlow", msg, CWE{0}, Certainty::normal}); } } } @@ -9232,14 +9215,14 @@ const ValueFlow::Value *ValueFlow::valueFlowConstantFoldAST(Token *expr, const S } struct ValueFlowState { - explicit ValueFlowState(TokenList* tokenlist = nullptr, + explicit ValueFlowState(TokenList& tokenlist, SymbolDatabase* symboldatabase = nullptr, ErrorLogger* errorLogger = nullptr, const Settings* settings = nullptr) : tokenlist(tokenlist), symboldatabase(symboldatabase), errorLogger(errorLogger), settings(settings) {} - TokenList* tokenlist = nullptr; + TokenList& tokenlist; SymbolDatabase* symboldatabase = nullptr; ErrorLogger* errorLogger = nullptr; const Settings* settings = nullptr; @@ -9290,7 +9273,7 @@ struct ValueFlowPassRunner { if (state.settings->debugwarnings) { if (n == 0 && values != getTotalValues()) { ErrorMessage::FileLocation loc; - loc.setfile(state.tokenlist->getFiles()[0]); + loc.setfile(state.tokenlist.getFiles()[0]); ErrorMessage errmsg({std::move(loc)}, emptyString, Severity::debug, @@ -9308,7 +9291,7 @@ struct ValueFlowPassRunner { auto start = Clock::now(); if (start > stop) return true; - if (!state.tokenlist->isCPP() && pass->cpp()) + if (!state.tokenlist.isCPP() && pass->cpp()) return false; if (timerResults) { Timer t(pass->name(), state.settings->showtime, timerResults); @@ -9322,7 +9305,7 @@ struct ValueFlowPassRunner { std::size_t getTotalValues() const { std::size_t n = 1; - for (Token* tok = state.tokenlist->front(); tok; tok = tok->next()) + for (Token* tok = state.tokenlist.front(); tok; tok = tok->next()) n += tok->values().size(); return n; } @@ -9349,9 +9332,9 @@ struct ValueFlowPassRunner { const std::string& functionName = functionScope->className; const std::list callstack( 1, - ErrorMessage::FileLocation(functionScope->bodyStart, state.tokenlist)); + ErrorMessage::FileLocation(functionScope->bodyStart, &state.tokenlist)); const ErrorMessage errmsg(callstack, - state.tokenlist->getSourceFilePath(), + state.tokenlist.getSourceFilePath(), Severity::information, "ValueFlow analysis is limited in " + functionName + ". Use --check-level=exhaustive if full analysis is wanted.", @@ -9402,7 +9385,7 @@ ValueFlowPassAdaptor makeValueFlowPassAdaptor(const char* name, bool cpp, F r #define VALUEFLOW_ADAPTOR(cpp, ...) \ makeValueFlowPassAdaptor(#__VA_ARGS__, \ cpp, \ - [](TokenList* tokenlist, \ + [](TokenList& tokenlist, \ SymbolDatabase* symboldatabase, \ ErrorLogger* errorLogger, \ const Settings* settings, \ @@ -9418,13 +9401,13 @@ ValueFlowPassAdaptor makeValueFlowPassAdaptor(const char* name, bool cpp, F r #define VFA(...) VALUEFLOW_ADAPTOR(false, __VA_ARGS__) #define VFA_CPP(...) VALUEFLOW_ADAPTOR(true, __VA_ARGS__) -void ValueFlow::setValues(TokenList* tokenlist, +void ValueFlow::setValues(TokenList& tokenlist, SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings* settings, TimerResultsIntf* timerResults) { - for (Token* tok = tokenlist->front(); tok; tok = tok->next()) + for (Token* tok = tokenlist.front(); tok; tok = tok->next()) tok->clearValueFlow(); ValueFlowPassRunner runner{ValueFlowState{tokenlist, symboldatabase, errorLogger, settings}, timerResults}; diff --git a/lib/valueflow.h b/lib/valueflow.h index c7298bb31..d54de1e20 100644 --- a/lib/valueflow.h +++ b/lib/valueflow.h @@ -51,7 +51,7 @@ namespace ValueFlow { const Value * valueFlowConstantFoldAST(Token *expr, const Settings *settings); /// Perform valueflow analysis. - void setValues(TokenList* tokenlist, + void setValues(TokenList& tokenlist, SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings* settings,