From 233eb5cbcf5e6b6454cbf212b54d7f6a65a8c685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 30 Oct 2024 11:28:24 +0100 Subject: [PATCH 1/3] fix #12944 --- lib/checkuninitvar.cpp | 2 ++ test/testuninitvar.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) 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..a41a34fc6c9 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -53,6 +53,7 @@ class TestUninitVar : public TestFixture { TEST_CASE(func_uninit_pointer); // analyse function calls for: 'void a(int *p) { *p = 0; }' TEST_CASE(uninitvar_typeof); // typeof TEST_CASE(uninitvar_ignore); // ignore cast, *&x, .. + TEST_CASE(uninitvar_lambda); // #12944 TEST_CASE(uninitvar2); TEST_CASE(uninitvar3); // #3844 TEST_CASE(uninitvar4); // #3869 (reference) @@ -2514,6 +2515,17 @@ class TestUninitVar : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: i\n", errout_str()); } + void uninitvar_lambda() { // #12944 + checkUninitVar( "void Fun()\n" + "{\n" + " int var;\n" + " auto lam = [&]() { int x = var; };\n" + " var = 5;\n" + " lam();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void uninitvar2() { // using uninit var checkUninitVar("void f() {\n" From ed6f54bcdd8ebc9eb5a8fcb069966162a83ac952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 30 Oct 2024 12:18:03 +0100 Subject: [PATCH 2/3] move test --- test/testuninitvar.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index a41a34fc6c9..60f146ec7c0 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -53,7 +53,6 @@ class TestUninitVar : public TestFixture { TEST_CASE(func_uninit_pointer); // analyse function calls for: 'void a(int *p) { *p = 0; }' TEST_CASE(uninitvar_typeof); // typeof TEST_CASE(uninitvar_ignore); // ignore cast, *&x, .. - TEST_CASE(uninitvar_lambda); // #12944 TEST_CASE(uninitvar2); TEST_CASE(uninitvar3); // #3844 TEST_CASE(uninitvar4); // #3869 (reference) @@ -64,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 @@ -2515,16 +2515,6 @@ class TestUninitVar : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: i\n", errout_str()); } - void uninitvar_lambda() { // #12944 - checkUninitVar( "void Fun()\n" - "{\n" - " int var;\n" - " auto lam = [&]() { int x = var; };\n" - " var = 5;\n" - " lam();\n" - "}\n"); - ASSERT_EQUALS("", errout_str()); - } void uninitvar2() { // using uninit var @@ -4401,6 +4391,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" From 0cc4aaa4f68f701b45e40879923723505da8659d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 30 Oct 2024 12:23:57 +0100 Subject: [PATCH 3/3] remove empty line --- test/testuninitvar.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 60f146ec7c0..6f66cd7c52a 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2515,7 +2515,6 @@ class TestUninitVar : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: i\n", errout_str()); } - void uninitvar2() { // using uninit var checkUninitVar("void f() {\n"