diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 774a81b5d..ea491764d 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -948,7 +948,10 @@ void CheckUninitVar::checkRhs(const Token *tok, const Variable &var, Alloc alloc bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc alloc) const { - if (alloc == NO_ALLOC && ((Token::Match(vartok->previous(), "return|delete %var% !!=")) || (vartok->strAt(-1) == "]" && vartok->linkAt(-1)->strAt(-1) == "delete"))) + if (!pointer && Token::Match(vartok, "%name% (")) + return false; + + if (alloc == NO_ALLOC && (Token::Match(vartok->previous(), "return|delete %var% !!=") || (vartok->strAt(-1) == "]" && vartok->linkAt(-1)->strAt(-1) == "delete"))) return true; // Passing variable to typeof/__alignof__ diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index b43268818..cc9430f9d 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -4124,6 +4124,12 @@ private: "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: a\n", errout.str()); + valueFlowUninit("struct S { int x; };\n" // #9417 + "void f() {\n" + " S s;\n" + " return s(1);\n" + "}"); + ASSERT_EQUALS("", errout.str()); } valueFlowUninit("void a() {\n" // asm