diff options
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 15 | ||||
-rw-r--r-- | clang/test/Analysis/cxx-for-range.cpp | 8 | ||||
-rw-r--r-- | clang/test/Analysis/edges-new.mm | 36 |
3 files changed, 35 insertions, 24 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp index 6bb9ffcea92..1940fa79fda 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/clang/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<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; } diff --git a/clang/test/Analysis/cxx-for-range.cpp b/clang/test/Analysis/cxx-for-range.cpp index 1889a5557f6..fe73e51410a 100644 --- a/clang/test/Analysis/cxx-for-range.cpp +++ b/clang/test/Analysis/cxx-for-range.cpp @@ -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> diff --git a/clang/test/Analysis/edges-new.mm b/clang/test/Analysis/edges-new.mm index e10652b9512..8019c15c1b2 100644 --- a/clang/test/Analysis/edges-new.mm +++ b/clang/test/Analysis/edges-new.mm @@ -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> |