From: Ted Kremenek Date: Tue, 6 Oct 2009 03:44:49 +0000 (+0000) Subject: Fix crash introduced by r83358 where a symbol could be eagerly X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1d042212fbb3f6a08864b703b7bdf0dca58fd9c;p=clang Fix crash introduced by r83358 where a symbol could be eagerly evaluated to an APSInt with a different bitwidth than the other operand in a binary expression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83368 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/SimpleSValuator.cpp b/lib/Analysis/SimpleSValuator.cpp index 2869fabea3..636ce15c33 100644 --- a/lib/Analysis/SimpleSValuator.cpp +++ b/lib/Analysis/SimpleSValuator.cpp @@ -349,8 +349,13 @@ SVal SimpleSValuator::EvalBinOpNN(const GRState *state, // Does the symbol simplify to a constant? if (Sym->getType(ValMgr.getContext())->isIntegerType()) if (const llvm::APSInt *Constant = state->getSymVal(Sym)) { - lhs = nonloc::ConcreteInt(*Constant); - continue; + // What should we convert it to? + if (nonloc::ConcreteInt *rhs_I = dyn_cast(&rhs)){ + BasicValueFactory &BVF = ValMgr.getBasicValueFactory(); + lhs = nonloc::ConcreteInt(BVF.Convert(rhs_I->getValue(), + *Constant)); + continue; + } } if (isa(rhs)) { diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 565dc61f3b..10e5823c20 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -681,3 +681,14 @@ void *rdar7152418_bar(); return 1; } +// Test constant-folding of symbolic values, automatically handling type +// conversions of the symbol as necessary. Previously this would crash +// once we started eagerly evaluating symbols whose values were constrained +// to a single value. +void test_constant_symbol(signed char x) { + while (1) { + if (x == ((signed char) 0)) {} + } +} + +