From b9ac77a31baeb0afa3bc6629c8791708e4f2f208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 9 Mar 2019 11:30:45 +0100 Subject: [PATCH] Uninitialized variables: Fixed false positive --- lib/checkuninitvar.cpp | 16 ++-------------- test/testuninitvar.cpp | 10 ++++------ 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index b29ae887a..2b6a027c5 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -925,20 +925,8 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc al // Accessing Rvalue member using "." or "->" if (Token::Match(vartok->previous(), "!!& %var% .")) { // Is struct member passed to function? - if (!pointer) { - // TODO: there are FN currently: - // - should only return false if struct member is (or might be) array. - // - should only return false if function argument is (or might be) non-const pointer or reference - bool unknown = false; - const Token *possibleParent = getAstParentSkipPossibleCastAndAddressOf(vartok, &unknown); - if (Token::Match(possibleParent, "[(,]")) { - if (unknown) - return false; // TODO: output some info message? - const int use = isFunctionParUsage(vartok, pointer, alloc); - if (use >= 0) - return (use>0); - } - } + if (!pointer) + return false; if (pointer && alloc != CTOR_CALL && Token::Match(vartok, "%name% . %name% (")) return true; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 6f07ae542..9b1169acf 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -3054,8 +3054,7 @@ private: " struct AB ab;\n" " do_something(ab.a);\n" "}\n", "test.c"); - ASSERT_EQUALS("[test.c:5]: (error) Uninitialized variable: ab\n" - "[test.c:5]: (error) Uninitialized struct member: ab.a\n", errout.str()); + ASSERT_EQUALS("[test.c:5]: (error) Uninitialized struct member: ab.a\n", errout.str()); checkUninitVar("struct AB { int a; int b; };\n" "void do_something(const struct AB &ab) { a = ab.a; }\n" @@ -3235,14 +3234,14 @@ private: " struct AB ab;\n" " strcpy(x, ab.a);\n" "}\n", "test.c"); - ASSERT_EQUALS("[test.c:4]: (error) Uninitialized variable: ab\n", errout.str()); + TODO_ASSERT_EQUALS("[test.c:4]: (error) Uninitialized variable: ab.a\n", "", errout.str()); checkUninitVar("struct AB { int a; };\n" "void f(void) {\n" " struct AB ab;\n" " dosomething(ab.a);\n" "}\n", "test.c"); - TODO_ASSERT_EQUALS("error","", errout.str()); + ASSERT_EQUALS("", errout.str()); } checkUninitVar("struct AB { int a; int b; };\n" @@ -3621,8 +3620,7 @@ private: " do_something(a);\n" " }\n" "}\n", "test.c"); - ASSERT_EQUALS("[test.c:5]: (error) Uninitialized variable: ab\n" - "[test.c:5]: (error) Uninitialized struct member: ab.a\n", errout.str()); + ASSERT_EQUALS("[test.c:5]: (error) Uninitialized struct member: ab.a\n", errout.str()); checkUninitVar("void f(int i) {\n" // #4569 fp " float *buffer;\n"