undef-value-param.m revision 0fe4d400ab05995727440620c25fe1d185b4e046
1// 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/CFMakeCollectable</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>
477