From 02eaf6fa93530af3e2f9dd94a36820a9781767d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 19 Dec 2019 20:18:25 +0100 Subject: [PATCH] Fixed #8998 (False positive uninitStructMember related to reference to member) --- lib/checkuninitvar.cpp | 5 ++++- test/testuninitvar.cpp | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 023cf28b6..644836cad 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -753,7 +753,10 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var return true; } - else if (Token::Match(tok->previous(), "[(,] %name% [,)]")) + if (Token::Match(tok->previous(), "[(,] %name% [,)]")) + return true; + + if (Token::Match(tok->previous(), "= %var% . %var% ;") && membervar == tok->strAt(2)) return true; } else { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 1952a7b6e..74cef3a6a 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -63,7 +63,7 @@ private: TEST_CASE(uninitvar5); // #3861 TEST_CASE(uninitvar2_func); // function calls TEST_CASE(uninitvar2_value); // value flow - TEST_CASE(uninitvar2_structmembers); // struct members + TEST_CASE(uninitStructMember); // struct members TEST_CASE(uninitvar2_while); TEST_CASE(uninitvar2_4494); // #4494 TEST_CASE(uninitvar2_malloc); // malloc returns uninitialized data @@ -3084,7 +3084,7 @@ private: TODO_ASSERT_EQUALS("error", "", errout.str()); } - void uninitvar2_structmembers() { // struct members + void uninitStructMember() { // struct members checkUninitVar("struct AB { int a; int b; };\n" "void f(void) {\n" " struct AB ab;\n" @@ -3531,6 +3531,16 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + // Reference + checkUninitVar("struct A { int x; };\n" + "void foo() {\n" + " struct A a;\n" + " int& x = a.x;\n" + " x = 0;\n" + " return a.x;\n" + "}"); + ASSERT_EQUALS("", errout.str()); + // non static data-member initialization checkUninitVar("struct AB { int a=1; int b; };\n" "void f(void) {\n"