diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-03-30 20:31:04 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-03-30 20:31:04 +0000 |
commit | 4552ff080062cacc4b57906e6f2f09e9d796b6a4 (patch) | |
tree | 41819569dd8db3b12c01533191b968b6554590cc /lib/Checker/RegionStore.cpp | |
parent | 2cf073b7686a05bc0f637862bdc06f71232db954 (diff) |
RegionStore: specially handle loads from integer global variables declared 'const'.
Fixes a false positive reported in PR 6288.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99922 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Checker/RegionStore.cpp')
-rw-r--r-- | lib/Checker/RegionStore.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/Checker/RegionStore.cpp b/lib/Checker/RegionStore.cpp index 26d33f6588..d590a86a81 100644 --- a/lib/Checker/RegionStore.cpp +++ b/lib/Checker/RegionStore.cpp @@ -1313,8 +1313,23 @@ SVal RegionStoreManager::RetrieveVar(Store store, const VarRegion *R) { return ValMgr.getRegionValueSymbolVal(R); if (isa<GlobalsSpaceRegion>(MS)) { - if (VD->isFileVarDecl()) + if (VD->isFileVarDecl()) { + // Is 'VD' declared constant? If so, retrieve the constant value. + QualType CT = Ctx.getCanonicalType(T); + if (CT.isConstQualified()) { + const Expr *Init = VD->getInit(); + // Do the null check first, as we want to call 'IgnoreParenCasts'. + if (Init) + if (const IntegerLiteral *IL = + dyn_cast<IntegerLiteral>(Init->IgnoreParenCasts())) { + const nonloc::ConcreteInt &V = ValMgr.makeIntVal(IL); + return ValMgr.getSValuator().EvalCast(V, Init->getType(), + IL->getType()); + } + } + return ValMgr.getRegionValueSymbolVal(R); + } if (T->isIntegerType()) return ValMgr.makeIntVal(0, T); |