Skip to content

Commit d48df98

Browse files
authored
Fix 12030: False positive: uninitialized variable, conditional modification, flag (#5520)
1 parent 1d30b61 commit d48df98

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

lib/programmemory.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok
386386
if (Token::simpleMatch(tok2->previous(), "else {"))
387387
tok2 = tok2->linkAt(-2)->previous();
388388
}
389-
if (tok2->str() == "}") {
389+
if (tok2->str() == "}" && !Token::Match(tok2->link()->previous(), "%var% {")) {
390390
const Token *cond = getCondTokFromEnd(tok2);
391391
const bool inElse = Token::simpleMatch(tok2->link()->previous(), "else {");
392392
if (cond) {

test/testuninitvar.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3683,6 +3683,29 @@ class TestUninitVar : public TestFixture {
36833683
"}", "test.c");
36843684
ASSERT_EQUALS("", errout.str());
36853685

3686+
// #12030
3687+
valueFlowUninit("int set(int *x);\n"
3688+
"void foo(bool a) {\n"
3689+
" bool flag{0};\n"
3690+
" int x;\n"
3691+
" if (!a) {\n"
3692+
" flag = set(&x);\n"
3693+
" }\n"
3694+
" if (!flag || x==3) {}\n"
3695+
"}\n");
3696+
ASSERT_EQUALS("", errout.str());
3697+
3698+
valueFlowUninit("int set(int *x);\n"
3699+
"void foo(bool a) {\n"
3700+
" bool flag{0};\n"
3701+
" int x;\n"
3702+
" if (!a) {\n"
3703+
" flag = set(&x);\n"
3704+
" }\n"
3705+
" if (!flag && x==3) {}\n"
3706+
"}\n");
3707+
ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:8]: (warning) Uninitialized variable: x\n", errout.str());
3708+
36863709
valueFlowUninit("int do_something();\n"
36873710
"int set_st(int *x);\n"
36883711
"int bar();\n"

0 commit comments

Comments
 (0)