From d80755dac2cf295f9322d6960812af3d00d20dd6 Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Wed, 21 Apr 2010 02:17:31 +0000 Subject: [PATCH] Add initial support for C++ delete expr. llvm-svn: 101980 --- .../clang/Checker/PathSensitive/GRExprEngine.h | 3 +++ clang/lib/Checker/GRCXXExprEngine.cpp | 13 ++++++++++++- clang/lib/Checker/GRExprEngine.cpp | 6 +++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Checker/PathSensitive/GRExprEngine.h b/clang/include/clang/Checker/PathSensitive/GRExprEngine.h index 7e8f753a83df..85c2a6912b08 100644 --- a/clang/include/clang/Checker/PathSensitive/GRExprEngine.h +++ b/clang/include/clang/Checker/PathSensitive/GRExprEngine.h @@ -364,6 +364,9 @@ public: void VisitCXXNewExpr(CXXNewExpr *CNE, ExplodedNode *Pred, ExplodedNodeSet &Dst); + void VisitCXXDeleteExpr(CXXDeleteExpr *CDE, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + void VisitAggExpr(const Expr *E, SVal Dest, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Checker/GRCXXExprEngine.cpp b/clang/lib/Checker/GRCXXExprEngine.cpp index 378f150b7138..6a1aa1b2745a 100644 --- a/clang/lib/Checker/GRCXXExprEngine.cpp +++ b/clang/lib/Checker/GRCXXExprEngine.cpp @@ -220,9 +220,20 @@ void GRExprEngine::VisitCXXNewExpr(CXXNewExpr *CNE, ExplodedNode *Pred, } } +void GRExprEngine::VisitCXXDeleteExpr(CXXDeleteExpr *CDE, ExplodedNode *Pred, + ExplodedNodeSet &Dst) { + // Should do more checking. + ExplodedNodeSet ArgEvaluated; + Visit(CDE->getArgument(), Pred, ArgEvaluated); + for (ExplodedNodeSet::iterator I = ArgEvaluated.begin(), + E = ArgEvaluated.end(); I != E; ++I) { + const GRState *state = GetState(*I); + MakeNode(Dst, CDE, *I, state); + } +} void GRExprEngine::VisitCXXThisExpr(CXXThisExpr *TE, ExplodedNode *Pred, - ExplodedNodeSet & Dst) { + ExplodedNodeSet &Dst) { // Get the this object region from StoreManager. const MemRegion *R = ValMgr.getRegionManager().getCXXThisRegion( diff --git a/clang/lib/Checker/GRExprEngine.cpp b/clang/lib/Checker/GRExprEngine.cpp index a39e7f57b1cf..41e52436ce9b 100644 --- a/clang/lib/Checker/GRExprEngine.cpp +++ b/clang/lib/Checker/GRExprEngine.cpp @@ -589,7 +589,6 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) { case Stmt::CXXCatchStmtClass: case Stmt::CXXConstructExprClass: case Stmt::CXXDefaultArgExprClass: - case Stmt::CXXDeleteExprClass: case Stmt::CXXDependentScopeMemberExprClass: case Stmt::CXXExprWithTemporariesClass: case Stmt::CXXNamedCastExprClass: @@ -724,6 +723,11 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) { break; } + case Stmt::CXXDeleteExprClass: { + CXXDeleteExpr *CDE = cast(S); + VisitCXXDeleteExpr(CDE, Pred, Dst); + break; + } // FIXME: ChooseExpr is really a constant. We need to fix // the CFG do not model them as explicit control-flow.