[cfe-commits] r80051 - in /cfe/trunk: lib/Analysis/BasicStore.cpp test/Analysis/misc-ps.m

Ted Kremenek kremenek at apple.com
Tue Aug 25 16:29:04 PDT 2009


Author: kremenek
Date: Tue Aug 25 18:29:04 2009
New Revision: 80051

URL: http://llvm.org/viewvc/llvm-project?rev=80051&view=rev
Log:
Fix regression in BasicStoreManager caused by implicitly casting loaded values and trying to load/store from arrays.  RegionStoreManager already properly handles these cases well; we just need to gracefully not handle this case in BasicStoreManager.  This fixes PR 4781.

Modified:
    cfe/trunk/lib/Analysis/BasicStore.cpp
    cfe/trunk/test/Analysis/misc-ps.m

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

==============================================================================
--- cfe/trunk/lib/Analysis/BasicStore.cpp (original)
+++ cfe/trunk/lib/Analysis/BasicStore.cpp Tue Aug 25 18:29:04 2009
@@ -340,6 +340,13 @@
   if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R)))
     return store;
 
+  const TypedRegion *TyR = cast<TypedRegion>(R);
+  
+  // Do not bind to arrays.  We need to explicitly check for this so that
+  // we do not encounter any weirdness of trying to load/store from arrays.
+  if (TyR->isBoundable() && TyR->getValueType(C)->isArrayType())
+    return store;  
+
   if (nonloc::LocAsInteger *X = dyn_cast<nonloc::LocAsInteger>(&V)) {
     // Only convert 'V' to a location iff the underlying region type
     // is a location as well.
@@ -347,11 +354,8 @@
     // a pointer.  We may wish to flag a type error here if the types
     // are incompatible.  This may also cause lots of breakage
     // elsewhere. Food for thought.
-    if (const TypedRegion *TyR = dyn_cast<TypedRegion>(R)) {
-      if (TyR->isBoundable() &&
-          Loc::IsLocType(TyR->getValueType(C)))              
-        V = X->getLoc();
-    }
+    if (TyR->isBoundable() && Loc::IsLocType(TyR->getValueType(C)))              
+      V = X->getLoc();
   }
 
   BindingsTy B = GetBindings(store);

Modified: cfe/trunk/test/Analysis/misc-ps.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps.m?rev=80051&r1=80050&r2=80051&view=diff

==============================================================================
--- cfe/trunk/test/Analysis/misc-ps.m (original)
+++ cfe/trunk/test/Analysis/misc-ps.m Tue Aug 25 18:29:04 2009
@@ -542,3 +542,15 @@
   return compare ? 0 : 1; // Forces the evaluation of the symbolic constraint.
 }
 
+void pr4781(unsigned long *raw1) {
+  unsigned long *cook, *raw0;
+  unsigned long dough[32];
+  int i;
+  cook = dough;
+  for( i = 0; i < 16; i++, raw1++ ) {
+    raw0 = raw1++;
+    *cook = (*raw0 & 0x00fc0000L) << 6;
+    *cook |= (*raw0 & 0x00000fc0L) << 10;
+  }
+}
+





More information about the cfe-commits mailing list