[cfe-commits] r57897 - in /cfe/trunk/lib/Analysis: BasicStore.cpp GRExprEngine.cpp

Zhongxing Xu xuzhongxing at gmail.com
Mon Oct 20 23:54:23 PDT 2008


Author: zhongxingxu
Date: Tue Oct 21 01:54:23 2008
New Revision: 57897

URL: http://llvm.org/viewvc/llvm-project?rev=57897&view=rev
Log:
Localize the special processing of array variable inside 
GRExprEngine::VisitCast() so that other parts of the analyzer can be ignorant.
When we cast "array of type T" to "pointer to T", we get the loc::MemRegionVal
corresponding to the array variable. This is sufficient for BasicStore, but not
for RegionStore. RegionStore should get the element region for the first array
element in the cast. So next comes to the revamping of transfer functions for
different store model.

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

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

==============================================================================
--- cfe/trunk/lib/Analysis/BasicStore.cpp (original)
+++ cfe/trunk/lib/Analysis/BasicStore.cpp Tue Oct 21 01:54:23 2008
@@ -78,6 +78,7 @@
 StoreManager* clang::CreateBasicStoreManager(GRStateManager& StMgr) {
   return new BasicStoreManager(StMgr);
 }
+
 SVal BasicStoreManager::getLValueVar(const GRState* St, const VarDecl* VD) {
   return loc::MemRegionVal(MRMgr.getVarRegion(VD));
 }

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

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Tue Oct 21 01:54:23 2008
@@ -829,17 +829,6 @@
 
     SVal V = StateMgr.GetLValue(St, VD);
 
-    if (VD->getType()->isArrayType()) {
-      // C++ standard says array of type T should be implicitly converted to
-      // pointer to type T in some cases. Currently we don't do this cast in
-      // VisitCast(), because BasicStore is not field sensitive. We shall do
-      // this in a transfer function in the future. We represent both lvalue and
-      // rvalue of array of type T as the corresponding MemRegionVal of it.
-
-      MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
-      return;
-    }
-    
     if (asLValue)
       MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
     else
@@ -1445,8 +1434,9 @@
 void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
   NodeSet S1;
   QualType T = CastE->getType();
+  QualType ExTy = Ex->getType();
   
-  if (T->isReferenceType())
+  if (ExTy->isArrayType() || T->isReferenceType())
     VisitLValue(Ex, Pred, S1);
   else
     Visit(Ex, Pred, S1);
@@ -1464,8 +1454,6 @@
   //   let the transfer function object be responsible for constructing
   //   nodes.
   
-  QualType ExTy = Ex->getType();
-  
   for (NodeSet::iterator I1 = S1.begin(), E1 = S1.end(); I1 != E1; ++I1) {
     NodeTy* N = *I1;
     const GRState* St = GetState(N);





More information about the cfe-commits mailing list