diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-04-19 11:47:28 +0000 | 
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-04-19 11:47:28 +0000 | 
| commit | b6843f5f356d585415142c07eebfdb81ce6faff1 (patch) | |
| tree | 924d015afd6b446874a9785790c72ee808875b23 /clang/lib/Checker | |
| parent | 44ec555a87aa1639eadc8dd7ee80427be6aee957 (diff) | |
| download | bcm5719-llvm-b6843f5f356d585415142c07eebfdb81ce6faff1.tar.gz bcm5719-llvm-b6843f5f356d585415142c07eebfdb81ce6faff1.zip | |
Analyzer: add support for CXXNewExpr.
llvm-svn: 101771
Diffstat (limited to 'clang/lib/Checker')
| -rw-r--r-- | clang/lib/Checker/GRExprEngine.cpp | 34 | ||||
| -rw-r--r-- | clang/lib/Checker/RegionStore.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Checker/Store.cpp | 7 | 
3 files changed, 40 insertions, 11 deletions
| diff --git a/clang/lib/Checker/GRExprEngine.cpp b/clang/lib/Checker/GRExprEngine.cpp index 405c931e04d..b6b4caadd36 100644 --- a/clang/lib/Checker/GRExprEngine.cpp +++ b/clang/lib/Checker/GRExprEngine.cpp @@ -593,7 +593,6 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) {      case Stmt::CXXDependentScopeMemberExprClass:      case Stmt::CXXExprWithTemporariesClass:      case Stmt::CXXNamedCastExprClass: -    case Stmt::CXXNewExprClass:      case Stmt::CXXNullPtrLiteralExprClass:      case Stmt::CXXPseudoDestructorExprClass:      case Stmt::CXXTemporaryObjectExprClass: @@ -719,6 +718,12 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) {        break;      } +    case Stmt::CXXNewExprClass: { +      CXXNewExpr *NE = cast<CXXNewExpr>(S); +      VisitCXXNewExpr(NE, Pred, Dst); +      break; +    } +        // FIXME: ChooseExpr is really a constant.  We need to fix        //        the CFG do not model them as explicit control-flow. @@ -3365,6 +3370,33 @@ void GRExprEngine::VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE,    }  } +void GRExprEngine::VisitCXXNewExpr(CXXNewExpr *CNE, ExplodedNode *Pred, +                                   ExplodedNodeSet &Dst) { +  if (CNE->isArray()) { +    // FIXME: allocating an array has not been handled. +    return; +  } + +  unsigned Count = Builder->getCurrentBlockCount(); +  DefinedOrUnknownSVal SymVal = getValueManager().getConjuredSymbolVal(NULL,CNE,  +                                                         CNE->getType(), Count); +  const MemRegion *NewReg = cast<loc::MemRegionVal>(SymVal).getRegion(); + +  QualType ObjTy = CNE->getType()->getAs<PointerType>()->getPointeeType(); + +  const ElementRegion *EleReg =  +                         getStoreManager().GetElementZeroRegion(NewReg, ObjTy); + +  const GRState *state = Pred->getState(); + +  Store store = state->getStore(); +  StoreManager::InvalidatedSymbols IS; +  store = getStoreManager().InvalidateRegion(store, EleReg, CNE, Count, &IS); +  state = state->makeWithStore(store); +  state = state->BindExpr(CNE, loc::MemRegionVal(EleReg)); +  MakeNode(Dst, CNE, Pred, state); +} +  const CXXThisRegion *GRExprEngine::getCXXThisRegion(const CXXMethodDecl *D,                                                   const StackFrameContext *SFC) {    Type *T = D->getParent()->getTypeForDecl(); diff --git a/clang/lib/Checker/RegionStore.cpp b/clang/lib/Checker/RegionStore.cpp index 5e71bb0b3c7..73158f29550 100644 --- a/clang/lib/Checker/RegionStore.cpp +++ b/clang/lib/Checker/RegionStore.cpp @@ -346,8 +346,6 @@ public: // Part of public interface to class.    Store CopyLazyBindings(nonloc::LazyCompoundVal V, Store store,                           const TypedRegion *R); -  const ElementRegion *GetElementZeroRegion(const MemRegion *R, QualType T); -    //===------------------------------------------------------------------===//    // State pruning.    //===------------------------------------------------------------------===// @@ -995,14 +993,6 @@ static bool IsReinterpreted(QualType RTy, QualType UsedTy, ASTContext &Ctx) {    return true;  } -const ElementRegion * -RegionStoreManager::GetElementZeroRegion(const MemRegion *R, QualType T) { -  ASTContext &Ctx = getContext(); -  SVal idx = ValMgr.makeZeroArrayIndex(); -  assert(!T.isNull()); -  return MRMgr.getElementRegion(T, idx, R, Ctx); -} -  SVal RegionStoreManager::Retrieve(Store store, Loc L, QualType T) {    assert(!isa<UnknownVal>(L) && "location unknown");    assert(!isa<UndefinedVal>(L) && "location undefined"); diff --git a/clang/lib/Checker/Store.cpp b/clang/lib/Checker/Store.cpp index 80b6586b8b9..c12065b89a0 100644 --- a/clang/lib/Checker/Store.cpp +++ b/clang/lib/Checker/Store.cpp @@ -38,6 +38,13 @@ static bool IsCompleteType(ASTContext &Ctx, QualType Ty) {    return true;  } +const ElementRegion *StoreManager::GetElementZeroRegion(const MemRegion *R,  +                                                        QualType T) { +  SVal idx = ValMgr.makeZeroArrayIndex(); +  assert(!T.isNull()); +  return MRMgr.getElementRegion(T, idx, R, Ctx); +} +  const MemRegion *StoreManager::CastRegion(const MemRegion *R, QualType CastToTy) {    ASTContext& Ctx = StateMgr.getContext(); | 

