summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2017-02-03 21:45:29 +0000
committerHans Wennborg <hans@hanshq.net>2017-02-03 21:45:29 +0000
commitc1eda1f00cb561893791762a7e2969afc6dfb149 (patch)
tree0cbc9e1475bc17ad9e5d694ce1602634b4eeede3 /test
parenta6a1d3f3aa6c1d0018d84c3d6c26a552075982ab (diff)
Merging r293043:
------------------------------------------------------------------------ r293043 | dergachev | 2017-01-25 02:21:45 -0800 (Wed, 25 Jan 2017) | 12 lines [analyzer] Fix MacOSXAPIChecker fp with static locals seen from nested blocks. This is an attempt to avoid new false positives caused by the reverted r292800, however the scope of the fix is significantly reduced - some variables are still in incorrect memory spaces. Relevant test cases added. rdar://problem/30105546 rdar://problem/30156693 Differential revision: https://reviews.llvm.org/D28946 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_40@294050 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Analysis/dispatch-once.m7
-rw-r--r--test/Analysis/null-deref-static.m35
2 files changed, 42 insertions, 0 deletions
diff --git a/test/Analysis/dispatch-once.m b/test/Analysis/dispatch-once.m
index 7d54147aeb..2f82718663 100644
--- a/test/Analysis/dispatch-once.m
+++ b/test/Analysis/dispatch-once.m
@@ -107,3 +107,10 @@ void test_block_var_from_outside_block() {
};
dispatch_once(&once, ^{}); // expected-warning{{Call to 'dispatch_once' uses the block variable 'once' for the predicate value.}}
}
+
+void test_static_var_from_outside_block() {
+ static dispatch_once_t once;
+ ^{
+ dispatch_once(&once, ^{}); // no-warning
+ };
+}
diff --git a/test/Analysis/null-deref-static.m b/test/Analysis/null-deref-static.m
new file mode 100644
index 0000000000..887bea2523
--- /dev/null
+++ b/test/Analysis/null-deref-static.m
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -w -fblocks -analyze -analyzer-checker=core,deadcode,alpha.core,debug.ExprInspection -verify %s
+
+void *malloc(unsigned long);
+void clang_analyzer_warnIfReached();
+
+void test_static_from_block() {
+ static int *x;
+ ^{
+ *x; // no-warning
+ };
+}
+
+void test_static_within_block() {
+ ^{
+ static int *x;
+ *x; // expected-warning{{Dereference of null pointer}}
+ };
+}
+
+void test_static_control_flow(int y) {
+ static int *x;
+ if (x) {
+ // FIXME: Should be reachable.
+ clang_analyzer_warnIfReached(); // no-warning
+ }
+ if (y) {
+ // We are not sure if this branch is possible, because the developer
+ // may argue that function is always called with y == 1 for the first time.
+ // In this case, we can only advise the developer to add assertions
+ // for suppressing such path.
+ *x; // expected-warning{{Dereference of null pointer}}
+ } else {
+ x = malloc(1);
+ }
+}