[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / Analysis / plist-output.m
blob543fa8ad40cb2332d0ecb09d55cf22319b668f29
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 // <rdar://problem/10797980>
63 @interface RDar10797980_help
64 @property (readonly) int x;
65 @end
67 @interface RDar10797980 {
68   RDar10797980_help *y;
70 - (void) test;
71 @end
73 @implementation RDar10797980
74 - (void) test {
75   if (y.x == 1) {
76     int *p = 0;
77     *p = 0xDEADBEEF; // expected-warning {{deference}}
78   }
81 // The original source for the above Radar contains another problem:
82 // if the end-of-path node is an implicit statement, it may not have a valid
83 // source location. <rdar://problem/12446776>
84 - (void)test2 {
85   if (bar_cond_assign()) {
86     id foo = [[RDar10797980 alloc] init]; // leak
87   }
88   (void)y; // first statement after the 'if' is an implicit 'self' DeclRefExpr
91 @end
93 // Test that loops are documented in the path.
94 void rdar12280665(void) {
95   for (unsigned i = 0; i < 2; ++i) {
96           if (i == 1) {
97                   int *p = 0;
98                   *p = 0xDEADBEEF; // expected-warning {{dereference}}
99           }
100   }
103 // Test for a "loop executed 0 times" diagnostic.
104 int *radar12322528_bar(void);
106 void radar12322528_for(int x) {
107   int *p = 0;
108   for (unsigned i = 0; i < x; ++i) {
109     p = radar12322528_bar();
110   }
111   *p = 0xDEADBEEF;
114 void radar12322528_while(int x) {
115   int *p = 0;
116   unsigned i = 0;
117   for ( ; i < x ; ) {
118     ++i;
119     p = radar12322528_bar();
120   }
121   *p = 0xDEADBEEF;
124 void radar12322528_foo_2(void) {
125   int *p = 0;
126   for (unsigned i = 0; i < 2; ++i) {
127     if (i == 1)
128       break;
129   }
130   *p = 0xDEADBEEF;
133 void test_loop_diagnostics(void) {
134   int *p = 0;
135   for (int i = 0; i < 2; ++i) { p = 0; }
136   *p = 1;
139 void test_loop_diagnostics_2(void) {
140   int *p = 0;
141   for (int i = 0; i < 2; ) {
142     ++i;
143     p = 0;
144   }
145   *p = 1;
148 void test_loop_diagnostics_3(void) {
149   int *p = 0;
150   int i = 0;
151   while (i < 2) {
152     ++i;
153     p = 0;
154   }
155   *p = 1;
158 void test_loop_fast_enumeration(id arr) {
159   int x;
160   for (id obj in arr) {
161     x = 1;
162   }
163   x += 1;
166 @interface RDar12114812 { char *p; }
167 @end
169 @implementation RDar12114812
170 - (void)test {
171   p = 0;
172   *p = 1;
174 @end
176 // Test diagnostics for initialization of structs.
177 void RDar13295437_f(void *i) __attribute__((__nonnull__));
179 struct  RDar13295437_S { int *i; };
181 int  RDar13295437(void) {
182   struct RDar13295437_S s = {0};
183   struct RDar13295437_S *sp = &s;
184   RDar13295437_f(sp->i);
187 @interface Foo
188 - (int *) returnsPointer;
189 @end
191 int testFoo(Foo *x) {
192   if (x)
193     return 1;
194   return *[x returnsPointer];