diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-04-01 21:12:06 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-04-01 21:12:06 +0000 |
commit | 9e2d98d3f6fc225df1df2aec6986a3bee5dd2987 (patch) | |
tree | 39618ee855c66f8d388127820593299949264215 /lib/Analysis/BugReporter.cpp | |
parent | bf54a06f9b771c2a2730cc63eb89bce0522515b5 (diff) |
BugReporter, extensive path-diagnostics: add an extra control-flow edge to the
enclosing statement when jumping to a subexpression.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68244 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BugReporter.cpp')
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index 434b2d5cde..5047e71804 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -793,6 +793,38 @@ static void GenExtAddEdge(PathDiagnostic& PD, return; } + // Add an extra edge when jumping between contexts. + while (1) { + if (const Stmt *PS = PrevLoc.asStmt()) + if (const Stmt *NS = NewLoc.asStmt()) { + PathDiagnosticLocation X = PDB.getEnclosingStmtLocation(PS); + // FIXME: We need a version of getParent that ignores '()' and casts. + const Stmt *parentX = PDB.getParent(X.asStmt()); + + const PathDiagnosticLocation &Y = PDB.getEnclosingStmtLocation(NS); + // FIXME: We need a version of getParent that ignores '()' and casts. + const Stmt *parentY = PDB.getParent(Y.asStmt()); + + if (IsControlFlowExpr(parentX)) { + if (IsControlFlowExpr(parentY) && parentX == parentY) { + break; + } + else { + const PathDiagnosticLocation &W = + PDB.getEnclosingStmtLocation(PDB.getParent(parentX)); + + if (W != Y) X = W; + } + } + + if (X != Y && PrevLoc.asLocation() != X.asLocation()) { + PD.push_front(new PathDiagnosticControlFlowPiece(X, PrevLoc)); + PrevLoc = X; + } + } + break; + } + PD.push_front(new PathDiagnosticControlFlowPiece(NewLoc, PrevLoc)); PrevLoc = NewLoc; } |