]> granicus.if.org Git - clang/commitdiff
Fixed signedness bug in cast transfer function when casting integers to pointers.
authorTed Kremenek <kremenek@apple.com>
Wed, 6 Feb 2008 04:31:33 +0000 (04:31 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 6 Feb 2008 04:31:33 +0000 (04:31 +0000)
Removed lval::SymIntConstraintVal; wrappers for symbolic constraints are not lvalues (only integers that evaluate to !0 or 0).

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

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

index 39a50a55ce2d27e3ffd41172140c362ca97390a9..8656d776c86ec9b578891b8a9b8a2dd4ea904e7e 100644 (file)
@@ -234,6 +234,9 @@ public:
   StateTy AssumeSymEQ(StateTy St, SymbolID sym, const llvm::APSInt& V,
                       bool& isFeasible);
   
+  StateTy AssumeSymInt(StateTy St, bool Assumption, const SymIntConstraint& C,
+                       bool& isFeasible);
+  
   void Nodify(NodeSet& Dst, Stmt* S, NodeTy* Pred, StateTy St);
   
   /// Nodify - This version of Nodify is used to batch process a set of states.
@@ -874,6 +877,7 @@ GRConstants::StateTy GRConstants::Assume(StateTy St, LValue Cond,
         return AssumeSymEQ(St, cast<lval::SymbolVal>(Cond).getSymbol(),
                            ValMgr.getZeroWithPtrWidth(), isFeasible);
       
+      
     case lval::DeclValKind:
       isFeasible = Assumption;
       return St;
@@ -895,6 +899,12 @@ GRConstants::StateTy GRConstants::Assume(StateTy St, NonLValue Cond,
       assert (false && "'Assume' not implemented for this NonLValue.");
       return St;
       
+    case nonlval::SymIntConstraintValKind:
+      return
+        AssumeSymInt(St, Assumption,
+                     cast<nonlval::SymIntConstraintVal>(Cond).getConstraint(),
+                     isFeasible);
+      
     case nonlval::ConcreteIntKind: {
       bool b = cast<nonlval::ConcreteInt>(Cond).getValue() != 0;
       isFeasible = b ? Assumption : !Assumption;      
@@ -949,6 +959,29 @@ GRConstants::AssumeSymEQ(StateTy St, SymbolID sym,
   return StateMgr.AddEQ(St, sym, V);
 }
 
+GRConstants::StateTy
+GRConstants::AssumeSymInt(StateTy St, bool Assumption,
+                          const SymIntConstraint& C, bool& isFeasible) {
+  
+  switch (C.getOpcode()) {
+    default:
+      // No logic yet for other operators.
+      return St;
+      
+    case BinaryOperator::EQ:
+      if (Assumption)
+        return AssumeSymEQ(St, C.getSymbol(), C.getInt(), isFeasible);
+      else
+        return AssumeSymNE(St, C.getSymbol(), C.getInt(), isFeasible);
+      
+    case BinaryOperator::NE:
+      if (Assumption)
+        return AssumeSymNE(St, C.getSymbol(), C.getInt(), isFeasible);
+      else
+        return AssumeSymEQ(St, C.getSymbol(), C.getInt(), isFeasible);
+  }
+}
+
 //===----------------------------------------------------------------------===//
 // Driver.
 //===----------------------------------------------------------------------===//
index 33d9d656a7061cf79e417d9fe3d7c32be77fe604..fba59b42ac4769b80821a783675d2e73e6863a10 100644 (file)
@@ -138,7 +138,7 @@ RValue NonLValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
     
   APSInt V = cast<nonlval::ConcreteInt>(this)->getValue();
   QualType T = CastExpr->getType();
-  V.setIsUnsigned(T->isUnsignedIntegerType());
+  V.setIsUnsigned(T->isUnsignedIntegerType() || T->isPointerType());
   V.extOrTrunc(ValMgr.getContext().getTypeSize(T, CastExpr->getLocStart()));
   
   if (CastExpr->getType()->isPointerType())
@@ -425,17 +425,7 @@ void LValue::print(std::ostream& Out) const {
     case lval::SymbolValKind:
       Out << '$' << cast<lval::SymbolVal>(this)->getSymbol();
       break;
-      
-    case lval::SymIntConstraintValKind: {
-      const lval::SymIntConstraintVal& C = 
-        *cast<lval::SymIntConstraintVal>(this);
-      
-      Out << '$' << C.getConstraint().getSymbol() << ' ';
-      printOpcode(Out, C.getConstraint().getOpcode());
-      Out << ' ' << C.getConstraint().getInt().toString();
-      break;
-    }
-      
+
     case lval::DeclValKind:
       Out << '&' 
       << cast<lval::DeclVal>(this)->getDecl()->getIdentifier()->getName();
index cd74262384b73e58079eefb626f70b64db72b380..9bb97caf405b7e8c8d3a554b39da715a234268cb 100644 (file)
@@ -446,7 +446,6 @@ namespace nonlval {
 namespace lval {
   
   enum Kind { SymbolValKind,
-              SymIntConstraintValKind,
               DeclValKind,
               ConcreteIntKind,
               NumKind };
@@ -465,20 +464,6 @@ namespace lval {
     }  
   };
   
-  class SymIntConstraintVal : public LValue {    
-  public:
-    SymIntConstraintVal(const SymIntConstraint& C)
-    : LValue(SymIntConstraintValKind, reinterpret_cast<const void*>(&C)) {}
-    
-    const SymIntConstraint& getConstraint() const {
-      return *reinterpret_cast<SymIntConstraint*>(getRawPtr());
-    }
-    
-    static inline bool classof(const RValue* V) {
-      return isa<LValue>(V) && V->getSubKind() == SymIntConstraintValKind;
-    }    
-  };
-
   class DeclVal : public LValue {
   public:
     DeclVal(const ValueDecl* vd) : LValue(DeclValKind,vd) {}