From 7ce598aeee556aa638ac19b2604a0a6b224df7f8 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Mon, 3 Jun 2013 23:00:09 +0000 Subject: [PATCH] [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 --- clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 17 +++++++++- 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 c19e12ca82a4..305450aaeaa7 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 3b42d3c7a7bf..7dcf0a454b97 100644 --- a/clang/test/Analysis/edges-new.mm +++ b/clang/test/Analysis/edges-new.mm @@ -12885,40 +12885,6 @@ void longLines() { // CHECK-NEXT: end // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line535 -// CHECK-NEXT: col3 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: line535 -// CHECK-NEXT: col4 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: kindcontrol -// CHECK-NEXT: edges -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: start -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: line535 -// CHECK-NEXT: col3 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: line535 -// CHECK-NEXT: col4 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: end -// CHECK-NEXT: -// CHECK-NEXT: // CHECK-NEXT: line537 // CHECK-NEXT: col3 // CHECK-NEXT: file0