]> granicus.if.org Git - clang/commitdiff
Added assumption logic for symbolic non-lvalues when used in conditions such as
authorTed Kremenek <kremenek@apple.com>
Wed, 6 Feb 2008 17:32:17 +0000 (17:32 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 6 Feb 2008 17:32:17 +0000 (17:32 +0000)
"if(x)". On the true branch we know the value is != 0, and on the false branch
we know it is 0.

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

Analysis/GRConstants.cpp
Analysis/RValues.cpp
Analysis/RValues.h

index bd5cb0689b9f1d4db970db79932795cea3b5a3fb..a9371ee4e6b4073d5606284d8d4e73fec0ce46cc 100644 (file)
@@ -898,6 +898,19 @@ GRConstants::StateTy GRConstants::Assume(StateTy St, NonLValue Cond,
       assert (false && "'Assume' not implemented for this NonLValue.");
       return St;
       
+      
+    case nonlval::SymbolValKind: {
+      lval::SymbolVal& SV = cast<lval::SymbolVal>(Cond);
+      SymbolID sym = SV.getSymbol();
+      
+      if (Assumption)
+        return AssumeSymNE(St, sym, ValMgr.getValue(0, SymMgr.getType(sym)),
+                           isFeasible);
+      else
+        return AssumeSymEQ(St, sym, ValMgr.getValue(0, SymMgr.getType(sym)),
+                           isFeasible);
+    }
+      
     case nonlval::SymIntConstraintValKind:
       return
         AssumeSymInt(St, Assumption,
index fba59b42ac4769b80821a783675d2e73e6863a10..df6db08db2675b39b463d37ab666b3d98b49c797 100644 (file)
@@ -34,6 +34,16 @@ SymbolID SymbolManager::getSymbol(ParmVarDecl* D) {
   return X;
 }
 
+QualType SymbolData::getType() const {
+  switch (getKind()) {
+    default:
+      assert (false && "getType() not implemented for this symbol.");
+    
+    case ParmKind:
+      return static_cast<ParmVarDecl*>(getPtr())->getType();
+  }
+}
+
 SymbolManager::SymbolManager() {}
 SymbolManager::~SymbolManager() {}
 
index 9bb97caf405b7e8c8d3a554b39da715a234268cb..bf3fe0dec9e98a68e901e77d4e5213b4961cde92 100644 (file)
@@ -71,7 +71,9 @@ public:
   
   inline Kind getKind() const { return (Kind) (Data & Mask); }
   inline void* getPtr() const { return reinterpret_cast<void*>(Data & ~Mask); }  
-  inline bool operator==(const SymbolData& R) const { return Data == R.Data; }  
+  inline bool operator==(const SymbolData& R) const { return Data == R.Data; }
+  
+  QualType getType() const;  
 };
   
 
@@ -114,12 +116,16 @@ public:
   SymbolManager();
   ~SymbolManager();
   
-  SymbolData getSymbolData(SymbolID id) const {
-    assert (id < SymbolToData.size());
-    return SymbolToData[id];
+  SymbolID getSymbol(ParmVarDecl* D);
+  
+  inline SymbolData getSymbolData(SymbolID ID) const {
+    assert (ID < SymbolToData.size());
+    return SymbolToData[ID];
   }
   
-  SymbolID getSymbol(ParmVarDecl* D);
+  inline QualType getType(SymbolID ID) const {
+    return getSymbolData(ID).getType();
+  }
 };