From 1e1ba6b4a92acce24c13c464f4f3a957dd117df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 14 Jun 2015 20:06:05 +0200 Subject: [PATCH] Fixed #6574 (False positive oppositeInnerCondition - unknown variable) --- lib/checkcondition.cpp | 4 ++-- test/testcondition.cpp | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 3772505c8..f95d9e46c 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -413,7 +413,7 @@ void CheckCondition::oppositeInnerCondition() bool nonlocal = false; // nonlocal variable used in condition std::set vars; // variables used in condition - for (const Token *cond = scope->classDef; cond != scope->classDef->linkAt(1); cond = cond->next()) { + for (const Token *cond = scope->classDef->linkAt(1); cond != scope->classDef; cond = cond->previous()) { if (cond->varId()) { vars.insert(cond->varId()); const Variable *var = cond->variable(); @@ -422,7 +422,7 @@ void CheckCondition::oppositeInnerCondition() nonlocal |= (var && (var->isPointer() || var->isReference())); } else if (cond->isName()) { // varid is 0. this is possibly a nonlocal variable.. - nonlocal |= (cond->astParent() && cond->astParent()->isConstOp()); + nonlocal |= Token::Match(cond->astParent(), "%cop%|("); } } diff --git a/test/testcondition.cpp b/test/testcondition.cpp index d5752ac1d..d6605e16b 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -1118,7 +1118,6 @@ private: "}"); ASSERT_EQUALS("", errout.str()); - check("void foo(int& i) {\n" " i=6;\n" "}\n" @@ -1249,6 +1248,15 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + // #6574 - another fp when undeclared variable is used + check("void foo() {\n" + " if(i) {\n" + " i++;\n" + " if(!i) {}\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); + // #5874 - array check("void testOppositeConditions2() {\n" " int array[2] = { 0, 0 };\n"