Skip to content

Commit dc7550e

Browse files
Assign values to pointers with C++11 init (danmar#5055)
* Assign values to pointers with C++11 init * Handle assigning empty init list
1 parent 2b74a20 commit dc7550e

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

lib/valueflow.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,11 @@ 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() &&
1347+
(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);
13461351
}
13471352
return tok->next();
13481353
}
@@ -5814,7 +5819,7 @@ static void valueFlowAfterAssign(TokenList *tokenlist,
58145819
if (tok->str() != "=" && !(isInit = isVariableInit(tok)))
58155820
continue;
58165821

5817-
if (tok->astParent() && !(tok->astParent()->str() == ";" && astIsLHS(tok)))
5822+
if (tok->astParent() && !((tok->astParent()->str() == ";" && astIsLHS(tok)) || tok->astParent()->str() == "*"))
58185823
continue;
58195824

58205825
// Lhs should be a variable

test/testvalueflow.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5054,6 +5054,46 @@ class TestValueFlow : public TestFixture {
50545054
ASSERT_EQUALS(true, value.isKnown());
50555055
ASSERT_EQUALS(1, value.intvalue);
50565056

5057+
code = "bool f() {\n"
5058+
" int* p{};\n"
5059+
" return p == nullptr;\n" // <- known value
5060+
"}";
5061+
value = valueOfTok(code, "==");
5062+
ASSERT_EQUALS(true, value.isKnown());
5063+
ASSERT_EQUALS(1, value.intvalue);
5064+
5065+
code = "bool f() {\n"
5066+
" int* p{ nullptr };\n"
5067+
" return p == nullptr;\n" // <- known value
5068+
"}";
5069+
value = valueOfTok(code, "==");
5070+
ASSERT_EQUALS(true, value.isKnown());
5071+
ASSERT_EQUALS(1, value.intvalue);
5072+
5073+
code = "bool f() {\n"
5074+
" int* p{ 0 };\n"
5075+
" return p == nullptr;\n" // <- known value
5076+
"}";
5077+
value = valueOfTok(code, "==");
5078+
ASSERT_EQUALS(true, value.isKnown());
5079+
ASSERT_EQUALS(1, value.intvalue);
5080+
5081+
code = "bool f() {\n"
5082+
" int* p = {};\n"
5083+
" return p == nullptr;\n" // <- known value
5084+
"}";
5085+
value = valueOfTok(code, "==");
5086+
ASSERT_EQUALS(true, value.isKnown());
5087+
ASSERT_EQUALS(1, value.intvalue);
5088+
5089+
code = "bool f() {\n"
5090+
" int i = {};\n"
5091+
" return i == 0;\n" // <- known value
5092+
"}";
5093+
value = valueOfTok(code, "==");
5094+
ASSERT_EQUALS(true, value.isKnown());
5095+
ASSERT_EQUALS(1, value.intvalue);
5096+
50575097
// calculation with known result
50585098
code = "int f(int x) { a = x & 0; }"; // <- & is 0
50595099
value = valueOfTok(code, "&");

0 commit comments

Comments
 (0)