From e3273e78da4716f9c999ae207f6898f376a6e1a4 Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Tue, 3 Aug 2010 06:34:25 +0000 Subject: [PATCH] Allow offsets to be negative. Out-of-bound cases are checked elsewhere. We 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 | 6 +++--- lib/Checker/FlatStore.cpp | 8 ++++---- lib/Checker/MemRegion.cpp | 3 +-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/include/clang/Checker/PathSensitive/MemRegion.h b/include/clang/Checker/PathSensitive/MemRegion.h index 82664adcb7..d7dd55147b 100644 --- a/include/clang/Checker/PathSensitive/MemRegion.h +++ b/include/clang/Checker/PathSensitive/MemRegion.h @@ -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; } }; //===----------------------------------------------------------------------===// diff --git a/lib/Checker/FlatStore.cpp b/lib/Checker/FlatStore.cpp index e1683e5009..9e7aa753ee 100644 --- a/lib/Checker/FlatStore.cpp +++ b/lib/Checker/FlatStore.cpp @@ -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(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(R)->getValueType(Ctx)); + int64_t Start = Offset.getOffset(); + int64_t Size = Ctx.getTypeSize(cast(R)->getValueType(Ctx)); return RegionInterval(Offset.getRegion(), Start, Start+Size); } diff --git a/lib/Checker/MemRegion.cpp b/lib/Checker/MemRegion.cpp index 87eed2a287..58006708fa 100644 --- a/lib/Checker/MemRegion.cpp +++ b/lib/Checker/MemRegion.cpp @@ -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(&Index)) { int64_t i = CI->getValue().getSExtValue(); - assert(i >= 0); CharUnits Size = getContext().getTypeSizeInChars(EleTy); Offset += i * Size.getQuantity() * 8; } else { -- 2.40.0