]> granicus.if.org Git - clang/commitdiff
For the transfer function of DeclStmt, for now initialize the values of
authorTed Kremenek <kremenek@apple.com>
Tue, 4 Mar 2008 20:40:11 +0000 (20:40 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 4 Mar 2008 20:40:11 +0000 (20:40 +0000)
structs (local variables) to Unknown instead of Undefined.  (added FIXME to initialize *members* of struct to undefined)

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

Analysis/GRExprEngine.cpp

index 8db5a14be49fe9d8df877462206d5fbe15564f68..7a0ca710543af41fba08ca89cdb2dc60615151e9 100644 (file)
@@ -622,10 +622,10 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, GRExprEngine::NodeTy* Pred,
         //
         // FIXME: static variables may have an initializer, but the second
         //  time a function is called those values may not be current.
+
+        QualType T = VD->getType();
         
         if ( VD->getStorageClass() == VarDecl::Static) {
-
-          QualType T = VD->getType();
           
           // C99: 6.7.8 Initialization
           //  If an object that has static storage duration is not initialized
@@ -634,6 +634,8 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, GRExprEngine::NodeTy* Pred,
           //   —if it has arithmetic type, it is initialized to (positive or 
           //     unsigned) zero; 
           
+          // FIXME: Handle structs.  Now we treat their values as unknown.
+          
           if (T->isPointerType()) {
             
             St = SetRVal(St, lval::DeclVal(VD),
@@ -645,18 +647,21 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, GRExprEngine::NodeTy* Pred,
                          nonlval::ConcreteInt(ValMgr.getValue(0, T)));
           }
           
-          // FIXME: Handle structs.  Now we treat their values as unknown.
+
         }
-        else
-          St = SetRVal(St, lval::DeclVal(VD),
-                       Ex ? GetRVal(St, Ex) : UndefinedVal());
+        else {
+          
+          // FIXME: Handle structs.  Now we treat them as unknown.  What
+          //  we need to do is treat their members as unknown.
           
+          if (T->isPointerType() || T->isIntegerType())
+            St = SetRVal(St, lval::DeclVal(VD),
+                         Ex ? GetRVal(St, Ex) : UndefinedVal());
+        }
       }
     }
 
   Nodify(Dst, DS, Pred, St);
-  
-  if (Dst.empty()) { Dst.Add(Pred); }
 }