diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 3ac36a696dd..2bb5a6f299e 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1343,6 +1343,11 @@ static Token * valueFlowSetConstantValue(Token *tok, const Settings *settings, b if (!tok->isTemplateArg()) value.setKnown(); setTokenValue(tok->next(), std::move(value), settings, isInitList); + } else if (Token::Match(tok, "%name% = { }") && tok->variable() && + (tok->variable()->isPointer() || (tok->variable()->valueType() && tok->variable()->valueType()->isIntegral()))) { + ValueFlow::Value value(0); + value.setKnown(); + setTokenValue(tok->tokAt(2), std::move(value), settings, isInitList); } return tok->next(); } @@ -5814,7 +5819,7 @@ static void valueFlowAfterAssign(TokenList *tokenlist, if (tok->str() != "=" && !(isInit = isVariableInit(tok))) continue; - if (tok->astParent() && !(tok->astParent()->str() == ";" && astIsLHS(tok))) + if (tok->astParent() && !((tok->astParent()->str() == ";" && astIsLHS(tok)) || tok->astParent()->str() == "*")) continue; // Lhs should be a variable diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 350716a7942..f03d4be3797 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -5054,6 +5054,46 @@ class TestValueFlow : public TestFixture { ASSERT_EQUALS(true, value.isKnown()); ASSERT_EQUALS(1, value.intvalue); + code = "bool f() {\n" + " int* p{};\n" + " return p == nullptr;\n" // <- known value + "}"; + value = valueOfTok(code, "=="); + ASSERT_EQUALS(true, value.isKnown()); + ASSERT_EQUALS(1, value.intvalue); + + code = "bool f() {\n" + " int* p{ nullptr };\n" + " return p == nullptr;\n" // <- known value + "}"; + value = valueOfTok(code, "=="); + ASSERT_EQUALS(true, value.isKnown()); + ASSERT_EQUALS(1, value.intvalue); + + code = "bool f() {\n" + " int* p{ 0 };\n" + " return p == nullptr;\n" // <- known value + "}"; + value = valueOfTok(code, "=="); + ASSERT_EQUALS(true, value.isKnown()); + ASSERT_EQUALS(1, value.intvalue); + + code = "bool f() {\n" + " int* p = {};\n" + " return p == nullptr;\n" // <- known value + "}"; + value = valueOfTok(code, "=="); + ASSERT_EQUALS(true, value.isKnown()); + ASSERT_EQUALS(1, value.intvalue); + + code = "bool f() {\n" + " int i = {};\n" + " return i == 0;\n" // <- known value + "}"; + value = valueOfTok(code, "=="); + ASSERT_EQUALS(true, value.isKnown()); + ASSERT_EQUALS(1, value.intvalue); + // calculation with known result code = "int f(int x) { a = x & 0; }"; // <- & is 0 value = valueOfTok(code, "&");