]> granicus.if.org Git - clang/commitdiff
Added boilerplate for plug-in transfer function support for CallExprs.
authorTed Kremenek <kremenek@apple.com>
Tue, 26 Feb 2008 23:04:29 +0000 (23:04 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 26 Feb 2008 23:04:29 +0000 (23:04 +0000)
GRSimpleVals performs the following action: invalidate all values passed-by-reference.

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

Analysis/GRSimpleVals.cpp
Analysis/GRSimpleVals.h
include/clang/Analysis/PathSensitive/GRExprEngine.h
include/clang/Analysis/PathSensitive/GRTransferFuncs.h

index 549aa0bb4ff3334f0420a1136f0584969ac30fef..4d9dccf621e0b6f41c745028c9a656b10bce2e14 100644 (file)
@@ -14,6 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "GRSimpleVals.h"
+#include "ValueState.h"
 #include "clang/Basic/Diagnostic.h"
 
 using namespace clang;
@@ -329,3 +330,27 @@ RVal GRSimpleVals::EvalNE(ValueManager& ValMgr, LVal L, LVal R) {
   
   return NonLVal::MakeIntTruthVal(ValMgr, true);
 }
+
+//===----------------------------------------------------------------------===//
+// Transfer function for Function Calls.
+//===----------------------------------------------------------------------===//
+
+ValueStateImpl*
+GRSimpleVals::EvalCall(ValueStateManager& StateMgr, ValueManager& ValMgr,
+                           CallExpr* CE, LVal L, ValueStateImpl* StImpl) {
+  
+  ValueState St(StImpl);
+  
+  // 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 = StateMgr.GetRVal(St, *I);
+    
+    if (isa<LVal>(V))
+      St = StateMgr.SetRVal(St, cast<LVal>(V), UnknownVal());
+  }
+  
+  return St.getImpl();
+}
index 870166e8f4b75849475a257d54880e4e17852c88..10d4acd4b9f26e25bf0f8943051ab91e176277d4 100644 (file)
@@ -50,6 +50,13 @@ public:
   virtual RVal EvalBinOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
                          LVal L, NonLVal R);  
   
+  // Calls.
+  
+  virtual ValueStateImpl* EvalCall(ValueStateManager& StateMgr,
+                                   ValueManager& ValMgr,
+                                   CallExpr* CE, LVal L,
+                                   ValueStateImpl* StImpl);
+  
 protected:
   
   // Equality operators for LVals.
index a5f88354b8f805c9aad6645c635abcc22a8b91c6..5c9092943bbdf9f8808506d53574ce9844359824 100644 (file)
@@ -410,7 +410,7 @@ protected:
   }
   
   StateTy EvalCall(CallExpr* CE, LVal L, StateTy St) {
-    return St;     
+    return StateTy(TF->EvalCall(StateMgr, ValMgr, CE, L, St.getImpl()));
   }
   
   StateTy MarkBranch(StateTy St, Stmt* Terminator, bool branchTaken);
index 2a8ec2b6f77c1794ea1863fa453d3e2701dc3e16..b4953d6401de2d774f3b329db36ee36d5dfcdbfe 100644 (file)
@@ -19,6 +19,9 @@
 
 namespace clang {
   
+  class ValueStateImpl;
+  class ValueStateManager;
+  
 class GRTransferFuncs {
 public:
   GRTransferFuncs() {}
@@ -47,6 +50,13 @@ public:
   
   virtual RVal EvalBinOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
                          LVal L, NonLVal R) = 0;
+  
+  // Calls.
+  
+  virtual ValueStateImpl* EvalCall(ValueStateManager& StateMgr,
+                                   ValueManager& ValMgr,
+                                   CallExpr* CE, LVal L,
+                                   ValueStateImpl* StImpl) = 0;
 };
   
 } // end clang namespace