From: Ted Kremenek Date: Fri, 1 May 2009 19:04:28 +0000 (+0000) Subject: Basic Store: Always convert a non::LocAsInteger to a Loc when storing to a pointer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d91719abc2f06304aed05ff4c804b38967d99782;p=clang Basic Store: Always convert a non::LocAsInteger to a Loc when storing to a pointer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70564 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index c9bf9ea566..6f31e7a01e 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/lib/Analysis/BasicStore.cpp @@ -324,32 +324,17 @@ Store BasicStoreManager::BindInternal(Store store, Loc loc, SVal V) { switch (loc.getSubKind()) { case loc::MemRegionKind: { const MemRegion* R = cast(loc).getRegion(); + ASTContext &C = StateMgr.getContext(); // Special case: handle store of pointer values (Loc) to pointers via // a cast to intXX_t*, void*, etc. This is needed to handle // OSCompareAndSwap32Barrier/OSCompareAndSwap64Barrier. if (isa(V) || isa(V)) if (const TypedViewRegion *TR = dyn_cast(R)) { - ASTContext &C = StateMgr.getContext(); QualType T = TR->getLValueType(C); - if (isHigherOrderRawPtr(T, C)) { + if (isHigherOrderRawPtr(T, C)) R = TR->removeViews(); - - if (nonloc::LocAsInteger *X = dyn_cast(&V)) { - // Only convert 'V' to a location iff the underlying region type - // is a location as well. - // FIXME: We are allowing a store of an arbitrary location to - // a pointer. We may wish to flag a type error here if the types - // are incompatible. This may also cause lots of breakage - // elsewhere. Food for thought. - if (const TypedRegion *TyR = dyn_cast(R)) { - if (TyR->isBoundable(C) && - Loc::IsLocType(TyR->getRValueType(C))) - V = X->getLoc(); - } - } - } } if (!(isa(R) || isa(R))) @@ -359,6 +344,20 @@ Store BasicStoreManager::BindInternal(Store store, Loc loc, SVal V) { if (const ObjCIvarRegion *IVR = dyn_cast(R)) if (IVR->getSuperRegion() != SelfRegion) return store; + + if (nonloc::LocAsInteger *X = dyn_cast(&V)) { + // Only convert 'V' to a location iff the underlying region type + // is a location as well. + // FIXME: We are allowing a store of an arbitrary location to + // a pointer. We may wish to flag a type error here if the types + // are incompatible. This may also cause lots of breakage + // elsewhere. Food for thought. + if (const TypedRegion *TyR = dyn_cast(R)) { + if (TyR->isBoundable(C) && + Loc::IsLocType(TyR->getRValueType(C))) + V = X->getLoc(); + } + } BindingsTy B = GetBindings(store); return V.isUnknown()