On Nov 13, 2008, at 1:15 AM, Zhongxing Xu wrote:

Author: zhongxingxu
Date: Thu Nov 13 03:15:14 2008
New Revision: 59238

URL: http://llvm.org/viewvc/llvm-project?rev=59238&view=rev
Log:
Array index might be unsigned. We have to generate a temporary signed value for
it to be evaluated by APSInt::operators.

Modified:
   cfe/trunk/lib/Analysis/RegionStore.cpp

Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=59238&r1=59237&r2=59238&view=diff

= = = = = = = = ======================================================================
--- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
+++ cfe/trunk/lib/Analysis/RegionStore.cpp Thu Nov 13 03:15:14 2008
@@ -197,6 +197,18 @@
  // 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);
+    }
+

Hi Zhongxing,

I'm not saying this isn't needed, but is there a particular justification for the signed -> unsigned conversion? (I actually don't know by just looking at your patch). It seems like things like this should go in GRExprEngine, not the Store.

Ted

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to