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() {