]> granicus.if.org Git - clang/commitdiff
Fix regression in RegionStore (from BasicStore) where static variables were not treat...
authorTed Kremenek <kremenek@apple.com>
Sat, 6 Feb 2010 03:57:59 +0000 (03:57 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 6 Feb 2010 03:57:59 +0000 (03:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95478 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Checker/RegionStore.cpp
test/Analysis/misc-ps.m

index 341bfe7a7212b9f27f8397849b81ddb7b78c031e..2e212db3e628194f03ed432f7764b0d6655b5399 100644 (file)
@@ -1394,11 +1394,23 @@ SVal RegionStoreManager::RetrieveVar(Store store, const VarRegion *R) {
 
   // Lazily derive a value for the VarRegion.
   const VarDecl *VD = R->getDecl();
+  QualType T = VD->getType();
+  const MemSpaceRegion *MS = R->getMemorySpace();
+  
+  if (isa<UnknownSpaceRegion>(MS) || 
+      isa<StackArgumentsSpaceRegion>(MS))
+    return ValMgr.getRegionValueSymbolVal(R, T);
 
-  if (R->hasGlobalsOrParametersStorage() ||
-      isa<UnknownSpaceRegion>(R->getMemorySpace()))
-    return ValMgr.getRegionValueSymbolVal(R, VD->getType());
+  if (isa<GlobalsSpaceRegion>(MS)) {
+    if (VD->isFileVarDecl())
+      return ValMgr.getRegionValueSymbolVal(R, T);
 
+    if (T->isIntegerType())
+      return ValMgr.makeIntVal(0, T);
+    
+    return UnknownVal();    
+  }
+    
   return UndefinedVal();
 }
 
index 88cc12892989025b693231e9aa6dd627c1cfbb43..c1b3d9788b2299d715606f75777d29c8688507cc 100644 (file)
@@ -901,3 +901,10 @@ int bar_rev95274() {
   return 0;
 }
 
+void rdar7582031_test_static_init_zero() {
+  static unsigned x;
+  if (x == 0)
+    return;
+  int *p = 0;
+  *p = 0xDEADBEEF;
+}