[cfe-commits] r77481 - in /cfe/trunk: include/clang/Analysis/PathSensitive/MemRegion.h include/clang/Analysis/PathSensitive/SVals.h lib/Analysis/MemRegion.cpp lib/Analysis/SVals.cpp

Ted Kremenek kremenek at apple.com
Wed Jul 29 11:14:27 PDT 2009


Author: kremenek
Date: Wed Jul 29 13:14:27 2009
New Revision: 77481

URL: http://llvm.org/viewvc/llvm-project?rev=77481&view=rev
Log:
Add 'MemRegion::getBaseRegion()', a utility method to strip ElementRegions with
index 0.  This will be used for refinements to InvalidateRegion and CastRegion.

Modified:
    cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
    cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
    cfe/trunk/lib/Analysis/MemRegion.cpp
    cfe/trunk/lib/Analysis/SVals.cpp

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=77481&r1=77480&r2=77481&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Wed Jul 29 13:14:27 2009
@@ -70,6 +70,8 @@
   std::string getString() const;
   
   const MemSpaceRegion *getMemorySpace() const;
+  
+  const MemRegion *getBaseRegion() const;
     
   bool hasStackStorage() const;
   

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h?rev=77481&r1=77480&r2=77481&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h Wed Jul 29 13:14:27 2009
@@ -371,6 +371,8 @@
     return static_cast<MemRegion*>(Data);
   }
   
+  const MemRegion* getBaseRegion() const;
+  
   template <typename REGION>
   const REGION* getRegionAs() const {
     return llvm::dyn_cast<REGION>(getRegion());

Modified: cfe/trunk/lib/Analysis/MemRegion.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/MemRegion.cpp?rev=77481&r1=77480&r2=77481&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/MemRegion.cpp (original)
+++ cfe/trunk/lib/Analysis/MemRegion.cpp Wed Jul 29 13:14:27 2009
@@ -398,3 +398,23 @@
   }
   return R;
 }
+
+const MemRegion *MemRegion::getBaseRegion() const {
+  const MemRegion *R = this;
+  while (true) {
+    if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) {      
+      // FIXME: generalize.  Essentially we want to strip away ElementRegions
+      // that were layered on a symbolic region because of casts.  We only
+      // want to strip away ElementRegions, however, where the index is 0.
+      SVal index = ER->getIndex();
+      if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&index)) {
+        if (CI->getValue().getZExtValue() == 0) {
+          R = ER->getSuperRegion();
+          continue;
+        }
+      }
+    }
+    break;
+  }
+  return R;
+}

Modified: cfe/trunk/lib/Analysis/SVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SVals.cpp?rev=77481&r1=77480&r2=77481&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/SVals.cpp (original)
+++ cfe/trunk/lib/Analysis/SVals.cpp Wed Jul 29 13:14:27 2009
@@ -72,7 +72,7 @@
 // FIXME: should we consider SymbolRef wrapped in CodeTextRegion?
 SymbolRef SVal::getAsLocSymbol() const {
   if (const loc::MemRegionVal *X = dyn_cast<loc::MemRegionVal>(this)) {
-    const MemRegion *R = X->getRegion();
+    const MemRegion *R = X->getBaseRegion();
     
     while (R) {
       // Blast through region views.
@@ -80,7 +80,6 @@
         R = View->getSuperRegion();
         continue;
       }
-      
       if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(R))
         return SymR->getSymbol();
       
@@ -121,6 +120,11 @@
   return 0;
 }
 
+const MemRegion *loc::MemRegionVal::getBaseRegion() const {
+  const MemRegion *R = getRegion();
+  return R ?  R->getBaseRegion() : NULL;
+}
+
 bool SVal::symbol_iterator::operator==(const symbol_iterator &X) const {
   return itr == X.itr;
 }





More information about the cfe-commits mailing list