]> granicus.if.org Git - clang/commitdiff
Add transfer function support for the default initialization of static
authorTed Kremenek <kremenek@apple.com>
Tue, 4 Mar 2008 04:18:04 +0000 (04:18 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 4 Mar 2008 04:18:04 +0000 (04:18 +0000)
variables that are pointers or integers.

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

Analysis/GRExprEngine.cpp

index 9513deb3f1dd34b69f923ca0781f3d586baa4056..8db5a14be49fe9d8df877462206d5fbe15564f68 100644 (file)
@@ -623,8 +623,34 @@ 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.
         
-        St = SetRVal(St, lval::DeclVal(VD),
-                     Ex ? GetRVal(St, Ex) : UndefinedVal());
+        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
+          //  explicitly, then: 
+          //   —if it has pointer type, it is initialized to a null pointer; 
+          //   —if it has arithmetic type, it is initialized to (positive or 
+          //     unsigned) zero; 
+          
+          if (T->isPointerType()) {
+            
+            St = SetRVal(St, lval::DeclVal(VD),
+                         lval::ConcreteInt(ValMgr.getValue(0, T)));
+          }
+          else if (T->isIntegerType()) {
+            
+            St = SetRVal(St, lval::DeclVal(VD),
+                         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());
+          
       }
     }