diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp | 9 | ||||
| -rw-r--r-- | clang/test/Analysis/NewDeleteLeaks-PR18394.cpp | 16 | 
2 files changed, 23 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp b/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp index e9c4a35de6e..7812c96f869 100644 --- a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp @@ -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;  } diff --git a/clang/test/Analysis/NewDeleteLeaks-PR18394.cpp b/clang/test/Analysis/NewDeleteLeaks-PR18394.cpp new file mode 100644 index 00000000000..452781d07a5 --- /dev/null +++ b/clang/test/Analysis/NewDeleteLeaks-PR18394.cpp @@ -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;
 +}
  | 

