From 1fa272c1ec4b6e098bbd12be50b66162a1c0acbe Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Wed, 10 Apr 2024 03:23:54 -0500 Subject: [PATCH] Fix 12606 and 12287: FP uninitvar when passing address to function (#6261) --- lib/astutils.cpp | 2 ++ lib/checkuninitvar.cpp | 5 +---- test/testuninitvar.cpp | 10 +++++++++- 3 files changed, 12 insertions(+), 5 deletions(-) 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