diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index eb025a35d1d..2b3ca4ed93d 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1502,10 +1502,11 @@ void CheckCondition::clarifyConditionError(const Token *tok, bool assign, bool b void CheckCondition::alwaysTrueFalse() { - if (!mSettings->severity.isEnabled(Severity::style) && - !mSettings->isPremiumEnabled("alwaysTrue") && - !mSettings->isPremiumEnabled("alwaysFalse") && - !mSettings->isPremiumEnabled("knownConditionTrueFalse")) + const bool pedantic = mSettings->isPremiumEnabled("alwaysTrue") || + mSettings->isPremiumEnabled("alwaysFalse") || + mSettings->isPremiumEnabled("knownConditionTrueFalse"); + + if (!pedantic && !mSettings->severity.isEnabled(Severity::style)) return; logChecker("CheckCondition::alwaysTrueFalse"); // style @@ -1588,7 +1589,8 @@ void CheckCondition::alwaysTrueFalse() true, true)) continue; - if (isConstVarExpression(tok, [](const Token* tok) { + + if (!pedantic && isConstVarExpression(tok, [](const Token* tok) { return Token::Match(tok, "[|(|&|+|-|*|/|%|^|>>|<<") && !Token::simpleMatch(tok, "( )"); })) continue; diff --git a/test/testcondition.cpp b/test/testcondition.cpp index bbe4ef312b8..74707e51d5a 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -110,6 +110,7 @@ class TestCondition : public TestFixture { TEST_CASE(alwaysTrueLoop); TEST_CASE(alwaysTrueTryCatch); TEST_CASE(alwaysTrueSideEffect); + TEST_CASE(alwaysTruePremiumMisra); TEST_CASE(multiConditionAlwaysTrue); TEST_CASE(duplicateCondition); @@ -5625,6 +5626,20 @@ class TestCondition : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void alwaysTruePremiumMisra() { + const char code[] = "void f() {\n" + " if (3 > 2) {}\n" + "}"; + + check(code); + ASSERT_EQUALS("", errout_str()); + + Settings misraSettings; + misraSettings.premiumArgs = "--misra-c-2012"; + check(code, misraSettings); + ASSERT_EQUALS("[test.cpp:2:9]: (style) Condition '3>2' is always true [knownConditionTrueFalse]\n", errout_str()); + } + void multiConditionAlwaysTrue() { check("void f() {\n" " int val = 0;\n"