From 0a03eb27dfb164ceceeef69825b4e94e1a643b72 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Wed, 15 Jul 2026 23:00:32 +0200 Subject: [PATCH 1/4] Partial fix for #14911 FN knownConditionTrueFalse for number literals (regression) --- lib/checkcondition.cpp | 11 ++++++++--- test/testcondition.cpp | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index e77641f89e7..b009f47cea9 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1536,6 +1536,7 @@ void CheckConditionImpl::alwaysTrueFalse() } if (!tok->hasKnownIntValue()) continue; + const bool isZeroOrOne = (tok->getKnownIntValue() & ~MathLib::bigint(1)) == 0 ; const Token* condition = nullptr; { // is this a condition.. @@ -1575,8 +1576,12 @@ void CheckConditionImpl::alwaysTrueFalse() continue; if (Token::simpleMatch(tok->astParent(), "return") && Token::Match(tok, ".|%var%")) continue; - if (Token::Match(tok, "%num%|%bool%|%char%")) - continue; + bool warnForNumber = false; + if (Token::Match(tok, "%num%|%bool%|%char%")) { + warnForNumber = !isZeroOrOne && tok->tokType() == Token::eNumber && tok->astParent() == condition->astParent(); + if (!warnForNumber) + continue; + } if (Token::Match(tok, "! %num%|%bool%|%char%")) continue; if (Token::Match(tok, "%oror%|&&")) { @@ -1603,7 +1608,7 @@ void CheckConditionImpl::alwaysTrueFalse() true)) continue; - if (!pedantic && isConstVarExpression(tok, [](const Token* tok) { + if (!pedantic && !warnForNumber && isConstVarExpression(tok, [](const Token* tok) { return Token::Match(tok, "[|(|&|+|-|*|/|%|^|>>|<<") && !Token::simpleMatch(tok, "( )"); })) continue; diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 837cd4e78ba..abd70a5e690 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4935,6 +4935,20 @@ class TestCondition : public TestFixture { " if (v > 0) {}\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("void f() {\n" + " if (42) {}\n" + " if (42U) {}\n" + " if (42L) {}\n" + " if (42UL) {}\n" + " if (42LL) {}\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:9]: (style) Condition '42' is always true [knownConditionTrueFalse]\n" + "[test.cpp:3:9]: (style) Condition '42U' is always true [knownConditionTrueFalse]\n" + "[test.cpp:4:9]: (style) Condition '42L' is always true [knownConditionTrueFalse]\n" + "[test.cpp:5:9]: (style) Condition '42UL' is always true [knownConditionTrueFalse]\n" + "[test.cpp:6:9]: (style) Condition '42LL' is always true [knownConditionTrueFalse]\n", + errout_str()); } void alwaysTrueSymbolic() From 33988e17ad4feac6a5f10ea0c30a73b1ebdd06cf Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Wed, 15 Jul 2026 23:15:35 +0200 Subject: [PATCH 2/4] Format --- lib/checkcondition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index b009f47cea9..45b31995eb8 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1536,7 +1536,7 @@ void CheckConditionImpl::alwaysTrueFalse() } if (!tok->hasKnownIntValue()) continue; - const bool isZeroOrOne = (tok->getKnownIntValue() & ~MathLib::bigint(1)) == 0 ; + const bool isZeroOrOne = (tok->getKnownIntValue() & ~MathLib::bigint(1)) == 0; const Token* condition = nullptr; { // is this a condition.. From c0c6402cbbaf991b6d090bc7f4e8403895c78b34 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:52:23 +0200 Subject: [PATCH 3/4] Update checkcondition.cpp [skip ci] --- lib/checkcondition.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 45b31995eb8..4776cbea38f 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1536,7 +1536,6 @@ void CheckConditionImpl::alwaysTrueFalse() } if (!tok->hasKnownIntValue()) continue; - const bool isZeroOrOne = (tok->getKnownIntValue() & ~MathLib::bigint(1)) == 0; const Token* condition = nullptr; { // is this a condition.. @@ -1578,12 +1577,17 @@ void CheckConditionImpl::alwaysTrueFalse() continue; bool warnForNumber = false; if (Token::Match(tok, "%num%|%bool%|%char%")) { + const bool isZeroOrOne = (tok->getKnownIntValue() >> 1) == 0; warnForNumber = !isZeroOrOne && tok->tokType() == Token::eNumber && tok->astParent() == condition->astParent(); if (!warnForNumber) continue; } - if (Token::Match(tok, "! %num%|%bool%|%char%")) - continue; + if (Token::Match(tok, "! %num%|%bool%|%char%")) { + const bool isZeroOrOne = tok->next()->hasKnownIntValue() && (tok->next()->getKnownIntValue() >> 1) == 0; + warnForNumber = !isZeroOrOne && tok->next()->tokType() == Token::eNumber && tok->astParent() == condition->astParent(); + if (!warnForNumber) + continue; + } if (Token::Match(tok, "%oror%|&&")) { bool bail = false; for (const Token* op : { tok->astOperand1(), tok->astOperand2() }) { From 0736e65f20243bd9cbffb5a3fdfba095908d1c1f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:53:20 +0200 Subject: [PATCH 4/4] Update testcondition.cpp --- test/testcondition.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 8c1527467ab..85efa6eab63 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4956,12 +4956,20 @@ class TestCondition : public TestFixture { " if (42L) {}\n" " if (42UL) {}\n" " if (42LL) {}\n" + " if (042) {}\n" + " if (0x42) {}\n" + " if (0b101010) {}\n" + " if (!42) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:2:9]: (style) Condition '42' is always true [knownConditionTrueFalse]\n" "[test.cpp:3:9]: (style) Condition '42U' is always true [knownConditionTrueFalse]\n" "[test.cpp:4:9]: (style) Condition '42L' is always true [knownConditionTrueFalse]\n" "[test.cpp:5:9]: (style) Condition '42UL' is always true [knownConditionTrueFalse]\n" - "[test.cpp:6:9]: (style) Condition '42LL' is always true [knownConditionTrueFalse]\n", + "[test.cpp:6:9]: (style) Condition '42LL' is always true [knownConditionTrueFalse]\n" + "[test.cpp:7:9]: (style) Condition '042' is always true [knownConditionTrueFalse]\n" + "[test.cpp:8:9]: (style) Condition '0x42' is always true [knownConditionTrueFalse]\n" + "[test.cpp:9:9]: (style) Condition '0b101010' is always true [knownConditionTrueFalse]\n" + "[test.cpp:10:9]: (style) Condition '!42' is always false [knownConditionTrueFalse]\n", errout_str()); }