diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 86e0a73b8..bcf4bf141 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -430,10 +430,16 @@ private: // is there assignment or ternary operator in the return statement? bool assignment = false; for (const Token *tok2 = tok.next(); tok2 && tok2->str() != ";"; tok2 = tok2->next()) { - if (tok2->str() == "=" || (!isC && tok2->str() == ">>") || tok2->str() == "?" || Token::Match(tok2, "(|, &")) { + if (tok2->str() == "=" || (!isC && tok2->str() == ">>") || Token::Match(tok2, "(|, &")) { assignment = true; break; } + if (Token::Match(tok2, "[(,] &| %var% [,)]")) { + tok2 = tok2->next(); + if (!tok2->isName()) + tok2 = tok2->next(); + ExecutionPath::bailOutVar(checks, tok2->varId()); + } } if (!assignment) { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 3ef04b875..a162d921b 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -575,19 +575,20 @@ private: "}\n"); ASSERT_EQUALS("[test.cpp:2]: (error) Uninitialized variable: y\n", errout.str()); - // Ticket #3106 - False positive - checkUninitVar("int f() {\n" - " int i;\n" - " return x(&i) ? i : 0;\n" - "}\n"); - ASSERT_EQUALS("", errout.str()); + { + // Ticket #3106 - False positive + checkUninitVar("int f() {\n" + " int i;\n" + " return x(&i) ? i : 0;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); - // Ticket #3106 - False negative - checkUninitVar("int f() {\n" - " int i;\n" - " return x() ? i : 0;\n" - "}\n"); - TODO_ASSERT_EQUALS("[test.cpp:2]: (error) Uninitialized variable: i\n", "", errout.str()); + checkUninitVar("int f() {\n" + " int i;\n" + " return x() ? i : 0;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: i\n", errout.str()); + } // Ticket #3480 - Don't crash garbage code checkUninitVar("int f()\n"