]> granicus.if.org Git - clang/commitdiff
Add "GetSValAsScalarOrLoc" methods to GRState/GRStateRef that only perform a
authorTed Kremenek <kremenek@apple.com>
Wed, 4 Mar 2009 00:13:10 +0000 (00:13 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 4 Mar 2009 00:13:10 +0000 (00:13 +0000)
retrieval from the store/environment for locations or scalar types.

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

include/clang/Analysis/PathSensitive/GRState.h
lib/Analysis/GRState.cpp

index ac474edfdf53d756d93dae4b7b6eca48bc246045..b3f4dea86088272604e8f337ae150843219aa961 100644 (file)
@@ -407,6 +407,17 @@ public:
   SVal GetSVal(const GRState* St, Stmt* Ex) {
     return St->getEnvironment().GetSVal(Ex, BasicVals);
   }
+  
+  SVal GetSValAsScalarOrLoc(const GRState* state, const Stmt *S) {
+    if (const Expr *Ex = dyn_cast<Expr>(S)) {
+      QualType T = Ex->getType();
+      if (Loc::IsLocType(T) || T->isIntegerType())
+        return GetSVal(state, S);
+    }
+    
+    return UnknownVal();
+  }
+    
 
   SVal GetSVal(const GRState* St, const Stmt* Ex) {
     return St->getEnvironment().GetSVal(const_cast<Stmt*>(Ex), BasicVals);
@@ -416,6 +427,8 @@ public:
     return St->getEnvironment().GetBlkExprSVal(Ex, BasicVals);
   }
   
+  
+  
   const GRState* BindExpr(const GRState* St, Stmt* Ex, SVal V,
                           bool isBlkExpr, bool Invalidate) {
     
@@ -473,6 +486,16 @@ public:
   SVal GetSVal(const GRState* state, const MemRegion* R) {
     return StoreMgr->Retrieve(state, loc::MemRegionVal(R));
   }  
+
+  SVal GetSValAsScalarOrLoc(const GRState* state, const MemRegion *R) {
+    if (const TypedRegion *TR = dyn_cast<TypedRegion>(R)) {
+      QualType T = TR->getRValueType(getContext());
+      if (Loc::IsLocType(T) || T->isIntegerType())
+        return GetSVal(state, R);
+    }
+  
+    return UnknownVal();
+  }
   
   const GRState* BindLoc(const GRState* St, Loc LV, SVal V) {
     return StoreMgr->Bind(St, LV, V);
@@ -637,6 +660,10 @@ public:
     return Mgr->GetBlkExprSVal(St, Ex);
   }
   
+  SVal GetSValAsScalarOrLoc(const Expr *Ex) {
+    return Mgr->GetSValAsScalarOrLoc(St, Ex);
+  }
+
   SVal GetSVal(Loc LV, QualType T = QualType()) {
     return Mgr->GetSVal(St, LV, T);
   }
@@ -645,6 +672,10 @@ public:
     return Mgr->GetSVal(St, R);
   }
   
+  SVal GetSValAsScalarOrLoc(const MemRegion *R) {
+    return Mgr->GetSValAsScalarOrLoc(St, R);
+  }
+
   GRStateRef BindExpr(Stmt* Ex, SVal V, bool isBlkExpr, bool Invalidate) {
     return GRStateRef(Mgr->BindExpr(St, Ex, V, isBlkExpr, Invalidate), *Mgr);
   }
index eb6b1b5cfaa963347c9f31e8af6d9d242254118f..85a85f207d8de2b7a03b1c96254a97e513979c0d 100644 (file)
@@ -257,7 +257,7 @@ bool ScanReachableSymbols::scan(SVal val) {
 }
   
 bool ScanReachableSymbols::scan(const MemRegion *R) {
-  if (visited.count(R))
+  if (isa<MemSpaceRegion>(R) || visited.count(R))
     return true;
   
   visited.insert(R);
@@ -273,7 +273,7 @@ bool ScanReachableSymbols::scan(const MemRegion *R) {
       return false;
   
   // Now look at the binding to this region (if any).
-  if (!scan(state.GetSVal(R)))
+  if (!scan(state.GetSValAsScalarOrLoc(R)))
     return false;
   
   // Now look at the subregions.