undef-value-param.c revision 80de487e03dd0f44e4572e2122ebc1aa6a3961f5
1// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=text -verify %s
2// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=plist-multi-file %s -o - | FileCheck %s
3
4void foo_irrelevant(int c) {
5    if (c)
6        return;
7    c++;
8    return;
9}
10void foo(int *x, int c) {
11    if (c)
12           //expected-note@-1{{Assuming 'c' is not equal to 0}}
13           //expected-note@-2{{Taking true branch}}
14        return;
15    *x = 5;
16}
17
18int use(int c) {
19    int xx; //expected-note{{Variable 'xx' declared without an initial value}}
20    int *y = &xx;
21    foo (y, c);
22                //expected-note@-1{{Calling 'foo'}}
23                //expected-note@-2{{Returning from 'foo'}}
24    foo_irrelevant(c);
25    return xx+3; //expected-warning{{The left operand of '+' is a garbage value}}
26                 //expected-note@-1{{The left operand of '+' is a garbage value}}
27}
28
29//CHECK:  <dict>
30//CHECK:   <key>files</key>
31//CHECK:   <array>
32//CHECK:   </array>
33//CHECK:   <key>diagnostics</key>
34//CHECK:   <array>
35//CHECK:    <dict>
36//CHECK:     <key>path</key>
37//CHECK:     <array>
38//CHECK:      <dict>
39//CHECK:       <key>kind</key><string>event</string>
40//CHECK:       <key>location</key>
41//CHECK:       <dict>
42//CHECK:        <key>line</key><integer>19</integer>
43//CHECK:        <key>col</key><integer>5</integer>
44//CHECK:        <key>file</key><integer>0</integer>
45//CHECK:       </dict>
46//CHECK:       <key>ranges</key>
47//CHECK:       <array>
48//CHECK:         <array>
49//CHECK:          <dict>
50//CHECK:           <key>line</key><integer>19</integer>
51//CHECK:           <key>col</key><integer>5</integer>
52//CHECK:           <key>file</key><integer>0</integer>
53//CHECK:          </dict>
54//CHECK:          <dict>
55//CHECK:           <key>line</key><integer>19</integer>
56//CHECK:           <key>col</key><integer>10</integer>
57//CHECK:           <key>file</key><integer>0</integer>
58//CHECK:          </dict>
59//CHECK:         </array>
60//CHECK:       </array>
61//CHECK:       <key>depth</key><integer>0</integer>
62//CHECK:       <key>extended_message</key>
63//CHECK:       <string>Variable &apos;xx&apos; declared without an initial value</string>
64//CHECK:       <key>message</key>
65//CHECK:  <string>Variable &apos;xx&apos; declared without an initial value</string>
66//CHECK:      </dict>
67//CHECK:      <dict>
68//CHECK:       <key>kind</key><string>control</string>
69//CHECK:       <key>edges</key>
70//CHECK:        <array>
71//CHECK:         <dict>
72//CHECK:          <key>start</key>
73//CHECK:           <array>
74//CHECK:            <dict>
75//CHECK:             <key>line</key><integer>19</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>19</integer>
81//CHECK:             <key>col</key><integer>7</integer>
82//CHECK:             <key>file</key><integer>0</integer>
83//CHECK:            </dict>
84//CHECK:           </array>
85//CHECK:          <key>end</key>
86//CHECK:           <array>
87//CHECK:            <dict>
88//CHECK:             <key>line</key><integer>21</integer>
89//CHECK:             <key>col</key><integer>5</integer>
90//CHECK:             <key>file</key><integer>0</integer>
91//CHECK:            </dict>
92//CHECK:            <dict>
93//CHECK:             <key>line</key><integer>21</integer>
94//CHECK:             <key>col</key><integer>7</integer>
95//CHECK:             <key>file</key><integer>0</integer>
96//CHECK:            </dict>
97//CHECK:           </array>
98//CHECK:         </dict>
99//CHECK:        </array>
100//CHECK:      </dict>
101//CHECK:      <dict>
102//CHECK:       <key>kind</key><string>event</string>
103//CHECK:       <key>location</key>
104//CHECK:       <dict>
105//CHECK:        <key>line</key><integer>21</integer>
106//CHECK:        <key>col</key><integer>5</integer>
107//CHECK:        <key>file</key><integer>0</integer>
108//CHECK:       </dict>
109//CHECK:       <key>ranges</key>
110//CHECK:       <array>
111//CHECK:         <array>
112//CHECK:          <dict>
113//CHECK:           <key>line</key><integer>21</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>21</integer>
119//CHECK:           <key>col</key><integer>14</integer>
120//CHECK:           <key>file</key><integer>0</integer>
121//CHECK:          </dict>
122//CHECK:         </array>
123//CHECK:       </array>
124//CHECK:       <key>depth</key><integer>0</integer>
125//CHECK:       <key>extended_message</key>
126//CHECK:       <string>Calling &apos;foo&apos;</string>
127//CHECK:       <key>message</key>
128//CHECK:  <string>Calling &apos;foo&apos;</string>
129//CHECK:      </dict>
130//CHECK:      <dict>
131//CHECK:       <key>kind</key><string>event</string>
132//CHECK:       <key>location</key>
133//CHECK:       <dict>
134//CHECK:        <key>line</key><integer>10</integer>
135//CHECK:        <key>col</key><integer>1</integer>
136//CHECK:        <key>file</key><integer>0</integer>
137//CHECK:       </dict>
138//CHECK:       <key>depth</key><integer>1</integer>
139//CHECK:       <key>extended_message</key>
140//CHECK:       <string>Entered call from &apos;use&apos;</string>
141//CHECK:       <key>message</key>
142//CHECK:  <string>Entered call from &apos;use&apos;</string>
143//CHECK:      </dict>
144//CHECK:      <dict>
145//CHECK:       <key>kind</key><string>control</string>
146//CHECK:       <key>edges</key>
147//CHECK:        <array>
148//CHECK:         <dict>
149//CHECK:          <key>start</key>
150//CHECK:           <array>
151//CHECK:            <dict>
152//CHECK:             <key>line</key><integer>10</integer>
153//CHECK:             <key>col</key><integer>1</integer>
154//CHECK:             <key>file</key><integer>0</integer>
155//CHECK:            </dict>
156//CHECK:            <dict>
157//CHECK:             <key>line</key><integer>10</integer>
158//CHECK:             <key>col</key><integer>4</integer>
159//CHECK:             <key>file</key><integer>0</integer>
160//CHECK:            </dict>
161//CHECK:           </array>
162//CHECK:          <key>end</key>
163//CHECK:           <array>
164//CHECK:            <dict>
165//CHECK:             <key>line</key><integer>11</integer>
166//CHECK:             <key>col</key><integer>5</integer>
167//CHECK:             <key>file</key><integer>0</integer>
168//CHECK:            </dict>
169//CHECK:            <dict>
170//CHECK:             <key>line</key><integer>11</integer>
171//CHECK:             <key>col</key><integer>6</integer>
172//CHECK:             <key>file</key><integer>0</integer>
173//CHECK:            </dict>
174//CHECK:           </array>
175//CHECK:         </dict>
176//CHECK:        </array>
177//CHECK:      </dict>
178//CHECK:      <dict>
179//CHECK:       <key>kind</key><string>control</string>
180//CHECK:       <key>edges</key>
181//CHECK:        <array>
182//CHECK:         <dict>
183//CHECK:          <key>start</key>
184//CHECK:           <array>
185//CHECK:            <dict>
186//CHECK:             <key>line</key><integer>11</integer>
187//CHECK:             <key>col</key><integer>5</integer>
188//CHECK:             <key>file</key><integer>0</integer>
189//CHECK:            </dict>
190//CHECK:            <dict>
191//CHECK:             <key>line</key><integer>11</integer>
192//CHECK:             <key>col</key><integer>6</integer>
193//CHECK:             <key>file</key><integer>0</integer>
194//CHECK:            </dict>
195//CHECK:           </array>
196//CHECK:          <key>end</key>
197//CHECK:           <array>
198//CHECK:            <dict>
199//CHECK:             <key>line</key><integer>11</integer>
200//CHECK:             <key>col</key><integer>9</integer>
201//CHECK:             <key>file</key><integer>0</integer>
202//CHECK:            </dict>
203//CHECK:            <dict>
204//CHECK:             <key>line</key><integer>11</integer>
205//CHECK:             <key>col</key><integer>9</integer>
206//CHECK:             <key>file</key><integer>0</integer>
207//CHECK:            </dict>
208//CHECK:           </array>
209//CHECK:         </dict>
210//CHECK:        </array>
211//CHECK:      </dict>
212//CHECK:      <dict>
213//CHECK:       <key>kind</key><string>event</string>
214//CHECK:       <key>location</key>
215//CHECK:       <dict>
216//CHECK:        <key>line</key><integer>11</integer>
217//CHECK:        <key>col</key><integer>9</integer>
218//CHECK:        <key>file</key><integer>0</integer>
219//CHECK:       </dict>
220//CHECK:       <key>ranges</key>
221//CHECK:       <array>
222//CHECK:         <array>
223//CHECK:          <dict>
224//CHECK:           <key>line</key><integer>11</integer>
225//CHECK:           <key>col</key><integer>9</integer>
226//CHECK:           <key>file</key><integer>0</integer>
227//CHECK:          </dict>
228//CHECK:          <dict>
229//CHECK:           <key>line</key><integer>11</integer>
230//CHECK:           <key>col</key><integer>9</integer>
231//CHECK:           <key>file</key><integer>0</integer>
232//CHECK:          </dict>
233//CHECK:         </array>
234//CHECK:       </array>
235//CHECK:       <key>depth</key><integer>1</integer>
236//CHECK:       <key>extended_message</key>
237//CHECK:       <string>Assuming &apos;c&apos; is not equal to 0</string>
238//CHECK:       <key>message</key>
239//CHECK:  <string>Assuming &apos;c&apos; is not equal to 0</string>
240//CHECK:      </dict>
241//CHECK:      <dict>
242//CHECK:       <key>kind</key><string>control</string>
243//CHECK:       <key>edges</key>
244//CHECK:        <array>
245//CHECK:         <dict>
246//CHECK:          <key>start</key>
247//CHECK:           <array>
248//CHECK:            <dict>
249//CHECK:             <key>line</key><integer>11</integer>
250//CHECK:             <key>col</key><integer>9</integer>
251//CHECK:             <key>file</key><integer>0</integer>
252//CHECK:            </dict>
253//CHECK:            <dict>
254//CHECK:             <key>line</key><integer>11</integer>
255//CHECK:             <key>col</key><integer>9</integer>
256//CHECK:             <key>file</key><integer>0</integer>
257//CHECK:            </dict>
258//CHECK:           </array>
259//CHECK:          <key>end</key>
260//CHECK:           <array>
261//CHECK:            <dict>
262//CHECK:             <key>line</key><integer>14</integer>
263//CHECK:             <key>col</key><integer>9</integer>
264//CHECK:             <key>file</key><integer>0</integer>
265//CHECK:            </dict>
266//CHECK:            <dict>
267//CHECK:             <key>line</key><integer>14</integer>
268//CHECK:             <key>col</key><integer>14</integer>
269//CHECK:             <key>file</key><integer>0</integer>
270//CHECK:            </dict>
271//CHECK:           </array>
272//CHECK:         </dict>
273//CHECK:        </array>
274//CHECK:      </dict>
275//CHECK:      <dict>
276//CHECK:       <key>kind</key><string>event</string>
277//CHECK:       <key>location</key>
278//CHECK:       <dict>
279//CHECK:        <key>line</key><integer>21</integer>
280//CHECK:        <key>col</key><integer>5</integer>
281//CHECK:        <key>file</key><integer>0</integer>
282//CHECK:       </dict>
283//CHECK:       <key>ranges</key>
284//CHECK:       <array>
285//CHECK:         <array>
286//CHECK:          <dict>
287//CHECK:           <key>line</key><integer>21</integer>
288//CHECK:           <key>col</key><integer>5</integer>
289//CHECK:           <key>file</key><integer>0</integer>
290//CHECK:          </dict>
291//CHECK:          <dict>
292//CHECK:           <key>line</key><integer>21</integer>
293//CHECK:           <key>col</key><integer>14</integer>
294//CHECK:           <key>file</key><integer>0</integer>
295//CHECK:          </dict>
296//CHECK:         </array>
297//CHECK:       </array>
298//CHECK:       <key>depth</key><integer>1</integer>
299//CHECK:       <key>extended_message</key>
300//CHECK:       <string>Returning from &apos;foo&apos;</string>
301//CHECK:       <key>message</key>
302//CHECK:  <string>Returning from &apos;foo&apos;</string>
303//CHECK:      </dict>
304//CHECK:      <dict>
305//CHECK:       <key>kind</key><string>control</string>
306//CHECK:       <key>edges</key>
307//CHECK:        <array>
308//CHECK:         <dict>
309//CHECK:          <key>start</key>
310//CHECK:           <array>
311//CHECK:            <dict>
312//CHECK:             <key>line</key><integer>21</integer>
313//CHECK:             <key>col</key><integer>5</integer>
314//CHECK:             <key>file</key><integer>0</integer>
315//CHECK:            </dict>
316//CHECK:            <dict>
317//CHECK:             <key>line</key><integer>21</integer>
318//CHECK:             <key>col</key><integer>7</integer>
319//CHECK:             <key>file</key><integer>0</integer>
320//CHECK:            </dict>
321//CHECK:           </array>
322//CHECK:          <key>end</key>
323//CHECK:           <array>
324//CHECK:            <dict>
325//CHECK:             <key>line</key><integer>24</integer>
326//CHECK:             <key>col</key><integer>5</integer>
327//CHECK:             <key>file</key><integer>0</integer>
328//CHECK:            </dict>
329//CHECK:            <dict>
330//CHECK:             <key>line</key><integer>24</integer>
331//CHECK:             <key>col</key><integer>18</integer>
332//CHECK:             <key>file</key><integer>0</integer>
333//CHECK:            </dict>
334//CHECK:           </array>
335//CHECK:         </dict>
336//CHECK:        </array>
337//CHECK:      </dict>
338//CHECK:      <dict>
339//CHECK:       <key>kind</key><string>control</string>
340//CHECK:       <key>edges</key>
341//CHECK:        <array>
342//CHECK:         <dict>
343//CHECK:          <key>start</key>
344//CHECK:           <array>
345//CHECK:            <dict>
346//CHECK:             <key>line</key><integer>24</integer>
347//CHECK:             <key>col</key><integer>5</integer>
348//CHECK:             <key>file</key><integer>0</integer>
349//CHECK:            </dict>
350//CHECK:            <dict>
351//CHECK:             <key>line</key><integer>24</integer>
352//CHECK:             <key>col</key><integer>18</integer>
353//CHECK:             <key>file</key><integer>0</integer>
354//CHECK:            </dict>
355//CHECK:           </array>
356//CHECK:          <key>end</key>
357//CHECK:           <array>
358//CHECK:            <dict>
359//CHECK:             <key>line</key><integer>25</integer>
360//CHECK:             <key>col</key><integer>5</integer>
361//CHECK:             <key>file</key><integer>0</integer>
362//CHECK:            </dict>
363//CHECK:            <dict>
364//CHECK:             <key>line</key><integer>25</integer>
365//CHECK:             <key>col</key><integer>10</integer>
366//CHECK:             <key>file</key><integer>0</integer>
367//CHECK:            </dict>
368//CHECK:           </array>
369//CHECK:         </dict>
370//CHECK:        </array>
371//CHECK:      </dict>
372//CHECK:      <dict>
373//CHECK:       <key>kind</key><string>control</string>
374//CHECK:       <key>edges</key>
375//CHECK:        <array>
376//CHECK:         <dict>
377//CHECK:          <key>start</key>
378//CHECK:           <array>
379//CHECK:            <dict>
380//CHECK:             <key>line</key><integer>25</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>25</integer>
386//CHECK:             <key>col</key><integer>10</integer>
387//CHECK:             <key>file</key><integer>0</integer>
388//CHECK:            </dict>
389//CHECK:           </array>
390//CHECK:          <key>end</key>
391//CHECK:           <array>
392//CHECK:            <dict>
393//CHECK:             <key>line</key><integer>25</integer>
394//CHECK:             <key>col</key><integer>12</integer>
395//CHECK:             <key>file</key><integer>0</integer>
396//CHECK:            </dict>
397//CHECK:            <dict>
398//CHECK:             <key>line</key><integer>25</integer>
399//CHECK:             <key>col</key><integer>13</integer>
400//CHECK:             <key>file</key><integer>0</integer>
401//CHECK:            </dict>
402//CHECK:           </array>
403//CHECK:         </dict>
404//CHECK:        </array>
405//CHECK:      </dict>
406//CHECK:      <dict>
407//CHECK:       <key>kind</key><string>event</string>
408//CHECK:       <key>location</key>
409//CHECK:       <dict>
410//CHECK:        <key>line</key><integer>25</integer>
411//CHECK:        <key>col</key><integer>12</integer>
412//CHECK:        <key>file</key><integer>0</integer>
413//CHECK:       </dict>
414//CHECK:       <key>ranges</key>
415//CHECK:       <array>
416//CHECK:         <array>
417//CHECK:          <dict>
418//CHECK:           <key>line</key><integer>25</integer>
419//CHECK:           <key>col</key><integer>12</integer>
420//CHECK:           <key>file</key><integer>0</integer>
421//CHECK:          </dict>
422//CHECK:          <dict>
423//CHECK:           <key>line</key><integer>25</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:       </array>
429//CHECK:       <key>depth</key><integer>0</integer>
430//CHECK:       <key>extended_message</key>
431//CHECK:       <string>The left operand of &apos;+&apos; is a garbage value</string>
432//CHECK:       <key>message</key>
433//CHECK:  <string>The left operand of &apos;+&apos; is a garbage value</string>
434//CHECK:      </dict>
435//CHECK:     </array>
436//CHECK:     <key>description</key><string>The left operand of &apos;+&apos; is a garbage value</string>
437//CHECK:     <key>category</key><string>Logic error</string>
438//CHECK:     <key>type</key><string>Result of operation is garbage or undefined</string>
439//CHECK:    <key>issue_context_kind</key><string>function</string>
440//CHECK:    <key>issue_context</key><string>use</string>
441//CHECK:    <key>issue_hash</key><integer>7</integer>
442//CHECK:    <key>location</key>
443//CHECK:    <dict>
444//CHECK:     <key>line</key><integer>25</integer>
445//CHECK:     <key>col</key><integer>12</integer>
446//CHECK:     <key>file</key><integer>0</integer>
447//CHECK:    </dict>
448//CHECK:    </dict>
449//CHECK:   </array>
450//CHECK:  </dict>
451//CHECK:  </plist>
452