diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-04-01 17:18:21 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-04-01 17:18:21 +0000 |
commit | c3f83ad7adaff2623986aa1c3e57833babd03d50 (patch) | |
tree | 60cb7994c31aa67d21e96cac38f73ea214e678af /lib/Analysis/BugReporter.cpp | |
parent | 32c6093bc9d9d51d00d14b22e5a85f3070d2b900 (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.cpp | 34 |
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; } |