summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2018-12-15 02:13:26 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2018-12-15 02:13:26 +0000
commit46f34624d215b2b6851416d2475a5dd152f862e9 (patch)
tree0fcd720232f98b0c3a406eea80435cffef4f9f78
parent0ce45fae72913eea670df9bc72de5631b61d3392 (diff)
downloadbcm5719-llvm-46f34624d215b2b6851416d2475a5dd152f862e9.tar.gz
bcm5719-llvm-46f34624d215b2b6851416d2475a5dd152f862e9.zip
[analyzer] Fix unknown block calls to have zero parameters.
Right now they report to have one parameter with null decl, because initializing an ArrayRef of pointers with a nullptr yields an ArrayRef to an array of one null pointer. Fixes a crash in the OSObject section of RetainCountChecker. Differential Revision: https://reviews.llvm.org/D55671 llvm-svn: 349229
-rw-r--r--clang/lib/StaticAnalyzer/Core/CallEvent.cpp2
-rw-r--r--clang/test/Analysis/osobject-retain-release.cpp11
2 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
index 767116630f4..8d9338b21c1 100644
--- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
@@ -837,7 +837,7 @@ const BlockDataRegion *BlockCall::getBlockRegion() const {
ArrayRef<ParmVarDecl*> BlockCall::parameters() const {
const BlockDecl *D = getDecl();
if (!D)
- return nullptr;
+ return None;
return D->parameters();
}
diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp
index b8eb462d20e..c8bc4aeaa0a 100644
--- a/clang/test/Analysis/osobject-retain-release.cpp
+++ b/clang/test/Analysis/osobject-retain-release.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_analyze_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=text -verify %s
+// RUN: %clang_analyze_cc1 -fblocks -analyze -analyzer-output=text\
+// RUN: -analyzer-checker=core,osx -verify %s
struct OSMetaClass;
@@ -399,3 +400,11 @@ unsigned int ok_release_with_unknown_source(ArrayOwner *owner) {
arr->release(); // +0
return arr->getCount();
}
+
+OSObject *getObject();
+typedef bool (^Blk)(OSObject *);
+
+void test_escape_to_unknown_block(Blk blk) {
+ blk(getObject()); // no-crash
+}
+
OpenPOWER on IntegriCloud