From: Artem Dergachev Date: Mon, 18 Jan 2016 10:17:16 +0000 (+0000) Subject: [analyzer] Fix an off-by-one in evalIntegralCast() X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=da8e5d14ce98366d6e1e35c458e8d9780e7540ba;p=clang [analyzer] Fix an off-by-one in evalIntegralCast() Make sure that we do not add SymbolCast at the very boundary of the range in which the cast would not certainly happen. Differential Revision: http://reviews.llvm.org/D16178 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@258039 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/SValBuilder.cpp b/lib/StaticAnalyzer/Core/SValBuilder.cpp index 18315225a9..22bc14edd6 100644 --- a/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -451,7 +451,7 @@ SVal SValBuilder::evalIntegralCast(ProgramStateRef state, SVal val, NonLoc FromVal = val.castAs(); QualType CmpTy = getConditionType(); NonLoc CompVal = - evalBinOpNN(state, BO_LT, FromVal, ToTypeMaxVal, CmpTy).castAs(); + evalBinOpNN(state, BO_LE, FromVal, ToTypeMaxVal, CmpTy).castAs(); ProgramStateRef IsNotTruncated, IsTruncated; std::tie(IsNotTruncated, IsTruncated) = state->assume(CompVal); if (!IsNotTruncated && IsTruncated) { diff --git a/test/Analysis/bool-assignment.c b/test/Analysis/bool-assignment.c index 0f782fbfd9..285569ee11 100644 --- a/test/Analysis/bool-assignment.c +++ b/test/Analysis/bool-assignment.c @@ -42,6 +42,15 @@ void test_BOOL_initialization(int y) { BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} return; } + if (y > 200 && y < 250) { + // FIXME: Currently we are loosing this warning due to a SymbolCast in RHS. + BOOL x = y; // no-warning + return; + } + if (y >= 127 && y < 150) { + BOOL x = y; // expected-warning{{Assignment of a non-Boolean value}} + return; + } if (y > 1) { BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} return;