diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-04-07 00:12:43 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-04-07 00:12:43 +0000 |
commit | 933c42217fca2407e3d6dedb1ee6b1b390797d0a (patch) | |
tree | db82f7cae3a5e8fef0b2d5daab7b1beae4b4e428 /lib/Analysis/CFRefCount.cpp | |
parent | e97386fdd4e61375dff99be5c339705e89b66d9e (diff) |
retain/release checker: When hunting for the leak location, don't walk the
ExplodedGraph backwards. That may inadvertently result in reverse control-flow
edges in the PathDiagostic.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68477 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 859e6cad1f..d045ee4674 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -2900,12 +2900,40 @@ CFRefLeakReport::getEndPath(BugReporter& br, const ExplodedNode<GRState>* EndN){ GetAllocationSite(BR.getStateManager(), EndN, Sym); // Get the allocate site. - assert (AllocNode); + assert(AllocNode); Stmt* FirstStmt = cast<PostStmt>(AllocNode->getLocation()).getStmt(); SourceManager& SMgr = BR.getContext().getSourceManager(); unsigned AllocLine =SMgr.getInstantiationLineNumber(FirstStmt->getLocStart()); +#if 1 + const ExplodedNode<GRState>* LeakN = EndN; + PathDiagnosticLocation L; + + while (LeakN) { + ProgramPoint P = LeakN->getLocation(); + + if (const PostStmt *PS = dyn_cast<PostStmt>(&P)) { + L = PathDiagnosticLocation(PS->getStmt()->getLocStart(), SMgr); + break; + } + else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) { + if (const Stmt* Term = BE->getSrc()->getTerminator()) { + L = PathDiagnosticLocation(Term->getLocStart(), SMgr); + break; + } + } + + + LeakN = LeakN->succ_empty() ? 0 : *(LeakN->succ_begin()); + } + + if (!L.isValid()) { + CompoundStmt *CS = BR.getStateManager().getCodeDecl().getBody(); + L = PathDiagnosticLocation(CS->getRBracLoc(), SMgr); + } + +#else // Get the leak site. We want to find the last place where the symbol // was used in an expression. const ExplodedNode<GRState>* LeakN = EndN; @@ -2963,6 +2991,7 @@ CFRefLeakReport::getEndPath(BugReporter& br, const ExplodedNode<GRState>* EndN){ // FIXME: We need to do a better job at determing the leak site, e.g., at // the end of function bodies. PathDiagnosticLocation L(S, SMgr); +#endif std::string sbuf; llvm::raw_string_ostream os(sbuf); |