diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2008-11-24 19:35:33 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2008-11-24 19:35:33 +0000 |
commit | e95db4f2cd3ed4825a179bd7f151a5fc86b38e6f (patch) | |
tree | f7ba7fd385e05f2e1f73c083ca2deb2c979a936c /lib/Analysis/BasicConstraintManager.cpp | |
parent | a68c106ed270c9161240e4d3716aa1201347ae48 (diff) |
Fix crash of array bounds checking under 64-bit.
There might be other, similar bugs lurking there.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59974 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicConstraintManager.cpp')
-rw-r--r-- | lib/Analysis/BasicConstraintManager.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Analysis/BasicConstraintManager.cpp b/lib/Analysis/BasicConstraintManager.cpp index a359b23c54..6f62c4ba77 100644 --- a/lib/Analysis/BasicConstraintManager.cpp +++ b/lib/Analysis/BasicConstraintManager.cpp @@ -369,8 +369,14 @@ BasicConstraintManager::AssumeInBound(const GRState* St, SVal Idx, } const llvm::APSInt& Zero = getBasicVals().getZeroWithPtrWidth(false); - const llvm::APSInt& IdxV = cast<nonloc::ConcreteInt>(Idx).getValue(); - const llvm::APSInt& UBV = cast<nonloc::ConcreteInt>(UpperBound).getValue(); + llvm::APSInt IdxV = cast<nonloc::ConcreteInt>(Idx).getValue(); + // IdxV might be too narrow. + if (IdxV.getBitWidth() < Zero.getBitWidth()) + IdxV.extend(Zero.getBitWidth()); + // UBV might be too narrow, too. + llvm::APSInt UBV = cast<nonloc::ConcreteInt>(UpperBound).getValue(); + if (UBV.getBitWidth() < Zero.getBitWidth()) + UBV.extend(Zero.getBitWidth()); bool InBound = (Zero <= IdxV) && (IdxV < UBV); |