Skip to content

Commit 1fa272c

Browse files
authored
Fix 12606 and 12287: FP uninitvar when passing address to function (#6261)
1 parent be32239 commit 1fa272c

3 files changed

Lines changed: 12 additions & 5 deletions

File tree

lib/astutils.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3365,6 +3365,8 @@ ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings)
33653365
return ExprUsage::NotUsed;
33663366
if (Token::simpleMatch(parent, ":") && Token::simpleMatch(parent->astParent(), "?"))
33673367
return getExprUsage(parent->astParent(), indirect, settings);
3368+
if (isUsedAsBool(tok, settings))
3369+
return ExprUsage::NotUsed;
33683370
}
33693371
if (indirect == 0) {
33703372
if (Token::Match(parent, "%cop%|%assign%|++|--") && parent->str() != "=" &&

lib/checkuninitvar.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,14 +1652,11 @@ void CheckUninitVar::valueFlowUninit()
16521652
continue;
16531653
if (!v->subexpressions.empty() && usage == ExprUsage::PassedByReference)
16541654
continue;
1655-
bool inconclusive = false;
1656-
if (usage == ExprUsage::Used && v->tokvalue && tok->variable() && tok->variable()->isArgument() &&
1657-
(!isVariableChangedByFunctionCall(v->tokvalue, v->indirect, mSettings, &inconclusive) || inconclusive))
1658-
continue;
16591655
if (usage != ExprUsage::Used) {
16601656
if (!(Token::Match(tok->astParent(), ". %name% (|[") && uninitderef) &&
16611657
isVariableChanged(tok, v->indirect, mSettings))
16621658
continue;
1659+
bool inconclusive = false;
16631660
if (isVariableChangedByFunctionCall(tok, v->indirect, mSettings, &inconclusive) || inconclusive)
16641661
continue;
16651662
}

test/testuninitvar.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6143,7 +6143,7 @@ class TestUninitVar : public TestFixture {
61436143
" increment(n);\n"
61446144
" return n;\n"
61456145
"}\n");
6146-
ASSERT_EQUALS("", errout_str());
6146+
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (warning) Uninitialized variable: i\n", errout_str());
61476147

61486148
// #11412
61496149
valueFlowUninit("void f(int n) {\n"
@@ -6467,6 +6467,14 @@ class TestUninitVar : public TestFixture {
64676467
" if ((success == 1) && (myst.a != 0)) {}\n"
64686468
"}\n");
64696469
ASSERT_EQUALS("", errout_str());
6470+
6471+
// #12606
6472+
valueFlowUninit("void f(int& r) { if (r) {} }\n"
6473+
"void g() {\n"
6474+
" int i;\n"
6475+
" f(i);\n"
6476+
"}\n");
6477+
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (warning) Uninitialized variable: r\n", errout_str());
64706478
}
64716479

64726480
void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value

0 commit comments

Comments
 (0)