From: Jordan Rose Date: Fri, 21 Feb 2014 00:18:31 +0000 (+0000) Subject: [analyzer] Fix a bug in IdenticalExprChecker concerning while loops. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eea6674f33e53bdbb55ada491f8bfdb13a1725e1;p=clang [analyzer] Fix a bug in IdenticalExprChecker concerning while loops. Somehow both Daniel and I missed the fact that while loops are only identical if they have identical bodies. Patch by Daniel Fahlgren! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201829 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/IdenticalExprChecker.cpp b/lib/StaticAnalyzer/Checkers/IdenticalExprChecker.cpp index a76dff120b..6abfc14877 100644 --- a/lib/StaticAnalyzer/Checkers/IdenticalExprChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/IdenticalExprChecker.cpp @@ -361,8 +361,13 @@ static bool isIdenticalStmt(const ASTContext &Ctx, const Stmt *Stmt1, const WhileStmt *WStmt1 = cast(Stmt1); const WhileStmt *WStmt2 = cast(Stmt2); - return isIdenticalStmt(Ctx, WStmt1->getCond(), WStmt2->getCond(), - IgnoreSideEffects); + if (!isIdenticalStmt(Ctx, WStmt1->getCond(), WStmt2->getCond(), + IgnoreSideEffects)) + return false; + if (!isIdenticalStmt(Ctx, WStmt1->getBody(), WStmt2->getBody(), + IgnoreSideEffects)) + return false; + return true; } case Stmt::IfStmtClass: { const IfStmt *IStmt1 = cast(Stmt1); diff --git a/test/Analysis/identical-expressions.cpp b/test/Analysis/identical-expressions.cpp index 950cdd93ff..e1f51af7c6 100644 --- a/test/Analysis/identical-expressions.cpp +++ b/test/Analysis/identical-expressions.cpp @@ -1287,6 +1287,17 @@ void test_identical_branches_while(bool b) { } } +void test_identical_branches_while_2(bool b) { + int i = 10; + if (b) { // no-warning + while (func()) + i--; + } else { + while (func()) + i++; + } +} + void test_identical_branches_do_while(bool b) { int i = 10; if (b) { // expected-warning {{true and false branches are identical}}