[analyzer] Fix for PR18394.

Additional conditions that prevent useful nodes before call from being reclaimed.

llvm-svn: 202553
This commit is contained in:
Anton Yartsev 2014-02-28 22:29:48 +00:00
parent 866e91c9d4
commit 68a172ca16
2 changed files with 23 additions and 2 deletions

View File

@ -90,8 +90,9 @@ bool ExplodedGraph::shouldCollect(const ExplodedNode *node) {
// (7) The LocationContext is the same as the predecessor.
// (8) Expressions that are *not* lvalue expressions.
// (9) The PostStmt isn't for a non-consumed Stmt or Expr.
// (10) The successor is not a CallExpr StmtPoint (so that we would
// be able to find it when retrying a call with no inlining).
// (10) The successor is neither a CallExpr StmtPoint nor a CallEnter or
// PreImplicitCall (so that we would be able to find it when retrying a
// call with no inlining).
// FIXME: It may be safe to reclaim PreCall and PostCall nodes as well.
// Conditions 1 and 2.
@ -153,6 +154,10 @@ bool ExplodedGraph::shouldCollect(const ExplodedNode *node) {
if (CallEvent::isCallStmt(SP->getStmt()))
return false;
// Condition 10, continuation.
if (SuccLoc.getAs<CallEnter>() || SuccLoc.getAs<PreImplicitCall>())
return false;
return true;
}

View File

@ -0,0 +1,16 @@
// RUN: %clang_cc1 -analyzer-config graph-trim-interval=1 -analyzer-max-loop 1 -analyze -analyzer-checker=core,alpha.cplusplus.NewDeleteLeaks -verify %s
// expected-no-diagnostics
class A {
public:
void f() {};
~A() {
for (int i=0; i<3; i++)
f();
}
};
void error() {
A *a = new A();
delete a;
}