aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevin Coughlin <dcoughlin@apple.com>2016-12-16 18:41:40 +0000
committerDevin Coughlin <dcoughlin@apple.com>2016-12-16 18:41:40 +0000
commite3b75ded98fefbd9b52d897b25bb619cfa4df699 (patch)
tree13e7e12e78a5d9c54d8907e56e18726fc1b2805a
parent8980ba643e3ec8d00d7cdf75a3a298fa1fd4fee2 (diff)
downloadllvm-e3b75ded98fefbd9b52d897b25bb619cfa4df699.zip
llvm-e3b75ded98fefbd9b52d897b25bb619cfa4df699.tar.gz
llvm-e3b75ded98fefbd9b52d897b25bb619cfa4df699.tar.bz2
[analyzer] Fix crash in MallocChecker.
Fix a crash in the MallocChecker when the extent size for the argument to new[] is not known. A patch by Abramo Bagnara and Dániel Krupp! https://reviews.llvm.org/D27849 Differential Revision: https://reviews.llvm.org/D27849 llvm-svn: 289970
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp3
-rw-r--r--clang/test/Analysis/out-of-bounds-new.cpp6
2 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
index 07c6072..f7c4ea1 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
@@ -1026,8 +1026,7 @@ ProgramStateRef MallocChecker::addExtentSize(CheckerContext &C,
ASTContext &AstContext = C.getASTContext();
CharUnits TypeSize = AstContext.getTypeSizeInChars(ElementType);
- if (Optional<DefinedOrUnknownSVal> DefinedSize =
- ElementCount.getAs<DefinedOrUnknownSVal>()) {
+ if (ElementCount.getAs<NonLoc>()) {
DefinedOrUnknownSVal Extent = Region->getExtent(svalBuilder);
// size in Bytes = ElementCount*TypeSize
SVal SizeInBytes = svalBuilder.evalBinOpNN(
diff --git a/clang/test/Analysis/out-of-bounds-new.cpp b/clang/test/Analysis/out-of-bounds-new.cpp
index 41ecbee..ee7bb1e 100644
--- a/clang/test/Analysis/out-of-bounds-new.cpp
+++ b/clang/test/Analysis/out-of-bounds-new.cpp
@@ -148,3 +148,9 @@ void test_dynamic_size(int s) {
int *buf = new int[s];
buf[0] = 1; // no-warning
}
+//Tests complex arithmetic
+//in new expression
+void test_dynamic_size2(unsigned m,unsigned n){
+ unsigned *U = nullptr;
+ U = new unsigned[m + n + 1];
+}