]> granicus.if.org Git - clang/commitdiff
A further step of r73690: associate the cast-to type with the created symbol,
authorZhongxing Xu <xuzhongxing@gmail.com>
Fri, 19 Jun 2009 06:00:32 +0000 (06:00 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Fri, 19 Jun 2009 06:00:32 +0000 (06:00 +0000)
because the type of the symbol is used to create the default range. We need the
sign to be consistent.

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

include/clang/Analysis/PathSensitive/SymbolManager.h
lib/Analysis/SVals.cpp
lib/Analysis/SymbolManager.cpp
test/Analysis/casts.c

index d424526d4eb01d903c0d45fd0461377dc5cafdaf..d074e30333d4668574d871c995694d83fcaabc69 100644 (file)
@@ -83,19 +83,25 @@ typedef const SymbolData* SymbolRef;
   
 class SymbolRegionValue : public SymbolData {
   const MemRegion *R;
+  // We may cast the region to another type, so the expected type of the symbol
+  // may be different from the region's original type.
+  QualType T;
+
 public:
-  SymbolRegionValue(SymbolID sym, const MemRegion *r)
-    : SymbolData(RegionValueKind, sym), R(r) {}
+  SymbolRegionValue(SymbolID sym, const MemRegion *r, QualType t = QualType())
+    : SymbolData(RegionValueKind, sym), R(r), T(t) {}
   
   const MemRegion* getRegion() const { return R; }
 
-  static void Profile(llvm::FoldingSetNodeID& profile, const MemRegion* R) {
+  static void Profile(llvm::FoldingSetNodeID& profile, const MemRegion* R,
+                     QualType T) {
     profile.AddInteger((unsigned) RegionValueKind);
     profile.AddPointer(R);
+    T.Profile(profile);
   }
   
   virtual void Profile(llvm::FoldingSetNodeID& profile) {
-    Profile(profile, R);
+    Profile(profile, R, T);
   }
   
   QualType getType(ASTContext&) const;
@@ -240,7 +246,8 @@ public:
   static bool canSymbolicate(QualType T);
 
   /// Make a unique symbol for MemRegion R according to its kind.
-  const SymbolRegionValue* getRegionValueSymbol(const MemRegion* R);
+  const SymbolRegionValue* getRegionValueSymbol(const MemRegion* R, 
+                                               QualType T = QualType());
   const SymbolConjured* getConjuredSymbol(const Stmt* E, QualType T,
                                           unsigned VisitCount,
                                           const void* SymbolTag = 0);
index 37f9ac7cad9ccf53211bac822a8e2dd9bdf503cf..77c3c8f7722a21233efa8dc47e1736da09e8e703 100644 (file)
@@ -323,10 +323,10 @@ NonLoc NonLoc::MakeCompoundVal(QualType T, llvm::ImmutableList<SVal> Vals,
 }
 
 SVal ValueManager::getRegionValueSymbolVal(const MemRegion* R, QualType T) {
-  SymbolRef sym = SymMgr.getRegionValueSymbol(R);
+  SymbolRef sym = SymMgr.getRegionValueSymbol(R, T);
                                 
   if (const TypedRegion* TR = dyn_cast<TypedRegion>(R)) {
-    if (!T.getTypePtr())
+    if (T.isNull())
       T = TR->getValueType(SymMgr.getContext());
 
     // If T is of function pointer type, create a CodeTextRegion wrapping a
index 5c885cd6e15acef4513cc753686298a6e7fcd738..4e38a3492c79a7e83f4f103c329988a185774166 100644 (file)
@@ -92,14 +92,14 @@ std::ostream& std::operator<<(std::ostream& os, const SymExpr *SE) {
 }
 
 const SymbolRegionValue* 
-SymbolManager::getRegionValueSymbol(const MemRegion* R) {
+SymbolManager::getRegionValueSymbol(const MemRegion* R, QualType T) {
   llvm::FoldingSetNodeID profile;
-  SymbolRegionValue::Profile(profile, R);
+  SymbolRegionValue::Profile(profile, R, T);
   void* InsertPos;  
   SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);    
   if (!SD) {  
     SD = (SymExpr*) BPAlloc.Allocate<SymbolRegionValue>();
-    new (SD) SymbolRegionValue(SymbolCounter, R);  
+    new (SD) SymbolRegionValue(SymbolCounter, R, T);  
     DataSet.InsertNode(SD, InsertPos);
     ++SymbolCounter;
   }
@@ -166,6 +166,9 @@ QualType SymbolConjured::getType(ASTContext&) const {
 }
 
 QualType SymbolRegionValue::getType(ASTContext& C) const {
+  if (!T.isNull())
+    return T;
+
   if (const TypedRegion* TR = dyn_cast<TypedRegion>(R))
     return TR->getValueType(C);
   
index d47184fb5f599c938c10f8c033431d062151395b..5e4222bc84bebedbbec7ab65cf4c65f255a0bb64 100644 (file)
@@ -25,6 +25,8 @@ int f1(struct s **pval) {
   pval = &(t->value);
   tbool = (int *)pval; // Should record the cast-to type here.
   char c = (unsigned char) *tbool; // Should use cast-to type to create symbol.
+  if (*tbool == -1)
+    3;
 }
 
 void f2(const char *str) {