| // 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); |
| } |
| } |