[cfe-commits] r68661 - /cfe/trunk/lib/Analysis/GRExprEngine.cpp

Ted Kremenek kremenek at apple.com
Wed Apr 8 17:00:02 PDT 2009


Author: kremenek
Date: Wed Apr  8 19:00:02 2009
New Revision: 68661

URL: http://llvm.org/viewvc/llvm-project?rev=68661&view=rev
Log:
Refactor/cleanup reasoning of nil receivers in message expressions.

Modified:
    cfe/trunk/lib/Analysis/GRExprEngine.cpp

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

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Wed Apr  8 19:00:02 2009
@@ -1690,8 +1690,8 @@
     
     if (isFeasibleNull) {
       // Check if the receiver was nil and the return value a struct.
-      if (BR.getParentMap().isConsumedExpr(ME)) {
-        if(ME->getType()->isRecordType()) {
+      if(ME->getType()->isRecordType()) {
+        if (BR.getParentMap().isConsumedExpr(ME)) {
           // The [0 ...] expressions will return garbage.  Flag either an
           // explicit or implicit error.  Because of the structure of this
           // function we currently do not bifurfacte the state graph at
@@ -1704,40 +1704,50 @@
               NilReceiverStructRetImplicit.insert(N);
             else
               NilReceiverStructRetExplicit.insert(N);
+            
+            return;
           }
         }
-        else {
-          ASTContext& Ctx = getContext();
-          
-          // sizeof(void *)
-          const uint64_t voidPtrSize = Ctx.getTypeSize(Ctx.VoidPtrTy);
-          
-          // sizeof(return type)
-          const uint64_t returnTypeSize = Ctx.getTypeSize(ME->getType());
-          
-          if(voidPtrSize < returnTypeSize) {
-            if (NodeTy* N = Builder->generateNode(ME, StNull, Pred)) {
-              N->markAsSink();
-              if(isFeasibleNotNull)
-                NilReceiverLargerThanVoidPtrRetImplicit.insert(N);
-              else
-                NilReceiverLargerThanVoidPtrRetExplicit.insert(N);
-            }
-          }
-          else {
-            // Handle the safe cases where the return value is 0 if the receiver
-            // is nil.
-            SVal V = SVal::MakeZero(getBasicVals(), ME->getType());
-            MakeNode(Dst, ME, Pred, BindExpr(StNull, ME, V));
+      }
+      else if (BR.getParentMap().isConsumedExpr(ME)) {
+        ASTContext& Ctx = getContext();
+        // sizeof(void *)
+        const uint64_t voidPtrSize = Ctx.getTypeSize(Ctx.VoidPtrTy);
+        // sizeof(return type)
+        const uint64_t returnTypeSize = Ctx.getTypeSize(ME->getType());
+
+        if(voidPtrSize < returnTypeSize) {
+          if (NodeTy* N = Builder->generateNode(ME, StNull, Pred)) {
+            N->markAsSink();
+            if(isFeasibleNotNull)
+              NilReceiverLargerThanVoidPtrRetImplicit.insert(N);
+            else
+              NilReceiverLargerThanVoidPtrRetExplicit.insert(N);
+            
+            return;
           }
         }
+        else if (!isFeasibleNotNull) {
+          // FIXME: For now take the conservative approach that we only
+          // return null values if we *know* that the receiver is nil.
+          // This is because we can have suprises like:
+          //
+          // if ([[NSScreens screens]count]) {
+          //   ... = [[NSScreens screens] objectAtIndex:0];
+          //
+          // In this case 'objectAtIndex:0' is guaranteed to not be zero.
+          //
+          
+          // Handle the safe cases where the return value is 0 if the receiver
+          // is nil.
+          SVal V = SVal::MakeZero(getBasicVals(), ME->getType());
+          MakeNode(Dst, ME, Pred, BindExpr(StNull, ME, V));
+          return;
+        }
       }
       
       // We have handled the cases where the receiver is nil.  The remainder
       // of this method should assume that the receiver is not nil.      
-      if (!isFeasibleNotNull)
-        return;
-
       state = StNotNull;
     }
     





More information about the cfe-commits mailing list