From 81c1e1306ce713fb54cef700581987d0f5038f52 Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Mon, 24 Nov 2008 19:35:33 +0000 Subject: Fix crash of array bounds checking under 64-bit. There might be other, similar bugs lurking there. llvm-svn: 59974 --- clang/lib/Analysis/BasicConstraintManager.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'clang/lib/Analysis/BasicConstraintManager.cpp') diff --git a/clang/lib/Analysis/BasicConstraintManager.cpp b/clang/lib/Analysis/BasicConstraintManager.cpp index a359b23c549..6f62c4ba772 100644 --- a/clang/lib/Analysis/BasicConstraintManager.cpp +++ b/clang/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(Idx).getValue(); - const llvm::APSInt& UBV = cast(UpperBound).getValue(); + llvm::APSInt IdxV = cast(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(UpperBound).getValue(); + if (UBV.getBitWidth() < Zero.getBitWidth()) + UBV.extend(Zero.getBitWidth()); bool InBound = (Zero <= IdxV) && (IdxV < UBV); -- cgit v1.2.3