From: Ted Kremenek Date: Sun, 27 Sep 2009 22:39:07 +0000 (+0000) Subject: Specially handle fields, elements, and ivars in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13c200061ac1dd2a7641da6a9394a5dffab08d3b;p=clang 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 --- diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index da04d68dcf..5d3fa7292b 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -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(R) || isa(R) || isa(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);