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..2e56f2ccb15 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; } diff --git a/test/testcondition.cpp b/test/testcondition.cpp index ffeca5c5be7..055771a11d0 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" + "void 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) Condition 's.g()' is always true [knownConditionTrueFalse]\n", errout_str()); } void alwaysTrueSymbolic()