diff --git a/.selfcheck_suppressions b/.selfcheck_suppressions index 7728225cd44..764b8818308 100644 --- a/.selfcheck_suppressions +++ b/.selfcheck_suppressions @@ -40,5 +40,6 @@ naming-privateMemberVariable:externals/tinyxml2/tinyxml2.h functionStatic:externals/tinyxml2/tinyxml2.cpp funcArgNamesDifferent:externals/tinyxml2/tinyxml2.cpp nullPointerRedundantCheck:externals/tinyxml2/tinyxml2.cpp +knownConditionTrueFalse:externals/tinyxml2/tinyxml2.cpp useStlAlgorithm:externals/simplecpp/simplecpp.cpp missingMemberCopy:externals/simplecpp/simplecpp.h diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 5f35f443cbf..3a4a24dcbb1 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1545,6 +1545,8 @@ void CheckCondition::alwaysTrueFalse() condition = parent->astParent()->astParent()->previous(); else if (Token::Match(tok, "%comp%")) condition = tok; + else if (tok->str() == "(" && astIsBool(parent) && Token::Match(parent, "%assign%")) + condition = tok; else continue; } @@ -1647,11 +1649,20 @@ void CheckCondition::alwaysTrueFalse() } } +static std::string getConditionString(const Token* condition) +{ + if (Token::simpleMatch(condition, "return")) + return "Return value"; + if (Token::simpleMatch(condition, "(") && Token::Match(condition->astParent(), "%assign%")) + return "Assigned value"; + return "Condition"; +} + void CheckCondition::alwaysTrueFalseError(const Token* tok, const Token* condition, const ValueFlow::Value* value) { const bool alwaysTrue = value && (value->intvalue != 0 || value->isImpossible()); const std::string expr = tok ? tok->expressionString() : std::string("x"); - const std::string conditionStr = (Token::simpleMatch(condition, "return") ? "Return value" : "Condition"); + const std::string conditionStr = getConditionString(condition); const std::string errmsg = conditionStr + " '" + expr + "' is always " + bool_to_string(alwaysTrue); ErrorPath errorPath = getErrorPath(tok, value, errmsg); reportError(std::move(errorPath), diff --git a/test/testcondition.cpp b/test/testcondition.cpp index ffeca5c5be7..1d93f83686c 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4787,6 +4787,19 @@ class TestCondition : public TestFixture { " }\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("struct S {\n" // #14392 + " bool g() const { return m; }\n" + " bool m{};\n" + "};\n" + "bool f(S s) {\n" + " if (s.g()) {\n" + " bool b = s.g();\n" + " return b;\n" + " }\n" + " return false;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6:12] -> [test.cpp:7:21]: (style) Assigned value 's.g()' is always true [knownConditionTrueFalse]\n", errout_str()); } void alwaysTrueSymbolic()