From: Jordan Rose Date: Fri, 8 Nov 2013 01:15:30 +0000 (+0000) Subject: [analyzer] Specialize "loop executed 0 times" for for-in and for-range loops. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=64cc0c37f78719f905029a9099445c214cb40ce3;p=clang [analyzer] Specialize "loop executed 0 times" for for-in and for-range loops. The path note that says "Loop body executed 0 times" has been changed to "Loop body skipped when range is empty" for C++11 for-range loops, and to "Loop body skipped when collection is empty" for Objective-C for-in loops. Part of git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194234 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index 6bb9ffcea9..1940fa79fd 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1629,6 +1629,10 @@ static const Stmt *getTerminatorCondition(const CFGBlock *B) { static const char StrEnteringLoop[] = "Entering loop body"; static const char StrLoopBodyZero[] = "Loop body executed 0 times"; +static const char StrLoopRangeEmpty[] = + "Loop body skipped when range is empty"; +static const char StrLoopCollectionEmpty[] = + "Loop body skipped when collection is empty"; static bool GenerateAlternateExtensivePathDiagnostic(PathDiagnostic& PD, @@ -1827,7 +1831,13 @@ GenerateAlternateExtensivePathDiagnostic(PathDiagnostic& PD, if (isJumpToFalseBranch(&*BE)) { if (!IsInLoopBody) { - str = StrLoopBodyZero; + if (isa(Term)) { + str = StrLoopCollectionEmpty; + } else if (isa(Term)) { + str = StrLoopRangeEmpty; + } else { + str = StrLoopBodyZero; + } } } else { str = StrEnteringLoop; @@ -2072,7 +2082,8 @@ static void simplifySimpleBranches(PathPieces &pieces) { PathDiagnosticEventPiece *EV = dyn_cast(*NextI); if (EV) { StringRef S = EV->getString(); - if (S == StrEnteringLoop || S == StrLoopBodyZero) { + if (S == StrEnteringLoop || S == StrLoopBodyZero || + S == StrLoopCollectionEmpty || S == StrLoopRangeEmpty) { ++NextI; continue; } diff --git a/test/Analysis/cxx-for-range.cpp b/test/Analysis/cxx-for-range.cpp index 1889a5557f..fe73e51410 100644 --- a/test/Analysis/cxx-for-range.cpp +++ b/test/Analysis/cxx-for-range.cpp @@ -1133,9 +1133,9 @@ void testLoopErrorInRange() { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -1550,9 +1550,9 @@ void testLoopErrorInRange() { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol diff --git a/test/Analysis/edges-new.mm b/test/Analysis/edges-new.mm index e10652b951..8019c15c1b 100644 --- a/test/Analysis/edges-new.mm +++ b/test/Analysis/edges-new.mm @@ -2925,9 +2925,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -12896,9 +12896,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -13415,9 +13415,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -14150,9 +14150,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -14669,9 +14669,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -15467,9 +15467,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -15986,9 +15986,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -16881,9 +16881,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when collection is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -17400,9 +17400,9 @@ namespace rdar14960554 { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: message -// CHECK-NEXT: Loop body executed 0 times +// CHECK-NEXT: Loop body skipped when range is empty // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol