aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/BugReporter.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-04-01 17:18:21 +0000
committerTed Kremenek <kremenek@apple.com>2009-04-01 17:18:21 +0000
commitc3f83ad7adaff2623986aa1c3e57833babd03d50 (patch)
tree60cb7994c31aa67d21e96cac38f73ea214e678af /lib/Analysis/BugReporter.cpp
parent32c6093bc9d9d51d00d14b22e5a85f3070d2b900 (diff)
BugReporter: For the "extensive" PathDiagnostic generation algorithm, elide most
intra-compound statement jumps unless they are between terminators (i.e., branches). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68216 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BugReporter.cpp')
-rw-r--r--lib/Analysis/BugReporter.cpp34
1 files changed, 21 insertions, 13 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp
index f54200b040..c8f54c0410 100644
--- a/lib/Analysis/BugReporter.cpp
+++ b/lib/Analysis/BugReporter.cpp
@@ -144,6 +144,10 @@ public:
return *PM.get();
}
+ const Stmt *getParent(const Stmt *S) {
+ return getParentMap().getParent(S);
+ }
+
ExplodedGraph<GRState>& getGraph() { return *ReportGraph; }
NodeMapClosure& getNodeMapClosure() { return NMC; }
ASTContext& getContext() { return BR.getContext(); }
@@ -756,7 +760,7 @@ static void GenExtAddEdge(PathDiagnostic& PD,
PathDiagnosticBuilder &PDB,
PathDiagnosticLocation NewLoc,
PathDiagnosticLocation &PrevLoc,
- PathDiagnosticLocation UpdateLoc) {
+ bool allowBlockJump = false) {
if (const Stmt *S = NewLoc.asStmt()) {
if (IsControlFlowExpr(S))
@@ -771,9 +775,18 @@ static void GenExtAddEdge(PathDiagnostic& PD,
if (NewLoc == PrevLoc)
return;
+
+ // Are we jumping between statements with the same compound statement?
+ if (!allowBlockJump)
+ if (const Stmt *PS = PrevLoc.asStmt())
+ if (const Stmt *NS = NewLoc.asStmt()) {
+ const Stmt *parentPS = PDB.getParent(PS);
+ if (isa<CompoundStmt>(parentPS) && parentPS == PDB.getParent(NS))
+ return;
+ }
PD.push_front(new PathDiagnosticControlFlowPiece(NewLoc, PrevLoc));
- PrevLoc = UpdateLoc;
+ PrevLoc = NewLoc;
}
static bool IsNestedDeclStmt(const Stmt *S, ParentMap &PM) {
@@ -799,13 +812,6 @@ static bool IsNestedDeclStmt(const Stmt *S, ParentMap &PM) {
return false;
}
-static void GenExtAddEdge(PathDiagnostic& PD,
- PathDiagnosticBuilder &PDB,
- const PathDiagnosticLocation &NewLoc,
- PathDiagnosticLocation &PrevLoc) {
- GenExtAddEdge(PD, PDB, NewLoc, PrevLoc, NewLoc);
-}
-
static void GenerateExtensivePathDiagnostic(PathDiagnostic& PD,
PathDiagnosticBuilder &PDB,
const ExplodedNode<GRState> *N) {
@@ -828,7 +834,8 @@ static void GenerateExtensivePathDiagnostic(PathDiagnostic& PD,
const Stmt *Cond = Blk.getTerminatorCondition();
if (!Cond || !IsControlFlowExpr(Cond)) {
- GenExtAddEdge(PD, PDB, PathDiagnosticLocation(Term, SMgr), PrevLoc);
+ GenExtAddEdge(PD, PDB, PathDiagnosticLocation(Term, SMgr), PrevLoc,
+ true);
continue;
}
}
@@ -851,9 +858,10 @@ static void GenerateExtensivePathDiagnostic(PathDiagnostic& PD,
if (const BlockEntrance *BE = dyn_cast<BlockEntrance>(&P)) {
if (const Stmt* S = BE->getFirstStmt()) {
if (!IsControlFlowExpr(S) && !IsNestedDeclStmt(S, PDB.getParentMap())) {
- // Are we jumping with the same enclosing statement?
- if (PrevLoc.isValid() && PDB.getEnclosingStmtLocation(S) ==
- PDB.getEnclosingStmtLocation(PrevLoc)) {
+ if (PrevLoc.isValid()) {
+ // Are we jumping with the same enclosing statement?
+ if (PDB.getEnclosingStmtLocation(S) ==
+ PDB.getEnclosingStmtLocation(PrevLoc))
continue;
}