diff options
author | Anton Yartsev <anton.yartsev@gmail.com> | 2012-12-14 19:48:34 +0000 |
---|---|---|
committer | Anton Yartsev <anton.yartsev@gmail.com> | 2012-12-14 19:48:34 +0000 |
commit | 5363bf157fa61cb2b95d10a97286a49aed37a9db (patch) | |
tree | 19949792112bdcc2a710b07f12cd90bbd326fdcf | |
parent | 53e3d6d7f00ce2efbd46e36685d011234f2efcb9 (diff) | |
download | bcm5719-llvm-5363bf157fa61cb2b95d10a97286a49aed37a9db.tar.gz bcm5719-llvm-5363bf157fa61cb2b95d10a97286a49aed37a9db.zip |
added post-statement callback to CXXNewExpr and pre-statement callback to CXXDeleteExpr
llvm-svn: 170234
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 5c91dd288fa..0f5fad1ac51 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -780,21 +780,28 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } - case Stmt::CXXNewExprClass: { - Bldr.takeNodes(Pred); - const CXXNewExpr *NE = cast<CXXNewExpr>(S); - VisitCXXNewExpr(NE, Pred, Dst); - Bldr.addNodes(Dst); - break; - } - - case Stmt::CXXDeleteExprClass: { - Bldr.takeNodes(Pred); - const CXXDeleteExpr *CDE = cast<CXXDeleteExpr>(S); - VisitCXXDeleteExpr(CDE, Pred, Dst); - Bldr.addNodes(Dst); - break; - } + case Stmt::CXXNewExprClass: {
+ Bldr.takeNodes(Pred);
+ ExplodedNodeSet PostVisit;
+ VisitCXXNewExpr(cast<CXXNewExpr>(S), Pred, PostVisit);
+ getCheckerManager().runCheckersForPostStmt(Dst, PostVisit, S, *this);
+ Bldr.addNodes(Dst);
+ break;
+ }
+
+ case Stmt::CXXDeleteExprClass: {
+ Bldr.takeNodes(Pred);
+ ExplodedNodeSet PreVisit;
+ const CXXDeleteExpr *CDE = cast<CXXDeleteExpr>(S);
+ getCheckerManager().runCheckersForPreStmt(PreVisit, Pred, S, *this);
+
+ for (ExplodedNodeSet::iterator i = PreVisit.begin(),
+ e = PreVisit.end(); i != e ; ++i)
+ VisitCXXDeleteExpr(CDE, *i, Dst);
+
+ Bldr.addNodes(Dst);
+ break;
+ }
// FIXME: ChooseExpr is really a constant. We need to fix // the CFG do not model them as explicit control-flow. |