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
foo_irrelevant(int c)4 void foo_irrelevant(int c) {
5 if (c)
6 return;
7 c++;
8 return;
9 }
foo(int c,int * x)10 void foo(int c, int *x) {
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
use(int c)18 int use(int c) {
19 int xx; //expected-note{{Variable 'xx' declared without an initial value}}
20 int *y = &xx;
21 foo (c, y);
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 'xx' declared without an initial value</string>
64 //CHECK: <key>message</key>
65 //CHECK: <string>Variable 'xx' 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 'foo'</string>
127 //CHECK: <key>message</key>
128 //CHECK: <string>Calling 'foo'</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 'use'</string>
141 //CHECK: <key>message</key>
142 //CHECK: <string>Entered call from 'use'</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 'c' is not equal to 0</string>
238 //CHECK: <key>message</key>
239 //CHECK: <string>Assuming 'c' 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 'foo'</string>
301 //CHECK: <key>message</key>
302 //CHECK: <string>Returning from 'foo'</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 '+' is a garbage value</string>
432 //CHECK: <key>message</key>
433 //CHECK: <string>The left operand of '+' is a garbage value</string>
434 //CHECK: </dict>
435 //CHECK: </array>
436 //CHECK: <key>description</key><string>The left operand of '+' 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