]> granicus.if.org Git - clang/commitdiff
Added transfer function support for dispatching to functions we don't know
authorTed Kremenek <kremenek@apple.com>
Thu, 21 Feb 2008 19:46:04 +0000 (19:46 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 21 Feb 2008 19:46:04 +0000 (19:46 +0000)
about.  The default logic is to invalidate the values of all values
passed-by-reference.

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

Analysis/GRExprEngine.cpp

index 66f5cae65476baf701a06a84bccdb6e264119f4c..80de395c585dd25e61ade3bfde64df3dabd57ca3 100644 (file)
@@ -448,10 +448,20 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
       continue;
     }
     
-    // FIXME: EvalCall must handle the case where the callee is Unknown.
-    assert (!L.isUnknown());    
-
-    Nodify(Dst, CE, *DI, EvalCall(CE, cast<LVal>(L), (*DI)->getState()));
+    if (L.isUnknown()) {
+      // Invalidate all arguments passed in by reference (LVals).
+      for (CallExpr::arg_iterator I = CE->arg_begin(), E = CE->arg_end();
+                                                       I != E; ++I) {
+        RVal V = GetRVal(St, *I);
+
+        if (isa<LVal>(V))
+          St = SetRVal(St, cast<LVal>(V), UnknownVal());
+      }
+    }
+    else
+      St = EvalCall(CE, cast<LVal>(L), (*DI)->getState());
+    
+    Nodify(Dst, CE, *DI, St);
   }
 }