forked from OSchip/llvm-project
Revert r105097. Thinking about a better fix.
llvm-svn: 105099
This commit is contained in:
parent
9ab9a7fb29
commit
94aec9381d
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue