From e5d0ffdbe721a198c49a874b2dcfd5e950c2f817 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Thu, 17 Sep 2020 01:33:52 -0500 Subject: [PATCH] Fix issue 9900: False positive: Returning lambda that captures local variable 'x' that will be invalid when returning. (#2809) --- lib/valueflow.cpp | 2 ++ test/testautovariables.cpp | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index c14ade831..9b5e56de4 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3845,6 +3845,8 @@ static void valueFlowLifetime(TokenList *tokenlist, SymbolDatabase*, ErrorLogger } for (const Token * tok2 = lam.bodyTok; tok2 != lam.bodyTok->link(); tok2 = tok2->next()) { + if (!tok2->variable()) + continue; captureVariable(tok2, lam.implicitCapture, isImplicitCapturingVariable); } diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 9d69c032e..fd4113554 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -1914,6 +1914,15 @@ private: " return [=, &i] { return j; };\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + check("void f(int*);\n" + "auto g(int y) {\n" + " int x = y;\n" + " return [=] {\n" + " g(&x);\n" + " };\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void danglingLifetimeContainer() {