[cfe-commits] r47638 - in /cfe/trunk: Analysis/GRSimpleVals.cpp Analysis/GRSimpleVals.h include/clang/Analysis/PathSensitive/GRExprEngine.h include/clang/Analysis/PathSensitive/GRTransferFuncs.h

Ted Kremenek kremenek at apple.com
Tue Feb 26 15:04:29 PST 2008


Author: kremenek
Date: Tue Feb 26 17:04:29 2008
New Revision: 47638

URL: http://llvm.org/viewvc/llvm-project?rev=47638&view=rev
Log:
Added boilerplate for plug-in transfer function support for CallExprs.
GRSimpleVals performs the following action: invalidate all values passed-by-reference.

Modified:
    cfe/trunk/Analysis/GRSimpleVals.cpp
    cfe/trunk/Analysis/GRSimpleVals.h
    cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
    cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h

Modified: cfe/trunk/Analysis/GRSimpleVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRSimpleVals.cpp?rev=47638&r1=47637&r2=47638&view=diff

==============================================================================
--- cfe/trunk/Analysis/GRSimpleVals.cpp (original)
+++ cfe/trunk/Analysis/GRSimpleVals.cpp Tue Feb 26 17:04:29 2008
@@ -14,6 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "GRSimpleVals.h"
+#include "ValueState.h"
 #include "clang/Basic/Diagnostic.h"
 
 using namespace clang;
@@ -329,3 +330,27 @@
   
   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();
+}

Modified: cfe/trunk/Analysis/GRSimpleVals.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRSimpleVals.h?rev=47638&r1=47637&r2=47638&view=diff

==============================================================================
--- cfe/trunk/Analysis/GRSimpleVals.h (original)
+++ cfe/trunk/Analysis/GRSimpleVals.h Tue Feb 26 17:04:29 2008
@@ -50,6 +50,13 @@
   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.

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=47638&r1=47637&r2=47638&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Tue Feb 26 17:04:29 2008
@@ -410,7 +410,7 @@
   }
   
   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);

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h?rev=47638&r1=47637&r2=47638&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h Tue Feb 26 17:04:29 2008
@@ -19,6 +19,9 @@
 
 namespace clang {
   
+  class ValueStateImpl;
+  class ValueStateManager;
+  
 class GRTransferFuncs {
 public:
   GRTransferFuncs() {}
@@ -47,6 +50,13 @@
   
   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





More information about the cfe-commits mailing list