diff options
Diffstat (limited to 'test/Analysis')
-rw-r--r-- | test/Analysis/dispatch-once.m | 7 | ||||
-rw-r--r-- | test/Analysis/null-deref-static.m | 35 |
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); + } +} |