r194234 - [analyzer] Specialize "loop executed 0 times" for for-in and for-range loops.
Jordan Rose
jordan_rose at apple.com
Thu Nov 7 17:15:30 PST 2013
Author: jrose
Date: Thu Nov 7 19:15:30 2013
New Revision: 194234
URL: http://llvm.org/viewvc/llvm-project?rev=194234&view=rev
Log:
[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 <rdar://problem/14992886>
Modified:
cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
cfe/trunk/test/Analysis/cxx-for-range.cpp
cfe/trunk/test/Analysis/edges-new.mm
Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp?rev=194234&r1=194233&r2=194234&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp Thu Nov 7 19:15:30 2013
@@ -1629,6 +1629,10 @@ static const Stmt *getTerminatorConditio
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
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(PathP
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;
}
Modified: cfe/trunk/test/Analysis/cxx-for-range.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cxx-for-range.cpp?rev=194234&r1=194233&r2=194234&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/cxx-for-range.cpp (original)
+++ cfe/trunk/test/Analysis/cxx-for-range.cpp Thu Nov 7 19:15:30 2013
@@ -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>
Modified: cfe/trunk/test/Analysis/edges-new.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/edges-new.mm?rev=194234&r1=194233&r2=194234&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/edges-new.mm (original)
+++ cfe/trunk/test/Analysis/edges-new.mm Thu Nov 7 19:15:30 2013
@@ -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>
More information about the cfe-commits
mailing list