]> granicus.if.org Git - clang/commitdiff
Allow offsets to be negative. Out-of-bound cases are checked elsewhere. We
authorZhongxing Xu <xuzhongxing@gmail.com>
Tue, 3 Aug 2010 06:34:25 +0000 (06:34 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Tue, 3 Aug 2010 06:34:25 +0000 (06:34 +0000)
shouldn't put restrictions in store manager.

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

include/clang/Checker/PathSensitive/MemRegion.h
lib/Checker/FlatStore.cpp
lib/Checker/MemRegion.cpp

index 82664adcb73fddccd28f6352f596f592ce75835a..d7dd55147b7b1d23d54615e5746e6d8c3e30ee07 100644 (file)
@@ -45,14 +45,14 @@ class RegionOffset {
   const MemRegion *R;
 
   /// The bit offset within the base region. It shouldn't be negative.
-  uint64_t Offset;
+  int64_t Offset;
 
 public:
   RegionOffset(const MemRegion *r) : R(r), Offset(0) {}
-  RegionOffset(const MemRegion *r, uint64_t off) : R(r), Offset(off) {}
+  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
 
   const MemRegion *getRegion() const { return R; }
-  uint64_t getOffset() const { return Offset; }
+  int64_t getOffset() const { return Offset; }
 };
 
 //===----------------------------------------------------------------------===//
index e1683e5009c720f1f2b7365db0ef93fbcfe1f915..9e7aa753eec453976ad934eb8b7edb9680de4bf5 100644 (file)
@@ -78,7 +78,7 @@ private:
   public:
     const MemRegion *R;
     Interval I;
-    RegionInterval(const MemRegion *r, uint64_t s, uint64_t e) : R(r), I(s, e){}
+    RegionInterval(const MemRegion *r, int64_t s, int64_t e) : R(r), I(s, e){}
   };
 
   RegionInterval RegionToInterval(const MemRegion *R);
@@ -186,7 +186,7 @@ FlatStoreManager::RegionToInterval(const MemRegion *R) {
   switch (R->getKind()) {
   case MemRegion::VarRegionKind: {
     QualType T = cast<VarRegion>(R)->getValueType(Ctx);
-    uint64_t Size = Ctx.getTypeSize(T);
+    int64_t Size = Ctx.getTypeSize(T);
     return RegionInterval(R, 0, Size-1);
   }
 
@@ -197,8 +197,8 @@ FlatStoreManager::RegionToInterval(const MemRegion *R) {
     // with symbolic offsets.
     if (!Offset.getRegion())
       return RegionInterval(0, 0, 0);
-    uint64_t Start = Offset.getOffset();
-    uint64_t Size = Ctx.getTypeSize(cast<TypedRegion>(R)->getValueType(Ctx));
+    int64_t Start = Offset.getOffset();
+    int64_t Size = Ctx.getTypeSize(cast<TypedRegion>(R)->getValueType(Ctx));
     return RegionInterval(Offset.getRegion(), Start, Start+Size);
   }
 
index 87eed2a2872791485a053a6e1036d6a4a9146bba..58006708fa14ac3fa1897bccba706ab5db47bf7e 100644 (file)
@@ -830,7 +830,7 @@ RegionRawOffset ElementRegion::getAsArrayOffset() const {
 
 RegionOffset MemRegion::getAsOffset() const {
   const MemRegion *R = this;
-  uint64_t Offset = 0;
+  int64_t Offset = 0;
 
   while (1) {
     switch (R->getKind()) {
@@ -854,7 +854,6 @@ RegionOffset MemRegion::getAsOffset() const {
       SVal Index = ER->getIndex();
       if (const nonloc::ConcreteInt *CI=dyn_cast<nonloc::ConcreteInt>(&Index)) {
         int64_t i = CI->getValue().getSExtValue();
-        assert(i >= 0);
         CharUnits Size = getContext().getTypeSizeInChars(EleTy);
         Offset += i * Size.getQuantity() * 8;
       } else {