зеркало из 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;
|
||||
}
|
||||
|
||||
// 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.
|
||||
if (const SVal *OldV = B.lookup(R)) {
|
||||
if (const MemRegion *RV = OldV->getAsRegion())
|
||||
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);
|
||||
assert(SymbolManager::canSymbolicate(T) || V.isUnknown());
|
||||
B = RBFactory.Add(B, R, V);
|
||||
|
|
Загрузка…
Ссылка в новой задаче