diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 48357f35792..65180150852 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3365,6 +3365,8 @@ ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings) return ExprUsage::NotUsed; if (Token::simpleMatch(parent, ":") && Token::simpleMatch(parent->astParent(), "?")) return getExprUsage(parent->astParent(), indirect, settings); + if (isUsedAsBool(tok, settings)) + return ExprUsage::NotUsed; } if (indirect == 0) { if (Token::Match(parent, "%cop%|%assign%|++|--") && parent->str() != "=" && diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 0cb2065760b..6e58f0acd54 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1652,14 +1652,11 @@ void CheckUninitVar::valueFlowUninit() continue; if (!v->subexpressions.empty() && usage == ExprUsage::PassedByReference) continue; - bool inconclusive = false; - if (usage == ExprUsage::Used && v->tokvalue && tok->variable() && tok->variable()->isArgument() && - (!isVariableChangedByFunctionCall(v->tokvalue, v->indirect, mSettings, &inconclusive) || inconclusive)) - continue; if (usage != ExprUsage::Used) { if (!(Token::Match(tok->astParent(), ". %name% (|[") && uninitderef) && isVariableChanged(tok, v->indirect, mSettings)) continue; + bool inconclusive = false; if (isVariableChangedByFunctionCall(tok, v->indirect, mSettings, &inconclusive) || inconclusive) continue; } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 3ce6c654036..fcbe8e47c22 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6143,7 +6143,7 @@ class TestUninitVar : public TestFixture { " increment(n);\n" " return n;\n" "}\n"); - ASSERT_EQUALS("", errout_str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (warning) Uninitialized variable: i\n", errout_str()); // #11412 valueFlowUninit("void f(int n) {\n" @@ -6467,6 +6467,14 @@ class TestUninitVar : public TestFixture { " if ((success == 1) && (myst.a != 0)) {}\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + // #12606 + valueFlowUninit("void f(int& r) { if (r) {} }\n" + "void g() {\n" + " int i;\n" + " f(i);\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (warning) Uninitialized variable: r\n", errout_str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value