From: Ted Kremenek Date: Sun, 2 Aug 2009 05:00:15 +0000 (+0000) Subject: RegionStoreManager::RemoveDeadBindings() now removes dead 'default' bindings as well. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=093569cfab473e7b461523136a4df30a0473324d;p=clang RegionStoreManager::RemoveDeadBindings() now removes dead 'default' bindings as well. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77875 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/GRState.h b/include/clang/Analysis/PathSensitive/GRState.h index 443879a7dd..f60b866d65 100644 --- a/include/clang/Analysis/PathSensitive/GRState.h +++ b/include/clang/Analysis/PathSensitive/GRState.h @@ -127,6 +127,8 @@ public: /// getGDM - Return the generic data map associated with this state. GenericDataMap getGDM() const { return GDM; } + void setGDM(GenericDataMap gdm) { GDM = gdm; } + /// Profile - Profile the contents of a GRState object for use /// in a FoldingSet. static void Profile(llvm::FoldingSetNodeID& ID, const GRState* V) { diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index c95f6c86f9..32a1dc0175 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -1763,10 +1763,40 @@ void RegionStoreManager::RemoveDeadBindings(GRState &state, Stmt* Loc, SymReaper.maybeDead(*SI); } - // FIXME: remove default bindings as well. - + // Remove dead 'default' bindings. + RegionDefaultValue::MapTy NewDVM = DVM; + RegionDefaultValue::MapTy::Factory &DVMFactory = + state.get_context(); + + for (RegionDefaultValue::MapTy::iterator I = DVM.begin(), E = DVM.end(); + I != E; ++I) { + const MemRegion *R = I.getKey(); + + // If this region live? Is so, none of its symbols are dead. + if (Marked.count(R)) + continue; + + // Remove this dead region. + NewDVM = DVMFactory.Remove(NewDVM, R); + + // Mark all non-live symbols that this region references as dead. + if (const SymbolicRegion* SymR = dyn_cast(R)) + SymReaper.maybeDead(SymR->getSymbol()); + + SVal X = I.getData(); + SVal::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end(); + for (; SI != SE; ++SI) + SymReaper.maybeDead(*SI); + } + // Write the store back. state.setStore(store); + + // Write the updated default bindings back. + // FIXME: Right now this involves a fetching of a persistent state. + // We can do better. + if (DVM != NewDVM) + state.setGDM(state.set(NewDVM)->getGDM()); } //===----------------------------------------------------------------------===//