diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-11-13 09:15:14 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-11-13 09:15:14 +0000 |
commit | cc0d0ec3a8d567f8b3fb70da177e38fe89efbc10 (patch) | |
tree | 17224c32810ae1e4d44c213cd47aa82b0fd753f8 /lib/Analysis/RegionStore.cpp | |
parent | fb75b2583eb82dc42cb8e5bd3c1eda1c661eb76d (diff) |
Array index might be unsigned. We have to generate a temporary signed value for
it to be evaluated by APSInt::operators.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59238 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/RegionStore.cpp')
-rw-r--r-- | lib/Analysis/RegionStore.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index 562d584558..ec5acf57f4 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -197,6 +197,18 @@ SVal RegionStoreManager::getLValueElement(const GRState* St, // Only handle integer indices for now. if ((CI1 = dyn_cast<nonloc::ConcreteInt>(&Idx)) && (CI2 = dyn_cast<nonloc::ConcreteInt>(&Offset))) { + + // Temporary SVal to hold a potential signed APSInt. + SVal SignedInt; + + // Index might be unsigned. We have to convert it to signed. + if (CI2->getValue().isUnsigned()) { + llvm::APSInt SI = CI2->getValue(); + SI.setIsSigned(true); + SignedInt = nonloc::ConcreteInt(getBasicVals().getValue(SI)); + CI2 = cast<nonloc::ConcreteInt>(&SignedInt); + } + SVal NewIdx = CI1->EvalBinOp(StateMgr.getBasicVals(), BinaryOperator::Add, *CI2); return loc::MemRegionVal(MRMgr.getElementRegion(NewIdx, |