From ad007ca2d7414ab8d21addc6192c83c32ee49ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 13 Sep 2015 16:32:16 +0200 Subject: [PATCH] Uninitialized variables: better checking of arrays --- lib/checkuninitvar.cpp | 9 +++++++++ test/testuninitvar.cpp | 10 ++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 1c8509332..526b7be8c 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -845,6 +845,15 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc al // if this is not a function parameter report this dereference as variable usage if (!functionParameter) return true; + } else if (alloc == ARRAY && Token::Match(vartok, "%var% [")) { + const Token *parent = vartok->next()->astParent(); + while (Token::simpleMatch(parent, "[")) + parent = parent->astParent(); + if (Token::simpleMatch(parent, "&") && !parent->astOperand2()) + return false; + if (Token::Match(parent, "[=,(]")) + return false; + return true; } if (_tokenizer->isCPP() && Token::Match(vartok->next(), "<<|>>")) { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 1c7f2ab65..09bd42d7d 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -1407,13 +1407,19 @@ private: " int a[1];\n" " return a[0];\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", "", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str()); checkUninitVar("int foo() {\n" " int a[2][2];\n" " return a[0][1];\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", "", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str()); + + checkUninitVar("int foo() {\n" + " int a[10];\n" + " dostuff(a[0]);\n" + "}"); + ASSERT_EQUALS("", errout.str()); // # 4740 checkUninitVar("void f() {\n"