From 35fb55d76c24a3fa6951b0bb8c18f5599b4dfaed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 24 Aug 2019 08:01:55 +0200 Subject: [PATCH] Fixed #5259 (Improve check: Uninitialized variable not reported when used in array initialization) --- lib/checkuninitvar.cpp | 10 ++++++++++ test/testuninitvar.cpp | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index bfaf8529d..8e3bd4b16 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -973,6 +973,16 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc al } } + { + const Token *parent = vartok->astParent(); + while (parent && parent->isCast()) + parent = parent->astParent(); + while (parent && parent->str() == ",") + parent = parent->astParent(); + if (Token::simpleMatch(parent, "{")) + return true; + } + if (Token::Match(vartok->previous(), "++|--|%cop%")) { if (mTokenizer->isCPP() && alloc == ARRAY && Token::Match(vartok->tokAt(-4), "& %var% =|( *")) return false; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 6b41c6919..99e9a9e44 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -3978,6 +3978,12 @@ private: " if (2 < sizeof(*x)) {}\n" "}"); ASSERT_EQUALS("", errout.str()); + + valueFlowUninit("void foo() {\n" // #5259 - False negative + " int a;\n" + " int x[] = {a,2};\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str()); } void uninitvar_ipa() {