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:
Ted Kremenek 2009-09-27 22:39:07 +00:00
Родитель bada1aad09
Коммит 13c200061a
1 изменённых файлов: 9 добавлений и 5 удалений

Просмотреть файл

@ -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);