From e571e598b67483559c80e9a29c3f9e52c1cec5fa Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Sat, 28 Apr 2018 11:56:13 -0500 Subject: [PATCH] Fix false positive with inner conditions when using pointers (#1195) --- lib/checkcondition.cpp | 2 +- test/testcondition.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 57b589a49..561cc23d3 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -645,7 +645,7 @@ void CheckCondition::multiCondition2() const Token *parent = tok; while (Token::Match(parent->astParent(), ".|[") || (Token::simpleMatch(parent->astParent(), "*") && !parent->astParent()->astOperand2())) parent = parent->astParent(); - if (Token::Match(parent->astParent(), "%assign%")) + if (Token::Match(parent->astParent(), "%assign%|++|--")) break; } if (_tokenizer->isCPP() && Token::Match(tok, "%name% <<") && (!tok->valueType() || !tok->valueType()->isIntegral())) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 90a017f00..2ac56b277 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -90,6 +90,7 @@ private: TEST_CASE(identicalInnerCondition); TEST_CASE(identicalConditionAfterEarlyExit); + TEST_CASE(innerConditionModified); TEST_CASE(clarifyCondition1); // if (a = b() < 0) TEST_CASE(clarifyCondition2); // if (a & b == c) @@ -1989,6 +1990,32 @@ private: ASSERT_EQUALS("", errout.str()); } + void innerConditionModified() { + check("void f(int x, int y) {\n" + " if (x == 0) {\n" + " x += y;\n" + " if (x == 0) {}\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + check("void f(int x) {\n" + " if (x == 0) {\n" + " x += y;\n" + " if (x == 1) {}\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + check("void f(int * x, int * y) {\n" + " if (x[*y] == 0) {\n" + " (*y)++;\n" + " if (x[*y] == 0) {}\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } + // clarify conditions with = and comparison void clarifyCondition1() { check("void f() {\n"