[cfe-commits] r105099 - in /cfe/trunk: lib/Checker/RegionStore.cpp test/Analysis/PR7218.c

Zhongxing Xu xuzhongxing at gmail.com
Fri May 28 23:49:04 PDT 2010


Author: zhongxingxu
Date: Sat May 29 01:49:04 2010
New Revision: 105099

URL: http://llvm.org/viewvc/llvm-project?rev=105099&view=rev
Log:
Revert r105097. Thinking about a better fix.

Modified:
    cfe/trunk/lib/Checker/RegionStore.cpp
    cfe/trunk/test/Analysis/PR7218.c

Modified: cfe/trunk/lib/Checker/RegionStore.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/RegionStore.cpp?rev=105099&r1=105098&r2=105099&view=diff
==============================================================================
--- cfe/trunk/lib/Checker/RegionStore.cpp (original)
+++ cfe/trunk/lib/Checker/RegionStore.cpp Sat May 29 01:49:04 2010
@@ -213,11 +213,6 @@
 
   RegionStoreSubRegionMap *getRegionStoreSubRegionMap(Store store);
 
-  /// canHaveDirectBinding - Disallow direct bindings for certain types,
-  ///  like arrays. This lets us distinguish between x and x[0], which was
-  ///  causing PR7218 "Assigning to buf[0] makes buf[1] valid".
-  bool canHaveDirectBinding (const MemRegion *R);
-
   Optional<SVal> getBinding(RegionBindings B, const MemRegion *R);
   Optional<SVal> getDirectBinding(RegionBindings B, const MemRegion *R);
   /// getDefaultBinding - Returns an SVal* representing an optional default
@@ -949,20 +944,12 @@
 //===----------------------------------------------------------------------===//
 // Loading values from regions.
 //===----------------------------------------------------------------------===//
-bool RegionStoreManager::canHaveDirectBinding (const MemRegion *R) {
-  // Arrays can't have direct binding -- must bind to elements
-  if (const TypedRegion *TR = dyn_cast<TypedRegion>(R))    
-    if (TR->getValueType(getContext())->isArrayType())   
-      return false;
-  
-  return true;
-}
 
 Optional<SVal> RegionStoreManager::getDirectBinding(RegionBindings B,
                                                     const MemRegion *R) {
-  if (canHaveDirectBinding(R))
-    if (const SVal *V = Lookup(B, R, BindingKey::Direct))
-      return *V;
+
+  if (const SVal *V = Lookup(B, R, BindingKey::Direct))
+    return *V;
 
   return Optional<SVal>();
 }
@@ -1188,8 +1175,9 @@
 
   // Check if the immediate super region has a direct binding.
   if (const Optional<SVal> &V = getDirectBinding(B, superR)) {
-    if (SymbolRef parentSym = V->getAsSymbol())
+    if (SymbolRef parentSym = V->getAsSymbol()) {
       return ValMgr.getDerivedRegionValueSymbolVal(parentSym, R);
+    }
 
     if (V->isUnknownOrUndef())
       return *V;
@@ -1198,7 +1186,6 @@
     // are handled in 'RetrieveFieldOrElementCommon'.
     if (const nonloc::LazyCompoundVal *LCV =
         dyn_cast<nonloc::LazyCompoundVal>(V)) {
-
       R = MRMgr.getElementRegionWithSuper(R, LCV->getRegion());
       return RetrieveElement(LCV->getStore(), R);
     }

Modified: cfe/trunk/test/Analysis/PR7218.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/PR7218.c?rev=105099&r1=105098&r2=105099&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/PR7218.c (original)
+++ cfe/trunk/test/Analysis/PR7218.c Sat May 29 01:49:04 2010
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store region -verify %s
+// XFAIL: *
 char PR7218(char a) {
     char buf[2];
     buf[0] = a;





More information about the cfe-commits mailing list