From e2370da4cd0e5313d19e779c2ae16409f2c54fe9 Mon Sep 17 00:00:00 2001 From: chrchr Date: Fri, 12 May 2023 19:23:32 +0200 Subject: [PATCH 1/2] Assign values to pointers with C++11 init --- lib/valueflow.cpp | 2 +- test/testvalueflow.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 3ac36a696dd..753cbe4d900 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -5814,7 +5814,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..e6836517cde 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -5054,6 +5054,30 @@ 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); + // calculation with known result code = "int f(int x) { a = x & 0; }"; // <- & is 0 value = valueOfTok(code, "&"); From 947c90a9b11a00a325652e1923ba996151f94f52 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Sat, 13 May 2023 13:24:03 +0200 Subject: [PATCH 2/2] Handle assigning empty init list --- lib/valueflow.cpp | 5 +++++ test/testvalueflow.cpp | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 753cbe4d900..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(); } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index e6836517cde..f03d4be3797 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -5078,6 +5078,22 @@ 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 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, "&");