Revert r105097. Thinking about a better fix.

llvm-svn: 105099
This commit is contained in:
Zhongxing Xu 2010-05-29 06:49:04 +00:00
parent 9ab9a7fb29
commit 94aec9381d
2 changed files with 6 additions and 18 deletions

View File

@ -213,11 +213,6 @@ public:
RegionStoreSubRegionMap *getRegionStoreSubRegionMap(Store store);
/// canHaveDirectBinding - Disallow direct bindings for certain types,
/// like arrays. This lets us distinguish between x and x[0], which was
/// causing PR7218 "Assigning to buf[0] makes buf[1] valid".
bool canHaveDirectBinding (const MemRegion *R);
Optional<SVal> getBinding(RegionBindings B, const MemRegion *R);
Optional<SVal> getDirectBinding(RegionBindings B, const MemRegion *R);
/// getDefaultBinding - Returns an SVal* representing an optional default
@ -949,20 +944,12 @@ SVal RegionStoreManager::EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc R,
//===----------------------------------------------------------------------===//
// Loading values from regions.
//===----------------------------------------------------------------------===//
bool RegionStoreManager::canHaveDirectBinding (const MemRegion *R) {
// Arrays can't have direct binding -- must bind to elements
if (const TypedRegion *TR = dyn_cast<TypedRegion>(R))
if (TR->getValueType(getContext())->isArrayType())
return false;
return true;
}
Optional<SVal> RegionStoreManager::getDirectBinding(RegionBindings B,
const MemRegion *R) {
if (canHaveDirectBinding(R))
if (const SVal *V = Lookup(B, R, BindingKey::Direct))
return *V;
if (const SVal *V = Lookup(B, R, BindingKey::Direct))
return *V;
return Optional<SVal>();
}
@ -1188,8 +1175,9 @@ SVal RegionStoreManager::RetrieveElement(Store store,
// Check if the immediate super region has a direct binding.
if (const Optional<SVal> &V = getDirectBinding(B, superR)) {
if (SymbolRef parentSym = V->getAsSymbol())
if (SymbolRef parentSym = V->getAsSymbol()) {
return ValMgr.getDerivedRegionValueSymbolVal(parentSym, R);
}
if (V->isUnknownOrUndef())
return *V;
@ -1198,7 +1186,6 @@ SVal RegionStoreManager::RetrieveElement(Store store,
// are handled in 'RetrieveFieldOrElementCommon'.
if (const nonloc::LazyCompoundVal *LCV =
dyn_cast<nonloc::LazyCompoundVal>(V)) {
R = MRMgr.getElementRegionWithSuper(R, LCV->getRegion());
return RetrieveElement(LCV->getStore(), R);
}

View File

@ -1,4 +1,5 @@
// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store region -verify %s
// XFAIL: *
char PR7218(char a) {
char buf[2];
buf[0] = a;