summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Balogh <adam.balogh@ericsson.com>2018-04-13 20:23:02 +0000
committerAdam Balogh <adam.balogh@ericsson.com>2018-04-13 20:23:02 +0000
commit13e186c088e59797435edd25c139b36060be803d (patch)
treed36a80c0d291055881da2f904a1977773450ba8e
parentab40e44ba1b5ae97f53e5a885dbc93a4bed78302 (diff)
downloadbcm5719-llvm-13e186c088e59797435edd25c139b36060be803d.tar.gz
bcm5719-llvm-13e186c088e59797435edd25c139b36060be803d.zip
[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 llvm-svn: 330064
-rw-r--r--clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp2
-rw-r--r--clang/test/Analysis/svalbuilder-rearrange-comparisons.c5
2 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
index b2224b5495b..4171ebf1368 100644
--- a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
+++ b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
@@ -469,6 +469,8 @@ static Optional<NonLoc> 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/clang/test/Analysis/svalbuilder-rearrange-comparisons.c b/clang/test/Analysis/svalbuilder-rearrange-comparisons.c
index 47366d24456..720144c38ad 100644
--- a/clang/test/Analysis/svalbuilder-rearrange-comparisons.c
+++ b/clang/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;
+}
OpenPOWER on IntegriCloud