diff options
| author | Jordan Rose <jordan_rose@apple.com> | 2013-06-03 23:00:09 +0000 |
|---|---|---|
| committer | Jordan Rose <jordan_rose@apple.com> | 2013-06-03 23:00:09 +0000 |
| commit | 7ce598aeee556aa638ac19b2604a0a6b224df7f8 (patch) | |
| tree | 45892f9a8a61786edcc55cdcf2e096df8e3d0487 | |
| parent | 5f16849b346355f53e721d3c87129ea224aca491 (diff) | |
| download | bcm5719-llvm-7ce598aeee556aa638ac19b2604a0a6b224df7f8.tar.gz bcm5719-llvm-7ce598aeee556aa638ac19b2604a0a6b224df7f8.zip | |
[analyzer; new edges] Omit subexpression back-edges that span multiple lines.
A.1 -> A -> B
becomes
A.1 -> B
This only applies if there's an edge from a subexpression to its parent
expression, and that is immediately followed by another edge from the
parent expression to a subsequent expression. Normally this is useful for
bringing the edges back to the left side of the code, but when the
subexpression is on a different line the backedge ends up looking strange,
and may even obscure code. In these cases, it's better to just continue
to the next top-level statement.
llvm-svn: 183164
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 17 | ||||
| -rw-r--r-- | clang/test/Analysis/edges-new.mm | 34 |
2 files changed, 16 insertions, 35 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp index c19e12ca82a..305450aaeaa 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -2092,7 +2092,7 @@ static void simplifySimpleBranches(PathPieces &pieces) { } } -/// Returns the number of bytes in the given SourceRange. +/// Returns the number of bytes in the given (character-based) SourceRange. /// /// If the locations in the range are not on the same line, returns None. /// @@ -2413,6 +2413,21 @@ static bool optimizeEdges(PathPieces &path, SourceManager &SM, !lexicalContains(PM, s1End, s1Start)) { removeEdge = true; } + // Trim edges from a subexpression back to the top level if the + // subexpression is on a different line. + // + // A.1 -> A -> B + // becomes + // A.1 -> B + // + // These edges just look ugly and don't usually add anything. + else if (s1Start && s2End && + lexicalContains(PM, s1Start, s1End)) { + SourceRange EdgeRange(PieceI->getEndLocation().asLocation(), + PieceI->getStartLocation().asLocation()); + if (!getLengthOnSingleLine(SM, EdgeRange).hasValue()) + removeEdge = true; + } } if (removeEdge) { diff --git a/clang/test/Analysis/edges-new.mm b/clang/test/Analysis/edges-new.mm index 3b42d3c7a7b..7dcf0a454b9 100644 --- a/clang/test/Analysis/edges-new.mm +++ b/clang/test/Analysis/edges-new.mm @@ -12885,40 +12885,6 @@ void longLines() { // CHECK-NEXT: <key>end</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>535</integer> -// CHECK-NEXT: <key>col</key><integer>3</integer> -// CHECK-NEXT: <key>file</key><integer>0</integer> -// CHECK-NEXT: </dict> -// CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>535</integer> -// CHECK-NEXT: <key>col</key><integer>4</integer> -// CHECK-NEXT: <key>file</key><integer>0</integer> -// CHECK-NEXT: </dict> -// CHECK-NEXT: </array> -// CHECK-NEXT: </dict> -// CHECK-NEXT: </array> -// CHECK-NEXT: </dict> -// CHECK-NEXT: <dict> -// CHECK-NEXT: <key>kind</key><string>control</string> -// CHECK-NEXT: <key>edges</key> -// CHECK-NEXT: <array> -// CHECK-NEXT: <dict> -// CHECK-NEXT: <key>start</key> -// CHECK-NEXT: <array> -// CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>535</integer> -// CHECK-NEXT: <key>col</key><integer>3</integer> -// CHECK-NEXT: <key>file</key><integer>0</integer> -// CHECK-NEXT: </dict> -// CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>535</integer> -// CHECK-NEXT: <key>col</key><integer>4</integer> -// CHECK-NEXT: <key>file</key><integer>0</integer> -// CHECK-NEXT: </dict> -// CHECK-NEXT: </array> -// CHECK-NEXT: <key>end</key> -// CHECK-NEXT: <array> -// CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>537</integer> // CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> |

