[cfe-commits] r119897 - in /cfe/trunk: include/clang/Checker/PathSensitive/GRExprEngine.h lib/Checker/GRCXXExprEngine.cpp lib/Checker/GRExprEngine.cpp lib/Checker/RegionStore.cpp test/Analysis/dtor.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Fri Nov 19 22:53:12 PST 2010
Author: zhongxingxu
Date: Sat Nov 20 00:53:12 2010
New Revision: 119897
URL: http://llvm.org/viewvc/llvm-project?rev=119897&view=rev
Log:
Handle CFGAutomaticObjDtor.
Added:
cfe/trunk/test/Analysis/dtor.cpp
Modified:
cfe/trunk/include/clang/Checker/PathSensitive/GRExprEngine.h
cfe/trunk/lib/Checker/GRCXXExprEngine.cpp
cfe/trunk/lib/Checker/GRExprEngine.cpp
cfe/trunk/lib/Checker/RegionStore.cpp
Modified: cfe/trunk/include/clang/Checker/PathSensitive/GRExprEngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Checker/PathSensitive/GRExprEngine.h?rev=119897&r1=119896&r2=119897&view=diff
==============================================================================
--- cfe/trunk/include/clang/Checker/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Checker/PathSensitive/GRExprEngine.h Sat Nov 20 00:53:12 2010
@@ -428,6 +428,10 @@
void VisitCXXConstructExpr(const CXXConstructExpr *E, const MemRegion *Dest,
ExplodedNode *Pred, ExplodedNodeSet &Dst);
+ void VisitCXXDestructor(const CXXDestructorDecl *DD,
+ const MemRegion *Dest, const Stmt *S,
+ ExplodedNode *Pred, ExplodedNodeSet &Dst);
+
void VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE, ExplodedNode *Pred,
ExplodedNodeSet &Dst);
Modified: cfe/trunk/lib/Checker/GRCXXExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/GRCXXExprEngine.cpp?rev=119897&r1=119896&r2=119897&view=diff
==============================================================================
--- cfe/trunk/lib/Checker/GRCXXExprEngine.cpp (original)
+++ cfe/trunk/lib/Checker/GRCXXExprEngine.cpp Sat Nov 20 00:53:12 2010
@@ -143,6 +143,30 @@
}
}
+void GRExprEngine::VisitCXXDestructor(const CXXDestructorDecl *DD,
+ const MemRegion *Dest,
+ const Stmt *S,
+ ExplodedNode *Pred,
+ ExplodedNodeSet &Dst) {
+ if (!(DD->isThisDeclarationADefinition() && AMgr.shouldInlineCall()))
+ return;
+ // Create the context for 'this' region.
+ const StackFrameContext *SFC = AMgr.getStackFrame(DD,
+ Pred->getLocationContext(),
+ S, Builder->getBlock(),
+ Builder->getIndex());
+
+ const CXXThisRegion *ThisR = getCXXThisRegion(DD->getParent(), SFC);
+
+ CallEnter PP(S, SFC->getAnalysisContext(), Pred->getLocationContext());
+
+ const GRState *state = Pred->getState();
+ state = state->bindLoc(loc::MemRegionVal(ThisR), loc::MemRegionVal(Dest));
+ ExplodedNode *N = Builder->generateNode(PP, state, Pred);
+ if (N)
+ Dst.Add(N);
+}
+
void GRExprEngine::VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE,
ExplodedNode *Pred,
ExplodedNodeSet &Dst) {
Modified: cfe/trunk/lib/Checker/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/GRExprEngine.cpp?rev=119897&r1=119896&r2=119897&view=diff
==============================================================================
--- cfe/trunk/lib/Checker/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Checker/GRExprEngine.cpp Sat Nov 20 00:53:12 2010
@@ -718,6 +718,8 @@
void GRExprEngine::ProcessImplicitDtor(const CFGImplicitDtor D,
GRStmtNodeBuilder &builder) {
+ Builder = &builder;
+
switch (D.getDtorKind()) {
case CFGElement::AutomaticObjectDtor:
ProcessAutomaticObjDtor(cast<CFGAutomaticObjDtor>(D), builder);
@@ -738,6 +740,17 @@
void GRExprEngine::ProcessAutomaticObjDtor(const CFGAutomaticObjDtor D,
GRStmtNodeBuilder &builder) {
+ ExplodedNode *Pred = builder.getBasePredecessor();
+ const GRState *state = Pred->getState();
+ const VarDecl *VD = D.getVarDecl();
+ const CXXRecordDecl *CD = VD->getType()->getAsCXXRecordDecl();
+ const CXXDestructorDecl *DD = CD->getDestructor();
+
+ Loc Dest = state->getLValue(VD, Pred->getLocationContext());
+
+ ExplodedNodeSet Dst;
+ VisitCXXDestructor(DD, cast<loc::MemRegionVal>(Dest).getRegion(),
+ D.getTriggerStmt(), Pred, Dst);
}
void GRExprEngine::ProcessBaseDtor(const CFGBaseDtor D,
Modified: cfe/trunk/lib/Checker/RegionStore.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/RegionStore.cpp?rev=119897&r1=119896&r2=119897&view=diff
==============================================================================
--- cfe/trunk/lib/Checker/RegionStore.cpp (original)
+++ cfe/trunk/lib/Checker/RegionStore.cpp Sat Nov 20 00:53:12 2010
@@ -1828,7 +1828,7 @@
store = Bind(store, ValMgr.makeLoc(MRMgr.getVarRegion(*PI,frame)),ArgVal);
}
} else
- llvm_unreachable("Unhandled call expression.");
+ assert(isa<CXXDestructorDecl>(frame->getDecl()));
return store;
}
Added: cfe/trunk/test/Analysis/dtor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/dtor.cpp?rev=119897&view=auto
==============================================================================
--- cfe/trunk/test/Analysis/dtor.cpp (added)
+++ cfe/trunk/test/Analysis/dtor.cpp Sat Nov 20 00:53:12 2010
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store region -analyzer-inline-call -cfg-add-implicit-dtors -verify %s
+
+class A {
+public:
+ ~A() {
+ int *x = 0;
+ *x = 3; // expected-warning{{Dereference of null pointer}}
+ }
+};
+
+int main() {
+ A a;
+}
More information about the cfe-commits
mailing list