From d0d49046f4b9c64ae9b5ebd3d1595ad3865939ad Mon Sep 17 00:00:00 2001 From: firewave Date: Sat, 9 Mar 2024 23:53:32 +0100 Subject: [PATCH] valueflow.cpp: removed need for `LifetimeStore::Context` --- lib/valueflow.cpp | 65 +++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index af9ee1ec081e..b866c3021ca3 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -4055,13 +4055,6 @@ struct LifetimeStore { bool inconclusive{}; bool forward = true; - struct Context { - Token* tok{}; - TokenList* tokenlist{}; - ErrorLogger* errorLogger{}; - const Settings* settings{}; - }; - LifetimeStore() = default; LifetimeStore(const Token* argtok, @@ -4075,23 +4068,23 @@ struct LifetimeStore { {} template - static void forEach(const std::vector& argtoks, + static void forEach(TokenList& tokenlist, + ErrorLogger& errorLogger, + const Settings& settings, + const std::vector& argtoks, const std::string& message, ValueFlow::Value::LifetimeKind type, F f) { - std::map forwardToks; + std::set forwardToks; for (const Token* arg : argtoks) { LifetimeStore ls{arg, message, type}; - Context c{}; - ls.mContext = &c; ls.forward = false; f(ls); - if (c.tok) - forwardToks[c.tok] = c; + if (ls.forwardTok) + forwardToks.emplace(ls.forwardTok); } - for (const auto& p : forwardToks) { - const Context& c = p.second; - valueFlowForwardLifetime(c.tok, *c.tokenlist, *c.errorLogger, *c.settings); + for (auto* tok : forwardToks) { + valueFlowForwardLifetime(tok, tokenlist, errorLogger, settings); } } @@ -4327,14 +4320,9 @@ struct LifetimeStore { } private: - Context* mContext{}; + mutable Token* forwardTok{}; void forwardLifetime(Token* tok, TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings) const { - if (mContext) { - mContext->tok = tok; - mContext->tokenlist = &tokenlist; - mContext->errorLogger = &errorLogger; - mContext->settings = &settings; - } + forwardTok = tok; valueFlowForwardLifetime(tok, tokenlist, errorLogger, settings); } }; @@ -4428,7 +4416,10 @@ static void valueFlowLifetimeUserConstructor(Token* tok, } } // TODO: Use SubExpressionAnalyzer for members - LifetimeStore::forEach(args, + LifetimeStore::forEach(tokenlist, + errorLogger, + settings, + args, "Passed to constructor of '" + name + "'.", ValueFlow::Value::LifetimeKind::SubObject, [&](const LifetimeStore& ls) { @@ -4442,7 +4433,10 @@ static void valueFlowLifetimeUserConstructor(Token* tok, ls.byVal(tok, tokenlist, errorLogger, settings); }); } else if (hasBorrowingVariables(constructor->nestedIn->varlist, args)) { - LifetimeStore::forEach(args, + LifetimeStore::forEach(tokenlist, + errorLogger, + settings, + args, "Passed to constructor of '" + name + "'.", ValueFlow::Value::LifetimeKind::SubObject, [&](LifetimeStore& ls) { @@ -4663,7 +4657,10 @@ static void valueFlowLifetimeClassConstructor(Token* tok, // If the type is unknown then assume it captures by value in the // constructor, but make each lifetime inconclusive std::vector args = getArguments(tok); - LifetimeStore::forEach(args, + LifetimeStore::forEach(tokenlist, + errorLogger, + settings, + args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, [&](LifetimeStore& ls) { @@ -4681,6 +4678,9 @@ static void valueFlowLifetimeClassConstructor(Token* tok, if (scope->numConstructors == 0) { auto it = scope->varlist.cbegin(); LifetimeStore::forEach( + tokenlist, + errorLogger, + settings, args, "Passed to constructor of '" + t->name() + "'.", ValueFlow::Value::LifetimeKind::SubObject, @@ -4725,7 +4725,10 @@ static void valueFlowLifetimeConstructor(Token* tok, TokenList& tokenlist, Error for (const ValueType& vt : vts) { if (vt.pointer > 0) { std::vector args = getArguments(tok); - LifetimeStore::forEach(args, + LifetimeStore::forEach(tokenlist, + errorLogger, + settings, + args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, [&](const LifetimeStore& ls) { @@ -4738,6 +4741,9 @@ static void valueFlowLifetimeConstructor(Token* tok, TokenList& tokenlist, Error .byRef(tok, tokenlist, errorLogger, settings); } else if (args.size() == 2 && astIsIterator(args[0]) && astIsIterator(args[1])) { LifetimeStore::forEach( + tokenlist, + errorLogger, + settings, args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, @@ -4745,7 +4751,10 @@ static void valueFlowLifetimeConstructor(Token* tok, TokenList& tokenlist, Error ls.byDerefCopy(tok, tokenlist, errorLogger, settings); }); } else if (vt.container->hasInitializerListConstructor) { - LifetimeStore::forEach(args, + LifetimeStore::forEach(tokenlist, + errorLogger, + settings, + args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, [&](const LifetimeStore& ls) {