From e93fb9cf232d80be7a75b48e599e916bf82cd337 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:33:20 +0100 Subject: [PATCH 1/8] Update checkcondition.cpp --- lib/checkcondition.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 5f35f443cbf..3713a194647 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() == "(" && !Token::Match(parent, "%comp%|!")) + condition = tok; else continue; } From 0faaf143f0363328f739b8fbee4c1aa106ed4741 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:39:35 +0100 Subject: [PATCH 2/8] Update testcondition.cpp --- test/testcondition.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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() From 8dc1bd6ec47c21aab5ea1a9a1fc28e335e679492 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:40:51 +0100 Subject: [PATCH 3/8] Update checkcondition.cpp --- lib/checkcondition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 3713a194647..2e56f2ccb15 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1545,7 +1545,7 @@ void CheckCondition::alwaysTrueFalse() condition = parent->astParent()->astParent()->previous(); else if (Token::Match(tok, "%comp%")) condition = tok; - else if (tok->str() == "(" && !Token::Match(parent, "%comp%|!")) + else if (tok->str() == "(" && astIsBool(parent) && Token::Match(parent, "%assign%")) condition = tok; else continue; From 5a1aa4fdcb6b0a9909648b79bddba6591f8ae6e4 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:10:54 +0100 Subject: [PATCH 4/8] Update .selfcheck_suppressions --- .selfcheck_suppressions | 1 + 1 file changed, 1 insertion(+) 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 From e5f529a405befb56a78c347219f66c34d595b06f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:20:35 +0100 Subject: [PATCH 5/8] Update checkcondition.cpp --- lib/checkcondition.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 2e56f2ccb15..b4cefcfbbc0 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1649,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), From 48b66db942e3dbb5d1769ac2a9be216a041cfdd9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:23:18 +0100 Subject: [PATCH 6/8] Update testcondition.cpp --- test/testcondition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 055771a11d0..7f92661f842 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4799,7 +4799,7 @@ class TestCondition : public TestFixture { " }\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()); + ASSERT_EQUALS("[test.cpp:6:12] -> [test.cpp:7:21]: (style) Assigned value 's.g()' is always true [knownConditionTrueFalse]\n", errout_str()); } void alwaysTrueSymbolic() From 73a49002334bdb8f7de71ad2e52f18038fc60600 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:39:18 +0100 Subject: [PATCH 7/8] Update checkcondition.cpp --- lib/checkcondition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index b4cefcfbbc0..3a4a24dcbb1 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1653,7 +1653,7 @@ static std::string getConditionString(const Token* condition) { if (Token::simpleMatch(condition, "return")) return "Return value"; - if (Token::simpleMatch(condition, "(") && Token::Match(condition->astParent(), "%assign")) + if (Token::simpleMatch(condition, "(") && Token::Match(condition->astParent(), "%assign%")) return "Assigned value"; return "Condition"; } From 4551f972774db6c20de6177512e5a18fdd57a25d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:55:45 +0100 Subject: [PATCH 8/8] Update testcondition.cpp --- test/testcondition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 7f92661f842..1d93f83686c 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4792,7 +4792,7 @@ class TestCondition : public TestFixture { " bool g() const { return m; }\n" " bool m{};\n" "};\n" - "void f(S s) {\n" + "bool f(S s) {\n" " if (s.g()) {\n" " bool b = s.g();\n" " return b;\n"