Skip to content

Commit 1999bc6

Browse files
Set values when assigning init list (danmar#5057)
* Assign values to pointers with C++11 init * Handle assigning empty init list * Fix #10596 FN uninitdata with value initialization * Fix test * Set values when assigning init list
1 parent d475591 commit 1999bc6

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

lib/valueflow.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,11 +1343,17 @@ static Token * valueFlowSetConstantValue(Token *tok, const Settings *settings, b
13431343
if (!tok->isTemplateArg())
13441344
value.setKnown();
13451345
setTokenValue(tok->next(), std::move(value), settings, isInitList);
1346-
} else if (Token::Match(tok, "%name% = { }") && tok->variable() &&
1346+
} else if (Token::Match(tok, "%name% = {") && tok->variable() &&
13471347
(tok->variable()->isPointer() || (tok->variable()->valueType() && tok->variable()->valueType()->isIntegral()))) {
1348-
ValueFlow::Value value(0);
1349-
value.setKnown();
1350-
setTokenValue(tok->tokAt(2), std::move(value), settings, isInitList);
1348+
if (Token::simpleMatch(tok->tokAt(3), "}")) {
1349+
ValueFlow::Value value(0);
1350+
value.setKnown();
1351+
setTokenValue(tok->tokAt(2), std::move(value), settings, isInitList);
1352+
} else if (tok->tokAt(2)->astOperand1() && tok->tokAt(2)->astOperand1()->hasKnownIntValue()) {
1353+
ValueFlow::Value value(tok->tokAt(2)->astOperand1()->getKnownIntValue());
1354+
value.setKnown();
1355+
setTokenValue(tok->tokAt(2), std::move(value), settings, isInitList);
1356+
}
13511357
}
13521358
return tok->next();
13531359
}

test/testvalueflow.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5094,6 +5094,22 @@ class TestValueFlow : public TestFixture {
50945094
ASSERT_EQUALS(true, value.isKnown());
50955095
ASSERT_EQUALS(1, value.intvalue);
50965096

5097+
code = "bool f() {\n"
5098+
" int* p = { 0 };\n"
5099+
" return p == nullptr;\n" // <- known value
5100+
"}";
5101+
value = valueOfTok(code, "==");
5102+
ASSERT_EQUALS(true, value.isKnown());
5103+
ASSERT_EQUALS(1, value.intvalue);
5104+
5105+
code = "bool f() {\n"
5106+
" int i = { 1 };\n"
5107+
" return i == 1;\n" // <- known value
5108+
"}";
5109+
value = valueOfTok(code, "==");
5110+
ASSERT_EQUALS(true, value.isKnown());
5111+
ASSERT_EQUALS(1, value.intvalue);
5112+
50975113
// calculation with known result
50985114
code = "int f(int x) { a = x & 0; }"; // <- & is 0
50995115
value = valueOfTok(code, "&");

0 commit comments

Comments
 (0)