From: Ted Kremenek Date: Tue, 2 Feb 2010 21:11:40 +0000 (+0000) Subject: Explicitly check for casts to double or complex types instead of possibly asserting... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f68170481d4c36e1e930ee9a3bce58e2ae5a95cb;p=clang Explicitly check for casts to double or complex types instead of possibly asserting in SValuator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95128 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Checker/SValuator.cpp b/lib/Checker/SValuator.cpp index 66cd3193b1..fd2bbd06fb 100644 --- a/lib/Checker/SValuator.cpp +++ b/lib/Checker/SValuator.cpp @@ -66,6 +66,12 @@ SValuator::CastResult SValuator::EvalCast(SVal val, const GRState *state, if (C.hasSameUnqualifiedType(castTy, originalTy)) return CastResult(state, val); + // Check for casts to real or complex numbers. We don't handle these at all + // right now. + if (castTy->isFloatingType() || castTy->isAnyComplexType()) + return CastResult(state, UnknownVal()); + + // Check for casts from integers to integers. if (castTy->isIntegerType() && originalTy->isIntegerType()) return CastResult(state, EvalCastNL(cast(val), castTy)); diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index acf49f8e67..b31cd4cdd1 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -851,3 +851,18 @@ int rdar_7593875(int n) { // Previously we got a false positive about 'v' being uninitialized. return v; // no-warning } + +//===----------------------------------------------------------------------===// +// Handle casts from symbolic regions (packaged as integers) to doubles. +// Previously this caused an assertion failure. +//===----------------------------------------------------------------------===// + +void *foo_rev95119(); +void baz_rev95119(double x); +void bar_rev95119() { + // foo_rev95119() returns a symbolic pointer. It is then + // cast to an int which is then cast to a double. + int value = (int) foo_rev95119(); + baz_rev95119((double)value); +} +