]> granicus.if.org Git - clang/commitdiff
BasicStore:
authorTed Kremenek <kremenek@apple.com>
Thu, 5 Mar 2009 16:31:07 +0000 (16:31 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 5 Mar 2009 16:31:07 +0000 (16:31 +0000)
- Store bindings using a MemRegion -> SVal binding instead of VarDecl -> SVal
  binding. This mirrors some of the idea of RegionStore, but is far simpler and
  not nearly as functional.  This leads to some code simplification and
  some potential for some minor precision hacks.

Along the way...
- constify the use of MemRegion* in a few places
- add operator<<(llvm::raw_ostream, const MemRegion*)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66163 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/MemRegion.h
include/clang/Analysis/PathSensitive/Store.h
lib/Analysis/BasicStore.cpp
lib/Analysis/BugReporter.cpp
lib/Analysis/CFRefCount.cpp

index 2ddaa20d327763350bea96855f89ba988fe53a35..3c9d705176bc02eac11db2c879f1e43f5ff9e587 100644 (file)
@@ -543,9 +543,15 @@ public:
 
 private:
   MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
-};
+};  
+} // end clang namespace
 
+namespace llvm {
+static inline raw_ostream& operator<<(raw_ostream& O,
+                                      const clang::MemRegion* R) { 
+  R->print(O);
+  return O;
+}
+} // end llvm namespace
 
-  
-} // end clang namespace
 #endif
index 4514de752df67d159ef3f1e6ed26edec39c887f1..c52f389370d998b57763bc01495ee911221f6550 100644 (file)
@@ -156,7 +156,7 @@ public:
   public:    
     virtual ~BindingsHandler();
     virtual bool HandleBinding(StoreManager& SMgr, Store store,
-                               MemRegion* R, SVal val) = 0;
+                               const MemRegion* R, SVal val) = 0;
   };
   
   /// iterBindings - Iterate over the bindings in the Store.
index 2e619baf2f48284485234b16079df47343d2d866..edc276803555995468d0f9b36d8361577a7c39c8 100644 (file)
@@ -19,7 +19,7 @@
 
 using namespace clang;
 
-typedef llvm::ImmutableMap<const VarDecl*,SVal> VarBindingsTy;  
+typedef llvm::ImmutableMap<const MemRegion*,SVal> VarBindingsTy;  
 
 namespace {
   
@@ -307,7 +307,7 @@ SVal BasicStoreManager::Retrieve(const GRState* state, Loc loc, QualType T) {
       
       Store store = state->getStore();
       VarBindingsTy B = GetVarBindings(store);
-      VarBindingsTy::data_type* T = B.lookup(R->getDecl());      
+      VarBindingsTy::data_type* T = B.lookup(R);
       return T ? *T : UnknownVal();
     }
       
@@ -341,8 +341,8 @@ Store BasicStoreManager::BindInternal(Store store, Loc loc, SVal V) {
       
       VarBindingsTy B = GetVarBindings(store);
       return V.isUnknown()
-        ? VBFactory.Remove(B, R->getDecl()).getRoot()
-        : VBFactory.Add(B, R->getDecl(), V).getRoot();
+        ? VBFactory.Remove(B, R).getRoot()
+        : VBFactory.Add(B, R, V).getRoot();
     }
     default:
       assert ("SetSVal for given Loc type not yet implemented.");
@@ -360,7 +360,7 @@ Store BasicStoreManager::Remove(Store store, Loc loc) {
         return store;
       
       VarBindingsTy B = GetVarBindings(store);
-      return VBFactory.Remove(B,R->getDecl()).getRoot();
+      return VBFactory.Remove(B, R).getRoot();
     }
     default:
       assert ("Remove for given Loc type not yet implemented.");
@@ -379,14 +379,16 @@ BasicStoreManager::RemoveDeadBindings(const GRState* state, Stmt* Loc,
   typedef SVal::symbol_iterator symbol_iterator;
   
   // Iterate over the variable bindings.
-  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I)
-    if (SymReaper.isLive(Loc, I.getKey())) {
-      RegionRoots.push_back(MRMgr.getVarRegion(I.getKey()));      
+  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) {
+    const VarRegion *VR = cast<VarRegion>(I.getKey());
+    if (SymReaper.isLive(Loc, VR->getDecl())) {
+      RegionRoots.push_back(VR);      
       SVal X = I.getData();
       
       for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI)
         SymReaper.markLive(*SI);
     }
+  }
   
   // Scan for live variables and live symbols.
   llvm::SmallPtrSet<const VarRegion*, 10> Marked;
@@ -427,7 +429,7 @@ BasicStoreManager::RemoveDeadBindings(const GRState* state, Stmt* Loc,
   
   // Remove dead variable bindings.  
   for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) {
-    const VarRegion* R = cast<VarRegion>(MRMgr.getVarRegion(I.getKey()));
+    const VarRegion* R = cast<VarRegion>(I.getKey());
     
     if (!Marked.count(R)) {
       store = Remove(store, Loc::MakeVal(R));
@@ -548,9 +550,10 @@ Store BasicStoreManager::BindDeclInternal(Store store, const VarDecl* VD,
   return store;
 }
 
-void BasicStoreManager::print(Store store, std::ostream& Out,
+void BasicStoreManager::print(Store store, std::ostream& O,
                               const char* nl, const char *sep) {
       
+  llvm::raw_os_ostream Out(O);
   VarBindingsTy B = GetVarBindings(store);
   Out << "Variables:" << nl;
   
@@ -560,7 +563,7 @@ void BasicStoreManager::print(Store store, std::ostream& Out,
     if (isFirst) isFirst = false;
     else Out << nl;
     
-    Out << ' ' << I.getKey()->getNameAsString() << " : ";
+    Out << ' ' << I.getKey() << " : ";
     I.getData().print(Out);
   }
 }
@@ -569,10 +572,9 @@ void BasicStoreManager::print(Store store, std::ostream& Out,
 void BasicStoreManager::iterBindings(Store store, BindingsHandler& f) {
   VarBindingsTy B = GetVarBindings(store);
   
-  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I) {
+  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I)
+    f.HandleBinding(*this, store, I.getKey(), I.getData());
 
-    f.HandleBinding(*this, store, MRMgr.getVarRegion(I.getKey()),I.getData());
-  }
 }
 
 StoreManager::BindingsHandler::~BindingsHandler() {}
index e1265ded1710f507d35eeb0904c85247fc724c9a..88887b1d6c75ea538f0335cdf29e6d73d78ea8b4 100644 (file)
@@ -419,7 +419,8 @@ public:
                        PathDiagnostic& pd, BugReporter& br)
     : Sym(sym), PrevSt(prevst), S(s), VMgr(vmgr), Pred(pred), PD(pd), BR(br) {}
                         
-  bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
+  bool HandleBinding(StoreManager& SMgr, Store store,
+                     const MemRegion* R, SVal V) {
 
     SymbolRef ScanSym;
     
@@ -521,7 +522,8 @@ public:
                      PathDiagnostic& pd)
     : N(n), S(s), BR(br), PD(pd) {}
   
-  bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
+  bool HandleBinding(StoreManager& SMgr, Store store,
+                     const MemRegion* R, SVal V) {
     SymbolRef ScanSym;
   
     if (loc::SymbolVal* SV = dyn_cast<loc::SymbolVal>(&V))
index 6929af32f9313cc9d9f036097bc5d7486d228a07..8c3d9bf366f38b8230285bbcb84de7782f491e40 100644 (file)
@@ -2663,13 +2663,14 @@ namespace {
 class VISIBILITY_HIDDEN FindUniqueBinding :
   public StoreManager::BindingsHandler {
     SymbolRef Sym;
-    MemRegion* Binding;
+    const MemRegion* Binding;
     bool First;
     
   public:
     FindUniqueBinding(SymbolRef sym) : Sym(sym), Binding(0), First(true) {}
     
-  bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal val) {
+  bool HandleBinding(StoreManager& SMgr, Store store, const MemRegion* R,
+                     SVal val) {
     SymbolRef SymV = val.getAsSymbol();
     
     if (!SymV.isValid() || SymV != Sym)
@@ -2686,7 +2687,7 @@ class VISIBILITY_HIDDEN FindUniqueBinding :
   }
     
   operator bool() { return First && Binding; }
-  MemRegion* getRegion() { return Binding; }
+  const MemRegion* getRegion() { return Binding; }
 };  
 }