blob: ae82839c323181885ab745f685930fc358134c6b [file] [log] [blame]
Anna Zaks5d4ec362012-08-29 21:22:37 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=text -verify %s
2// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=plist-multi-file %s -o - | FileCheck %s
3
4typedef signed char BOOL;
5@protocol NSObject - (BOOL)isEqual:(id)object; @end
6@interface NSObject <NSObject> {}
7+(id)alloc;
8+(id)new;
9-(id)init;
10-(id)autorelease;
11-(id)copy;
12- (Class)class;
13-(id)retain;
14@end
15typedef const void * CFTypeRef;
16extern void CFRelease(CFTypeRef cf);
17
18@interface Cell : NSObject
19- (void)test;
20@end
21
22@interface SpecialString
23+ (id)alloc;
24- (oneway void)release;
25@end
26
27typedef SpecialString* SCDynamicStoreRef;
28static void CreateRef(SCDynamicStoreRef *storeRef, unsigned x);
29SCDynamicStoreRef anotherCreateRef(unsigned *err, unsigned x);
30
31@implementation Cell
32- (void) test {
33 SCDynamicStoreRef storeRef = 0; //expected-note{{Variable 'storeRef' initialized to nil}}
34 CreateRef(&storeRef, 4);
35 //expected-note@-1{{Calling 'CreateRef'}}
36 //expected-note@-2{{Returning from 'CreateRef'}}
37 CFRelease(storeRef); //expected-warning {{Null pointer argument in call to CFRelease}}
38 //expected-note@-1{{Null pointer argument in call to CFRelease}}
39}
40@end
41
42static void CreateRef(SCDynamicStoreRef *storeRef, unsigned x) {
43 unsigned err = 0;
44 SCDynamicStoreRef ref = anotherCreateRef(&err, x); // why this is being inlined?
45 if (err) {
46 //expected-note@-1{{Assuming 'err' is not equal to 0}}
47 //expected-note@-2{{Taking true branch}}
48 CFRelease(ref);
49 ref = 0;
50 }
51 *storeRef = ref;
52}
53
54//CHECK: <dict>
55//CHECK: <key>files</key>
56//CHECK: <array>
57//CHECK: </array>
58//CHECK: <key>diagnostics</key>
59//CHECK: <array>
60//CHECK: <dict>
61//CHECK: <key>path</key>
62//CHECK: <array>
63//CHECK: <dict>
64//CHECK: <key>kind</key><string>event</string>
65//CHECK: <key>location</key>
66//CHECK: <dict>
67//CHECK: <key>line</key><integer>33</integer>
68//CHECK: <key>col</key><integer>5</integer>
69//CHECK: <key>file</key><integer>0</integer>
70//CHECK: </dict>
71//CHECK: <key>ranges</key>
72//CHECK: <array>
73//CHECK: <array>
74//CHECK: <dict>
75//CHECK: <key>line</key><integer>33</integer>
76//CHECK: <key>col</key><integer>5</integer>
77//CHECK: <key>file</key><integer>0</integer>
78//CHECK: </dict>
79//CHECK: <dict>
80//CHECK: <key>line</key><integer>33</integer>
81//CHECK: <key>col</key><integer>30</integer>
82//CHECK: <key>file</key><integer>0</integer>
83//CHECK: </dict>
84//CHECK: </array>
85//CHECK: </array>
86//CHECK: <key>depth</key><integer>0</integer>
87//CHECK: <key>extended_message</key>
88//CHECK: <string>Variable &apos;storeRef&apos; initialized to nil</string>
89//CHECK: <key>message</key>
90//CHECK: <string>Variable &apos;storeRef&apos; initialized to nil</string>
91//CHECK: </dict>
92//CHECK: <dict>
93//CHECK: <key>kind</key><string>control</string>
94//CHECK: <key>edges</key>
95//CHECK: <array>
96//CHECK: <dict>
97//CHECK: <key>start</key>
98//CHECK: <array>
99//CHECK: <dict>
100//CHECK: <key>line</key><integer>33</integer>
101//CHECK: <key>col</key><integer>5</integer>
102//CHECK: <key>file</key><integer>0</integer>
103//CHECK: </dict>
104//CHECK: <dict>
105//CHECK: <key>line</key><integer>33</integer>
106//CHECK: <key>col</key><integer>21</integer>
107//CHECK: <key>file</key><integer>0</integer>
108//CHECK: </dict>
109//CHECK: </array>
110//CHECK: <key>end</key>
111//CHECK: <array>
112//CHECK: <dict>
113//CHECK: <key>line</key><integer>34</integer>
114//CHECK: <key>col</key><integer>5</integer>
115//CHECK: <key>file</key><integer>0</integer>
116//CHECK: </dict>
117//CHECK: <dict>
118//CHECK: <key>line</key><integer>34</integer>
119//CHECK: <key>col</key><integer>13</integer>
120//CHECK: <key>file</key><integer>0</integer>
121//CHECK: </dict>
122//CHECK: </array>
123//CHECK: </dict>
124//CHECK: </array>
125//CHECK: </dict>
126//CHECK: <dict>
127//CHECK: <key>kind</key><string>event</string>
128//CHECK: <key>location</key>
129//CHECK: <dict>
130//CHECK: <key>line</key><integer>34</integer>
131//CHECK: <key>col</key><integer>5</integer>
132//CHECK: <key>file</key><integer>0</integer>
133//CHECK: </dict>
134//CHECK: <key>ranges</key>
135//CHECK: <array>
136//CHECK: <array>
137//CHECK: <dict>
138//CHECK: <key>line</key><integer>34</integer>
139//CHECK: <key>col</key><integer>5</integer>
140//CHECK: <key>file</key><integer>0</integer>
141//CHECK: </dict>
142//CHECK: <dict>
143//CHECK: <key>line</key><integer>34</integer>
144//CHECK: <key>col</key><integer>27</integer>
145//CHECK: <key>file</key><integer>0</integer>
146//CHECK: </dict>
147//CHECK: </array>
148//CHECK: </array>
149//CHECK: <key>depth</key><integer>0</integer>
150//CHECK: <key>extended_message</key>
151//CHECK: <string>Calling &apos;CreateRef&apos;</string>
152//CHECK: <key>message</key>
153//CHECK: <string>Calling &apos;CreateRef&apos;</string>
154//CHECK: </dict>
155//CHECK: <dict>
156//CHECK: <key>kind</key><string>event</string>
157//CHECK: <key>location</key>
158//CHECK: <dict>
159//CHECK: <key>line</key><integer>42</integer>
160//CHECK: <key>col</key><integer>1</integer>
161//CHECK: <key>file</key><integer>0</integer>
162//CHECK: </dict>
163//CHECK: <key>depth</key><integer>1</integer>
164//CHECK: <key>extended_message</key>
165//CHECK: <string>Entered call from &apos;test&apos;</string>
166//CHECK: <key>message</key>
167//CHECK: <string>Entered call from &apos;test&apos;</string>
168//CHECK: </dict>
169//CHECK: <dict>
170//CHECK: <key>kind</key><string>control</string>
171//CHECK: <key>edges</key>
172//CHECK: <array>
173//CHECK: <dict>
174//CHECK: <key>start</key>
175//CHECK: <array>
176//CHECK: <dict>
177//CHECK: <key>line</key><integer>42</integer>
178//CHECK: <key>col</key><integer>1</integer>
179//CHECK: <key>file</key><integer>0</integer>
180//CHECK: </dict>
181//CHECK: <dict>
182//CHECK: <key>line</key><integer>42</integer>
183//CHECK: <key>col</key><integer>6</integer>
184//CHECK: <key>file</key><integer>0</integer>
185//CHECK: </dict>
186//CHECK: </array>
187//CHECK: <key>end</key>
188//CHECK: <array>
189//CHECK: <dict>
190//CHECK: <key>line</key><integer>43</integer>
191//CHECK: <key>col</key><integer>5</integer>
192//CHECK: <key>file</key><integer>0</integer>
193//CHECK: </dict>
194//CHECK: <dict>
195//CHECK: <key>line</key><integer>43</integer>
196//CHECK: <key>col</key><integer>12</integer>
197//CHECK: <key>file</key><integer>0</integer>
198//CHECK: </dict>
199//CHECK: </array>
200//CHECK: </dict>
201//CHECK: </array>
202//CHECK: </dict>
203//CHECK: <dict>
204//CHECK: <key>kind</key><string>control</string>
205//CHECK: <key>edges</key>
206//CHECK: <array>
207//CHECK: <dict>
208//CHECK: <key>start</key>
209//CHECK: <array>
210//CHECK: <dict>
211//CHECK: <key>line</key><integer>43</integer>
212//CHECK: <key>col</key><integer>5</integer>
213//CHECK: <key>file</key><integer>0</integer>
214//CHECK: </dict>
215//CHECK: <dict>
216//CHECK: <key>line</key><integer>43</integer>
217//CHECK: <key>col</key><integer>12</integer>
218//CHECK: <key>file</key><integer>0</integer>
219//CHECK: </dict>
220//CHECK: </array>
221//CHECK: <key>end</key>
222//CHECK: <array>
223//CHECK: <dict>
224//CHECK: <key>line</key><integer>45</integer>
225//CHECK: <key>col</key><integer>5</integer>
226//CHECK: <key>file</key><integer>0</integer>
227//CHECK: </dict>
228//CHECK: <dict>
229//CHECK: <key>line</key><integer>45</integer>
230//CHECK: <key>col</key><integer>6</integer>
231//CHECK: <key>file</key><integer>0</integer>
232//CHECK: </dict>
233//CHECK: </array>
234//CHECK: </dict>
235//CHECK: </array>
236//CHECK: </dict>
237//CHECK: <dict>
238//CHECK: <key>kind</key><string>control</string>
239//CHECK: <key>edges</key>
240//CHECK: <array>
241//CHECK: <dict>
242//CHECK: <key>start</key>
243//CHECK: <array>
244//CHECK: <dict>
245//CHECK: <key>line</key><integer>45</integer>
246//CHECK: <key>col</key><integer>5</integer>
247//CHECK: <key>file</key><integer>0</integer>
248//CHECK: </dict>
249//CHECK: <dict>
250//CHECK: <key>line</key><integer>45</integer>
251//CHECK: <key>col</key><integer>6</integer>
252//CHECK: <key>file</key><integer>0</integer>
253//CHECK: </dict>
254//CHECK: </array>
255//CHECK: <key>end</key>
256//CHECK: <array>
257//CHECK: <dict>
258//CHECK: <key>line</key><integer>45</integer>
259//CHECK: <key>col</key><integer>9</integer>
260//CHECK: <key>file</key><integer>0</integer>
261//CHECK: </dict>
262//CHECK: <dict>
263//CHECK: <key>line</key><integer>45</integer>
264//CHECK: <key>col</key><integer>11</integer>
265//CHECK: <key>file</key><integer>0</integer>
266//CHECK: </dict>
267//CHECK: </array>
268//CHECK: </dict>
269//CHECK: </array>
270//CHECK: </dict>
271//CHECK: <dict>
272//CHECK: <key>kind</key><string>event</string>
273//CHECK: <key>location</key>
274//CHECK: <dict>
275//CHECK: <key>line</key><integer>45</integer>
276//CHECK: <key>col</key><integer>9</integer>
277//CHECK: <key>file</key><integer>0</integer>
278//CHECK: </dict>
279//CHECK: <key>ranges</key>
280//CHECK: <array>
281//CHECK: <array>
282//CHECK: <dict>
283//CHECK: <key>line</key><integer>45</integer>
284//CHECK: <key>col</key><integer>9</integer>
285//CHECK: <key>file</key><integer>0</integer>
286//CHECK: </dict>
287//CHECK: <dict>
288//CHECK: <key>line</key><integer>45</integer>
289//CHECK: <key>col</key><integer>11</integer>
290//CHECK: <key>file</key><integer>0</integer>
291//CHECK: </dict>
292//CHECK: </array>
293//CHECK: </array>
294//CHECK: <key>depth</key><integer>1</integer>
295//CHECK: <key>extended_message</key>
296//CHECK: <string>Assuming &apos;err&apos; is not equal to 0</string>
297//CHECK: <key>message</key>
298//CHECK: <string>Assuming &apos;err&apos; is not equal to 0</string>
299//CHECK: </dict>
300//CHECK: <dict>
301//CHECK: <key>kind</key><string>control</string>
302//CHECK: <key>edges</key>
303//CHECK: <array>
304//CHECK: <dict>
305//CHECK: <key>start</key>
306//CHECK: <array>
307//CHECK: <dict>
308//CHECK: <key>line</key><integer>45</integer>
309//CHECK: <key>col</key><integer>9</integer>
310//CHECK: <key>file</key><integer>0</integer>
311//CHECK: </dict>
312//CHECK: <dict>
313//CHECK: <key>line</key><integer>45</integer>
314//CHECK: <key>col</key><integer>11</integer>
315//CHECK: <key>file</key><integer>0</integer>
316//CHECK: </dict>
317//CHECK: </array>
318//CHECK: <key>end</key>
319//CHECK: <array>
320//CHECK: <dict>
321//CHECK: <key>line</key><integer>48</integer>
322//CHECK: <key>col</key><integer>9</integer>
323//CHECK: <key>file</key><integer>0</integer>
324//CHECK: </dict>
325//CHECK: <dict>
326//CHECK: <key>line</key><integer>48</integer>
327//CHECK: <key>col</key><integer>17</integer>
328//CHECK: <key>file</key><integer>0</integer>
329//CHECK: </dict>
330//CHECK: </array>
331//CHECK: </dict>
332//CHECK: </array>
333//CHECK: </dict>
334//CHECK: <dict>
335//CHECK: <key>kind</key><string>control</string>
336//CHECK: <key>edges</key>
337//CHECK: <array>
338//CHECK: <dict>
339//CHECK: <key>start</key>
340//CHECK: <array>
341//CHECK: <dict>
342//CHECK: <key>line</key><integer>48</integer>
343//CHECK: <key>col</key><integer>9</integer>
344//CHECK: <key>file</key><integer>0</integer>
345//CHECK: </dict>
346//CHECK: <dict>
347//CHECK: <key>line</key><integer>48</integer>
348//CHECK: <key>col</key><integer>17</integer>
349//CHECK: <key>file</key><integer>0</integer>
350//CHECK: </dict>
351//CHECK: </array>
352//CHECK: <key>end</key>
353//CHECK: <array>
354//CHECK: <dict>
355//CHECK: <key>line</key><integer>51</integer>
356//CHECK: <key>col</key><integer>5</integer>
357//CHECK: <key>file</key><integer>0</integer>
358//CHECK: </dict>
359//CHECK: <dict>
360//CHECK: <key>line</key><integer>51</integer>
361//CHECK: <key>col</key><integer>5</integer>
362//CHECK: <key>file</key><integer>0</integer>
363//CHECK: </dict>
364//CHECK: </array>
365//CHECK: </dict>
366//CHECK: </array>
367//CHECK: </dict>
368//CHECK: <dict>
369//CHECK: <key>kind</key><string>event</string>
370//CHECK: <key>location</key>
371//CHECK: <dict>
372//CHECK: <key>line</key><integer>34</integer>
373//CHECK: <key>col</key><integer>5</integer>
374//CHECK: <key>file</key><integer>0</integer>
375//CHECK: </dict>
376//CHECK: <key>ranges</key>
377//CHECK: <array>
378//CHECK: <array>
379//CHECK: <dict>
380//CHECK: <key>line</key><integer>34</integer>
381//CHECK: <key>col</key><integer>5</integer>
382//CHECK: <key>file</key><integer>0</integer>
383//CHECK: </dict>
384//CHECK: <dict>
385//CHECK: <key>line</key><integer>34</integer>
386//CHECK: <key>col</key><integer>27</integer>
387//CHECK: <key>file</key><integer>0</integer>
388//CHECK: </dict>
389//CHECK: </array>
390//CHECK: </array>
391//CHECK: <key>depth</key><integer>1</integer>
392//CHECK: <key>extended_message</key>
393//CHECK: <string>Returning from &apos;CreateRef&apos;</string>
394//CHECK: <key>message</key>
395//CHECK: <string>Returning from &apos;CreateRef&apos;</string>
396//CHECK: </dict>
397//CHECK: <dict>
398//CHECK: <key>kind</key><string>control</string>
399//CHECK: <key>edges</key>
400//CHECK: <array>
401//CHECK: <dict>
402//CHECK: <key>start</key>
403//CHECK: <array>
404//CHECK: <dict>
405//CHECK: <key>line</key><integer>34</integer>
406//CHECK: <key>col</key><integer>5</integer>
407//CHECK: <key>file</key><integer>0</integer>
408//CHECK: </dict>
409//CHECK: <dict>
410//CHECK: <key>line</key><integer>34</integer>
411//CHECK: <key>col</key><integer>13</integer>
412//CHECK: <key>file</key><integer>0</integer>
413//CHECK: </dict>
414//CHECK: </array>
415//CHECK: <key>end</key>
416//CHECK: <array>
417//CHECK: <dict>
418//CHECK: <key>line</key><integer>37</integer>
419//CHECK: <key>col</key><integer>5</integer>
420//CHECK: <key>file</key><integer>0</integer>
421//CHECK: </dict>
422//CHECK: <dict>
423//CHECK: <key>line</key><integer>37</integer>
424//CHECK: <key>col</key><integer>13</integer>
425//CHECK: <key>file</key><integer>0</integer>
426//CHECK: </dict>
427//CHECK: </array>
428//CHECK: </dict>
429//CHECK: </array>
430//CHECK: </dict>
431//CHECK: <dict>
432//CHECK: <key>kind</key><string>event</string>
433//CHECK: <key>location</key>
434//CHECK: <dict>
435//CHECK: <key>line</key><integer>37</integer>
436//CHECK: <key>col</key><integer>5</integer>
437//CHECK: <key>file</key><integer>0</integer>
438//CHECK: </dict>
439//CHECK: <key>ranges</key>
440//CHECK: <array>
441//CHECK: <array>
442//CHECK: <dict>
443//CHECK: <key>line</key><integer>37</integer>
444//CHECK: <key>col</key><integer>15</integer>
445//CHECK: <key>file</key><integer>0</integer>
446//CHECK: </dict>
447//CHECK: <dict>
448//CHECK: <key>line</key><integer>37</integer>
449//CHECK: <key>col</key><integer>22</integer>
450//CHECK: <key>file</key><integer>0</integer>
451//CHECK: </dict>
452//CHECK: </array>
453//CHECK: </array>
454//CHECK: <key>depth</key><integer>0</integer>
455//CHECK: <key>extended_message</key>
456//CHECK: <string>Null pointer argument in call to CFRelease</string>
457//CHECK: <key>message</key>
458//CHECK: <string>Null pointer argument in call to CFRelease</string>
459//CHECK: </dict>
460//CHECK: </array>
461//CHECK: <key>description</key><string>Null pointer argument in call to CFRelease</string>
462//CHECK: <key>category</key><string>API Misuse (Apple)</string>
463//CHECK: <key>type</key><string>null passed to CFRetain/CFRelease</string>
464//CHECK: <key>issue_context_kind</key><string>Objective-C method</string>
465//CHECK: <key>issue_context</key><string>test</string>
466//CHECK: <key>issue_hash</key><integer>5</integer>
467//CHECK: <key>location</key>
468//CHECK: <dict>
469//CHECK: <key>line</key><integer>37</integer>
470//CHECK: <key>col</key><integer>5</integer>
471//CHECK: <key>file</key><integer>0</integer>
472//CHECK: </dict>
473//CHECK: </dict>
474//CHECK: </array>
475//CHECK: </dict>
476//CHECK: </plist>