From: Adam Balogh Date: Fri, 13 Apr 2018 20:23:02 +0000 (+0000) Subject: [Analyzer] Fix for SValBuilder expressions rearrangement X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b11c48d1760a6323e6513e9494b5b0ca587cf4d4;p=clang [Analyzer] Fix for SValBuilder expressions rearrangement Expression rearrangement in SValBuilder (see rL329780) crashes with an assert if the type of the integer is different from the type of the symbol. This fix adds a check that prevents rearrangement in such cases. Differential Revision: https://reviews.llvm.org/D45557 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@330064 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index b2224b5495..4171ebf136 100644 --- a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -469,6 +469,8 @@ static Optional tryRearrange(ProgramStateRef State, // Initialize SingleTy later with a symbol's type. } else if (BinaryOperator::isAdditiveOp(Op)) { SingleTy = ResultTy; + if (LSym->getType() != SingleTy) + return None; // Substracting unsigned integers is a nightmare. if (!SingleTy->isSignedIntegerOrEnumerationType()) return None; diff --git a/test/Analysis/svalbuilder-rearrange-comparisons.c b/test/Analysis/svalbuilder-rearrange-comparisons.c index 47366d2445..720144c38a 100644 --- a/test/Analysis/svalbuilder-rearrange-comparisons.c +++ b/test/Analysis/svalbuilder-rearrange-comparisons.c @@ -929,3 +929,8 @@ void overflow(signed char n, signed char m) { clang_analyzer_eval(n - 126 == m + 3); // expected-warning{{UNKNOWN}} } } + +int mixed_integer_types(int x, int y) { + short a = x - 1U; + return a - y; +}