diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 2c1476c1836..e5f109d5cd1 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1671,6 +1671,8 @@ void CheckUninitVar::valueFlowUninit() const bool isleaf = isLeafDot(tok) || uninitderef; if (!isleaf && Token::Match(tok->astParent(), ". %name%") && (tok->astParent()->next()->varId() || tok->astParent()->next()->isEnumerator())) continue; + if (isWithinScope(tok, tok->variable(), Scope::ScopeType::eLambda)) + continue; } const ExprUsage usage = getExprUsage(tok, v->indirect, *mSettings); if (usage == ExprUsage::NotUsed || usage == ExprUsage::Inconclusive) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index e19ea083fbc..6f66cd7c52a 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -63,6 +63,7 @@ class TestUninitVar : public TestFixture { TEST_CASE(valueFlowUninit2_value); TEST_CASE(valueFlowUninit_uninitvar2); TEST_CASE(valueFlowUninit_functioncall); + TEST_CASE(valueFlowUninit_lambda); // #12944 TEST_CASE(uninitStructMember); // struct members TEST_CASE(uninitvar2_while); TEST_CASE(uninitvar2_4494); // #4494 @@ -4389,6 +4390,17 @@ class TestUninitVar : public TestFixture { ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:4]: (warning) Uninitialized variable: i\n", errout_str()); } + void valueFlowUninit_lambda() { // #12944 + valueFlowUninit( "void Fun()\n" + "{\n" + " int var;\n" + " auto lam = [&]() { int x = var; };\n" + " var = 5;\n" + " lam();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void uninitStructMember() { // struct members checkUninitVar("struct AB { int a; int b; };\n" "void f(void) {\n"