From: Anna Zaks Date: Thu, 10 May 2012 21:49:52 +0000 (+0000) Subject: [analyzer] Exit early if constraint solver is given a non-integer symbol X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3b1ae85757a8722caccb742b73ca31b4b53bb0a;p=clang [analyzer] Exit early if constraint solver is given a non-integer symbol to reason about. As part of taint propagation, we now allow creation of non-integer symbolic expressions like a cast from int to float. Addresses PR12511 (radar://11215362). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156578 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp b/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp index 92a8eb1a7a..5568f1ca55 100644 --- a/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp +++ b/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp @@ -137,6 +137,11 @@ SimpleConstraintManager::assumeAuxForSymbol(ProgramStateRef State, SymbolRef Sym, bool Assumption) { BasicValueFactory &BVF = getBasicVals(); QualType T = Sym->getType(BVF.getContext()); + + // None of the constraint solvers currently support non-integer types. + if (!T->isIntegerType()) + return State; + const llvm::APSInt &zero = BVF.getValue(0, T); if (Assumption) return assumeSymNE(State, Sym, zero, zero); diff --git a/test/Analysis/casts.c b/test/Analysis/casts.c index 8b88a2db43..f862ddf573 100644 --- a/test/Analysis/casts.c +++ b/test/Analysis/casts.c @@ -65,3 +65,11 @@ void pr6013_6035_test(void *p) { foo = ((long)(p)); (void) foo; } + +// PR12511 and radar://11215362 - Test that we support SymCastExpr, which represents symbolic int to float cast. +char ttt(int intSeconds) { + double seconds = intSeconds; + if (seconds) + return 0; + return 0; +}