Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / Analysis / plist-output.m
blob96123243a833a01dc207d631cd5c09c10c985d62
1 // 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
2 // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/plist-output.m.plist -
4 void test_null_init(void) {
5   int *p = 0;
6   *p = 0xDEADBEEF;
9 void test_null_assign(void) {
10   int *p;
11   p = 0;
12   *p = 0xDEADBEEF;
15 void test_null_assign_transitive(void) {
16   int *p;
17   p = 0;
18   int *q = p;
19   *q = 0xDEADBEEF;
22 void test_null_cond(int *p) {
23   if (!p) {
24     *p = 0xDEADBEEF;
25   }
28 void test_null_cond_transitive(int *q) {
29   if (!q) {
30     int *p = q;
31     *p = 0xDEADBEEF;
32   }
35 void test_null_field(void) {
36   struct s { int *p; } x;
37   x.p = 0;
38   *(x.p) = 0xDEADBEEF;
41 void test_assumptions(int a, int b)
43   if (a == 0) {
44     return;
45   }
46   if (b != 0) {
47     return;
48   }
49   int *p = 0;
50   *p = 0xDEADBEEF;
53 int *bar_cond_assign(void);
54 int test_cond_assign(void) {
55   int *p;
56   if (p = bar_cond_assign())
57     return 1;
58   return *p;
61 // The following previously crashed when generating extensive diagnostics.
62 @interface RDar10797980_help
63 @property (readonly) int x;
64 @end
66 @interface RDar10797980 {
67   RDar10797980_help *y;
69 - (void) test;
70 @end
72 @implementation RDar10797980
73 - (void) test {
74   if (y.x == 1) {
75     int *p = 0;
76     *p = 0xDEADBEEF; // expected-warning {{deference}}
77   }
80 // The original source for the above Radar contains another problem:
81 // if the end-of-path node is an implicit statement, it may not have a valid
82 // source location.
83 - (void)test2 {
84   if (bar_cond_assign()) {
85     id foo = [[RDar10797980 alloc] init]; // leak
86   }
87   (void)y; // first statement after the 'if' is an implicit 'self' DeclRefExpr
90 @end
92 // Test that loops are documented in the path.
93 void rdar12280665(void) {
94   for (unsigned i = 0; i < 2; ++i) {
95           if (i == 1) {
96                   int *p = 0;
97                   *p = 0xDEADBEEF; // expected-warning {{dereference}}
98           }
99   }
102 // Test for a "loop executed 0 times" diagnostic.
103 int *radar12322528_bar(void);
105 void radar12322528_for(int x) {
106   int *p = 0;
107   for (unsigned i = 0; i < x; ++i) {
108     p = radar12322528_bar();
109   }
110   *p = 0xDEADBEEF;
113 void radar12322528_while(int x) {
114   int *p = 0;
115   unsigned i = 0;
116   for ( ; i < x ; ) {
117     ++i;
118     p = radar12322528_bar();
119   }
120   *p = 0xDEADBEEF;
123 void radar12322528_foo_2(void) {
124   int *p = 0;
125   for (unsigned i = 0; i < 2; ++i) {
126     if (i == 1)
127       break;
128   }
129   *p = 0xDEADBEEF;
132 void test_loop_diagnostics(void) {
133   int *p = 0;
134   for (int i = 0; i < 2; ++i) { p = 0; }
135   *p = 1;
138 void test_loop_diagnostics_2(void) {
139   int *p = 0;
140   for (int i = 0; i < 2; ) {
141     ++i;
142     p = 0;
143   }
144   *p = 1;
147 void test_loop_diagnostics_3(void) {
148   int *p = 0;
149   int i = 0;
150   while (i < 2) {
151     ++i;
152     p = 0;
153   }
154   *p = 1;
157 void test_loop_fast_enumeration(id arr) {
158   int x;
159   for (id obj in arr) {
160     x = 1;
161   }
162   x += 1;
165 @interface RDar12114812 { char *p; }
166 @end
168 @implementation RDar12114812
169 - (void)test {
170   p = 0;
171   *p = 1;
173 @end
175 // Test diagnostics for initialization of structs.
176 void RDar13295437_f(void *i) __attribute__((__nonnull__));
178 struct  RDar13295437_S { int *i; };
180 int  RDar13295437(void) {
181   struct RDar13295437_S s = {0};
182   struct RDar13295437_S *sp = &s;
183   RDar13295437_f(sp->i);
186 @interface Foo
187 - (int *) returnsPointer;
188 @end
190 int testFoo(Foo *x) {
191   if (x)
192     return 1;
193   return *[x returnsPointer];