// RUN: %clang_analyze_cc1 -analyzer-config eagerly-assume=false %s -analyzer-checker=osx.cocoa.RetainCount,deadcode.DeadStores,core -analyzer-output=plist -analyzer-config deadcode.DeadStores:ShowFixIts=true -o %t.plist // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/plist-output.m.plist - void test_null_init(void) { int *p = 0; *p = 0xDEADBEEF; } void test_null_assign(void) { int *p; p = 0; *p = 0xDEADBEEF; } void test_null_assign_transitive(void) { int *p; p = 0; int *q = p; *q = 0xDEADBEEF; } void test_null_cond(int *p) { if (!p) { *p = 0xDEADBEEF; } } void test_null_cond_transitive(int *q) { if (!q) { int *p = q; *p = 0xDEADBEEF; } } void test_null_field(void) { struct s { int *p; } x; x.p = 0; *(x.p) = 0xDEADBEEF; } void test_assumptions(int a, int b) { if (a == 0) { return; } if (b != 0) { return; } int *p = 0; *p = 0xDEADBEEF; } int *bar_cond_assign(); int test_cond_assign() { int *p; if (p = bar_cond_assign()) return 1; return *p; } // The following previously crashed when generating extensive diagnostics. // @interface RDar10797980_help @property (readonly) int x; @end @interface RDar10797980 { RDar10797980_help *y; } - (void) test; @end @implementation RDar10797980 - (void) test { if (y.x == 1) { int *p = 0; *p = 0xDEADBEEF; // expected-warning {{deference}} } } // The original source for the above Radar contains another problem: // if the end-of-path node is an implicit statement, it may not have a valid // source location. - (void)test2 { if (bar_cond_assign()) { id foo = [[RDar10797980 alloc] init]; // leak } (void)y; // first statement after the 'if' is an implicit 'self' DeclRefExpr } @end // Test that loops are documented in the path. void rdar12280665() { for (unsigned i = 0; i < 2; ++i) { if (i == 1) { int *p = 0; *p = 0xDEADBEEF; // expected-warning {{dereference}} } } } // Test for a "loop executed 0 times" diagnostic. int *radar12322528_bar(); void radar12322528_for(int x) { int *p = 0; for (unsigned i = 0; i < x; ++i) { p = radar12322528_bar(); } *p = 0xDEADBEEF; } void radar12322528_while(int x) { int *p = 0; unsigned i = 0; for ( ; i < x ; ) { ++i; p = radar12322528_bar(); } *p = 0xDEADBEEF; } void radar12322528_foo_2() { int *p = 0; for (unsigned i = 0; i < 2; ++i) { if (i == 1) break; } *p = 0xDEADBEEF; } void test_loop_diagnostics() { int *p = 0; for (int i = 0; i < 2; ++i) { p = 0; } *p = 1; } void test_loop_diagnostics_2() { int *p = 0; for (int i = 0; i < 2; ) { ++i; p = 0; } *p = 1; } void test_loop_diagnostics_3() { int *p = 0; int i = 0; while (i < 2) { ++i; p = 0; } *p = 1; } void test_loop_fast_enumeration(id arr) { int x; for (id obj in arr) { x = 1; } x += 1; } @interface RDar12114812 { char *p; } @end @implementation RDar12114812 - (void)test { p = 0; *p = 1; } @end // Test diagnostics for initialization of structs. void RDar13295437_f(void *i) __attribute__((__nonnull__)); struct RDar13295437_S { int *i; }; int RDar13295437() { struct RDar13295437_S s = {0}; struct RDar13295437_S *sp = &s; RDar13295437_f(sp->i); } @interface Foo - (int *) returnsPointer; @end int testFoo(Foo *x) { if (x) return 1; return *[x returnsPointer]; }