diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 7cb672fc4..98d189782 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1542,7 +1542,7 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, bool cpp // is there something like: ; "*((&var ..expr.. =" => the variable is assigned if (vartok->previous()->str() == "&") { const Token *tok2 = vartok->tokAt(-2); - if (tok2 && (tok2->isConstOp() || tok2->str() == "(")) + if (tok2 && (tok2->isConstOp() || Token::Match(tok2, "[;{}(]"))) return false; // address of if (tok2 && tok2->str() == ")") tok2 = tok2->link()->previous(); diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index e44792f18..6cf9eefd4 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2376,6 +2376,12 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + checkUninitVar2("void f() {\n" // #4778 - cast address of uninitialized variable + " long a;\n" + " &a;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + checkUninitVar2("void f() {\n" // #4717 - ({}) " int a = ({ long b = (long)(123); 2 + b; });\n" "}", "test.c", false);