From 01e65d3e0047f2e3f78367d1edae77e787690845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 3 Sep 2017 10:44:22 +0200 Subject: [PATCH] Improved CheckCondition::multiCondition2 so deeper bugs are found --- lib/checkcondition.cpp | 28 ++++++++++++---------------- test/testcondition.cpp | 7 +++++++ 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 9533c8e5e..9bb72a83e 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -509,11 +509,20 @@ void CheckCondition::multiCondition2() type = MULTICONDITIONTYPE::INNER; } const Token * const endToken = tok->scope()->classEnd; - const Token *ifToken = nullptr; + for (; tok && tok != endToken; tok = tok->next()) { if (Token::simpleMatch(tok, "if (")) { - ifToken = tok; - break; + // Condition.. + const Token *cond2 = tok->next()->astOperand2(); + + if (type == MULTICONDITIONTYPE::INNER) { + if (isOppositeCond(false, _tokenizer->isCPP(), cond1, cond2, _settings->library, true)) + oppositeInnerConditionError(cond1, cond2); + } else { + if (isSameExpression(_tokenizer->isCPP(), true, cond1, cond2, _settings->library, true)) + sameConditionAfterEarlyExitError(cond1, cond2); + } + } if (Token::Match(tok, "%type% (") && nonlocal) // function call -> bailout if there are nonlocal variables break; @@ -545,19 +554,6 @@ void CheckCondition::multiCondition2() break; } } - if (!ifToken) - continue; - - // Condition.. - const Token *cond2 = ifToken->next()->astOperand2(); - - if (type == MULTICONDITIONTYPE::INNER) { - if (isOppositeCond(false, _tokenizer->isCPP(), cond1, cond2, _settings->library, true)) - oppositeInnerConditionError(cond1, cond2); - } else { - if (isSameExpression(_tokenizer->isCPP(), true, cond1, cond2, _settings->library, true)) - sameConditionAfterEarlyExitError(cond1, cond2); - } } } diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 807285cd7..5d0c9e5a2 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -1717,6 +1717,13 @@ private: " if (x > 100) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Same condition, second condition is always false\n", errout.str()); + + check("void f(int x) {\n" + " if (x > 100) { return; }\n" + " if (abc) {}\n" + " if (x > 100) {}\n" + "}"); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Same condition, second condition is always false\n", errout.str()); } // clarify conditions with = and comparison