]> granicus.if.org Git - clang/commitdiff
Array index might be unsigned. We have to generate a temporary signed value for
authorZhongxing Xu <xuzhongxing@gmail.com>
Thu, 13 Nov 2008 09:15:14 +0000 (09:15 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Thu, 13 Nov 2008 09:15:14 +0000 (09:15 +0000)
it to be evaluated by APSInt::operators.

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

lib/Analysis/RegionStore.cpp

index 562d5845588f9df22d79ebc145f2462b5cbc4f99..ec5acf57f4ea32d208dd5b3483a141efc224e58e 100644 (file)
@@ -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,