diff options
| author | Devin Coughlin <dcoughlin@apple.com> | 2016-12-16 18:41:40 +0000 |
|---|---|---|
| committer | Devin Coughlin <dcoughlin@apple.com> | 2016-12-16 18:41:40 +0000 |
| commit | e3b75ded98fefbd9b52d897b25bb619cfa4df699 (patch) | |
| tree | 13e7e12e78a5d9c54d8907e56e18726fc1b2805a | |
| parent | 8980ba643e3ec8d00d7cdf75a3a298fa1fd4fee2 (diff) | |
| download | llvm-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.cpp | 3 | ||||
| -rw-r--r-- | clang/test/Analysis/out-of-bounds-new.cpp | 6 |
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]; +} |
