diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-02-06 03:57:59 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-02-06 03:57:59 +0000 |
commit | 30fe9ecac23bc5f9b6ec0af088c0cea94f167687 (patch) | |
tree | 87a8225038c9d8cac1a6f1ff32df553778a5b0d5 | |
parent | 4536b9a904d592dc2ec9b1921aacf7fc68344925 (diff) | |
download | bcm5719-llvm-30fe9ecac23bc5f9b6ec0af088c0cea94f167687.tar.gz bcm5719-llvm-30fe9ecac23bc5f9b6ec0af088c0cea94f167687.zip |
Fix regression in RegionStore (from BasicStore) where static variables were not treated as being implicitly initialized to 0 (and instead were getting symbolicated).
llvm-svn: 95478
-rw-r--r-- | clang/lib/Checker/RegionStore.cpp | 18 | ||||
-rw-r--r-- | clang/test/Analysis/misc-ps.m | 7 |
2 files changed, 22 insertions, 3 deletions
diff --git a/clang/lib/Checker/RegionStore.cpp b/clang/lib/Checker/RegionStore.cpp index 341bfe7a721..2e212db3e62 100644 --- a/clang/lib/Checker/RegionStore.cpp +++ b/clang/lib/Checker/RegionStore.cpp @@ -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(); } diff --git a/clang/test/Analysis/misc-ps.m b/clang/test/Analysis/misc-ps.m index 88cc1289298..c1b3d9788b2 100644 --- a/clang/test/Analysis/misc-ps.m +++ b/clang/test/Analysis/misc-ps.m @@ -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; +} |