]> granicus.if.org Git - clang/commitdiff
[analyzer] Specialize "loop executed 0 times" for for-in and for-range loops.
authorJordan Rose <jordan_rose@apple.com>
Fri, 8 Nov 2013 01:15:30 +0000 (01:15 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 8 Nov 2013 01:15:30 +0000 (01:15 +0000)
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 <rdar://problem/14992886>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194234 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/BugReporter.cpp
test/Analysis/cxx-for-range.cpp
test/Analysis/edges-new.mm

index 6bb9ffcea9200839b0e93c46942e1944b3b75f57..1940fa79fda3b8c8c52cc3f878988a24d1be8d8e 100644 (file)
@@ -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<ObjCForCollectionStmt>(Term)) {
+                  str = StrLoopCollectionEmpty;
+                } else if (isa<CXXForRangeStmt>(Term)) {
+                  str = StrLoopRangeEmpty;
+                } else {
+                  str = StrLoopBodyZero;
+                }
               }
             } else {
               str = StrEnteringLoop;
@@ -2072,7 +2082,8 @@ static void simplifySimpleBranches(PathPieces &pieces) {
       PathDiagnosticEventPiece *EV = dyn_cast<PathDiagnosticEventPiece>(*NextI);
       if (EV) {
         StringRef S = EV->getString();
-        if (S == StrEnteringLoop || S == StrLoopBodyZero) {
+        if (S == StrEnteringLoop || S == StrLoopBodyZero ||
+            S == StrLoopCollectionEmpty || S == StrLoopRangeEmpty) {
           ++NextI;
           continue;
         }
index 1889a5557f65a8c6c5446f00692e07559000815d..fe73e51410a8cc5323454893b8b5a81366cbae4e 100644 (file)
@@ -1133,9 +1133,9 @@ void testLoopErrorInRange() {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -1550,9 +1550,9 @@ void testLoopErrorInRange() {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
index e10652b95125ae22fe742968ade306b1a9c21630..8019c15c1b261a6284d2ec2ee6bb22cdcb86df87 100644 (file)
@@ -2925,9 +2925,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -12896,9 +12896,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -13415,9 +13415,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -14150,9 +14150,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -14669,9 +14669,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -15467,9 +15467,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -15986,9 +15986,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -16881,9 +16881,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when collection is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>
@@ -17400,9 +17400,9 @@ namespace rdar14960554 {
 // CHECK-NEXT:      </array>
 // CHECK-NEXT:      <key>depth</key><integer>0</integer>
 // CHECK-NEXT:      <key>extended_message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:      <key>message</key>
-// CHECK-NEXT:      <string>Loop body executed 0 times</string>
+// CHECK-NEXT:      <string>Loop body skipped when range is empty</string>
 // CHECK-NEXT:     </dict>
 // CHECK-NEXT:     <dict>
 // CHECK-NEXT:      <key>kind</key><string>control</string>