зеркало из https://github.com/microsoft/clang-1.git
Specially handle fields, elements, and ivars in
RegionStoreManager::InvalidateRegion() by only removing their old binding, not conjuring a new symbol. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82939 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
bada1aad09
Коммит
13c200061a
|
@ -514,17 +514,21 @@ const GRState *RegionStoreManager::InvalidateRegion(const GRState *state,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Special case FieldRegion/ElementRegion for more
|
|
||||||
// efficient invalidation. We don't need to conjure symbols for
|
|
||||||
// these regions in all cases.
|
|
||||||
|
|
||||||
// Get the old binding. Is it a region? If so, add it to the worklist.
|
// Get the old binding. Is it a region? If so, add it to the worklist.
|
||||||
if (const SVal *OldV = B.lookup(R)) {
|
if (const SVal *OldV = B.lookup(R)) {
|
||||||
if (const MemRegion *RV = OldV->getAsRegion())
|
if (const MemRegion *RV = OldV->getAsRegion())
|
||||||
WorkList.push_back(RV);
|
WorkList.push_back(RV);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invalidate the binding.
|
if (isa<FieldRegion>(R) || isa<ElementRegion>(R) || isa<ObjCIvarRegion>(R)){
|
||||||
|
// For fields and elements, only remove the old binding. The super
|
||||||
|
// region will get set with a default value from which we can lazily
|
||||||
|
// derive a new symbolic value.
|
||||||
|
B = RBFactory.Remove(B, R);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalidate the binding by conjuring a new symbol.
|
||||||
DefinedOrUnknownSVal V = ValMgr.getConjuredSymbolVal(R, Ex, T, Count);
|
DefinedOrUnknownSVal V = ValMgr.getConjuredSymbolVal(R, Ex, T, Count);
|
||||||
assert(SymbolManager::canSymbolicate(T) || V.isUnknown());
|
assert(SymbolManager::canSymbolicate(T) || V.isUnknown());
|
||||||
B = RBFactory.Add(B, R, V);
|
B = RBFactory.Add(B, R, V);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче