• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
4 struct S {
5   int *x;
6   int y;
7 };
8 
9 int *foo();
10 
inlined(struct S * s,int m)11 void inlined(struct S *s, int m) {
12   if (s->x)
13     //expected-note@-1{{Taking false branch}}
14     //expected-note@-2{{Assuming pointer value is null}}
15 
16     m++;
17 
18 }
test(struct S syz,int * pp)19 void test(struct S syz, int *pp) {
20   int m = 0;
21   syz.x = foo();
22   inlined(&syz, m);
23                // expected-note@-1{{Calling 'inlined'}}
24                // expected-note@-2{{Returning from 'inlined'}}
25   m += *syz.x; // expected-warning{{Dereference of null pointer (loaded from field 'x')}}
26                // expected-note@-1{{Dereference of null pointer (loaded from field 'x')}}
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>control</string>
40 //CHECK:      <key>edges</key>
41 //CHECK:       <array>
42 //CHECK:        <dict>
43 //CHECK:         <key>start</key>
44 //CHECK:          <array>
45 //CHECK:           <dict>
46 //CHECK:            <key>line</key><integer>20</integer>
47 //CHECK:            <key>col</key><integer>3</integer>
48 //CHECK:            <key>file</key><integer>0</integer>
49 //CHECK:           </dict>
50 //CHECK:           <dict>
51 //CHECK:            <key>line</key><integer>20</integer>
52 //CHECK:            <key>col</key><integer>5</integer>
53 //CHECK:            <key>file</key><integer>0</integer>
54 //CHECK:           </dict>
55 //CHECK:          </array>
56 //CHECK:         <key>end</key>
57 //CHECK:          <array>
58 //CHECK:           <dict>
59 //CHECK:            <key>line</key><integer>22</integer>
60 //CHECK:            <key>col</key><integer>3</integer>
61 //CHECK:            <key>file</key><integer>0</integer>
62 //CHECK:           </dict>
63 //CHECK:           <dict>
64 //CHECK:            <key>line</key><integer>22</integer>
65 //CHECK:            <key>col</key><integer>9</integer>
66 //CHECK:            <key>file</key><integer>0</integer>
67 //CHECK:           </dict>
68 //CHECK:          </array>
69 //CHECK:        </dict>
70 //CHECK:       </array>
71 //CHECK:     </dict>
72 //CHECK:     <dict>
73 //CHECK:      <key>kind</key><string>event</string>
74 //CHECK:      <key>location</key>
75 //CHECK:      <dict>
76 //CHECK:       <key>line</key><integer>22</integer>
77 //CHECK:       <key>col</key><integer>3</integer>
78 //CHECK:       <key>file</key><integer>0</integer>
79 //CHECK:      </dict>
80 //CHECK:      <key>ranges</key>
81 //CHECK:      <array>
82 //CHECK:        <array>
83 //CHECK:         <dict>
84 //CHECK:          <key>line</key><integer>22</integer>
85 //CHECK:          <key>col</key><integer>3</integer>
86 //CHECK:          <key>file</key><integer>0</integer>
87 //CHECK:         </dict>
88 //CHECK:         <dict>
89 //CHECK:          <key>line</key><integer>22</integer>
90 //CHECK:          <key>col</key><integer>18</integer>
91 //CHECK:          <key>file</key><integer>0</integer>
92 //CHECK:         </dict>
93 //CHECK:        </array>
94 //CHECK:      </array>
95 //CHECK:      <key>depth</key><integer>0</integer>
96 //CHECK:      <key>extended_message</key>
97 //CHECK:      <string>Calling &apos;inlined&apos;</string>
98 //CHECK:      <key>message</key>
99 //CHECK: <string>Calling &apos;inlined&apos;</string>
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>11</integer>
106 //CHECK:       <key>col</key><integer>1</integer>
107 //CHECK:       <key>file</key><integer>0</integer>
108 //CHECK:      </dict>
109 //CHECK:      <key>depth</key><integer>1</integer>
110 //CHECK:      <key>extended_message</key>
111 //CHECK:      <string>Entered call from &apos;test&apos;</string>
112 //CHECK:      <key>message</key>
113 //CHECK: <string>Entered call from &apos;test&apos;</string>
114 //CHECK:     </dict>
115 //CHECK:     <dict>
116 //CHECK:      <key>kind</key><string>control</string>
117 //CHECK:      <key>edges</key>
118 //CHECK:       <array>
119 //CHECK:        <dict>
120 //CHECK:         <key>start</key>
121 //CHECK:          <array>
122 //CHECK:           <dict>
123 //CHECK:            <key>line</key><integer>11</integer>
124 //CHECK:            <key>col</key><integer>1</integer>
125 //CHECK:            <key>file</key><integer>0</integer>
126 //CHECK:           </dict>
127 //CHECK:           <dict>
128 //CHECK:            <key>line</key><integer>11</integer>
129 //CHECK:            <key>col</key><integer>4</integer>
130 //CHECK:            <key>file</key><integer>0</integer>
131 //CHECK:           </dict>
132 //CHECK:          </array>
133 //CHECK:         <key>end</key>
134 //CHECK:          <array>
135 //CHECK:           <dict>
136 //CHECK:            <key>line</key><integer>12</integer>
137 //CHECK:            <key>col</key><integer>3</integer>
138 //CHECK:            <key>file</key><integer>0</integer>
139 //CHECK:           </dict>
140 //CHECK:           <dict>
141 //CHECK:            <key>line</key><integer>12</integer>
142 //CHECK:            <key>col</key><integer>4</integer>
143 //CHECK:            <key>file</key><integer>0</integer>
144 //CHECK:           </dict>
145 //CHECK:          </array>
146 //CHECK:        </dict>
147 //CHECK:       </array>
148 //CHECK:     </dict>
149 //CHECK:     <dict>
150 //CHECK:      <key>kind</key><string>control</string>
151 //CHECK:      <key>edges</key>
152 //CHECK:       <array>
153 //CHECK:        <dict>
154 //CHECK:         <key>start</key>
155 //CHECK:          <array>
156 //CHECK:           <dict>
157 //CHECK:            <key>line</key><integer>12</integer>
158 //CHECK:            <key>col</key><integer>3</integer>
159 //CHECK:            <key>file</key><integer>0</integer>
160 //CHECK:           </dict>
161 //CHECK:           <dict>
162 //CHECK:            <key>line</key><integer>12</integer>
163 //CHECK:            <key>col</key><integer>4</integer>
164 //CHECK:            <key>file</key><integer>0</integer>
165 //CHECK:           </dict>
166 //CHECK:          </array>
167 //CHECK:         <key>end</key>
168 //CHECK:          <array>
169 //CHECK:           <dict>
170 //CHECK:            <key>line</key><integer>12</integer>
171 //CHECK:            <key>col</key><integer>7</integer>
172 //CHECK:            <key>file</key><integer>0</integer>
173 //CHECK:           </dict>
174 //CHECK:           <dict>
175 //CHECK:            <key>line</key><integer>12</integer>
176 //CHECK:            <key>col</key><integer>7</integer>
177 //CHECK:            <key>file</key><integer>0</integer>
178 //CHECK:           </dict>
179 //CHECK:          </array>
180 //CHECK:        </dict>
181 //CHECK:       </array>
182 //CHECK:     </dict>
183 //CHECK:     <dict>
184 //CHECK:      <key>kind</key><string>event</string>
185 //CHECK:      <key>location</key>
186 //CHECK:      <dict>
187 //CHECK:       <key>line</key><integer>12</integer>
188 //CHECK:       <key>col</key><integer>7</integer>
189 //CHECK:       <key>file</key><integer>0</integer>
190 //CHECK:      </dict>
191 //CHECK:      <key>ranges</key>
192 //CHECK:      <array>
193 //CHECK:        <array>
194 //CHECK:         <dict>
195 //CHECK:          <key>line</key><integer>12</integer>
196 //CHECK:          <key>col</key><integer>7</integer>
197 //CHECK:          <key>file</key><integer>0</integer>
198 //CHECK:         </dict>
199 //CHECK:         <dict>
200 //CHECK:          <key>line</key><integer>12</integer>
201 //CHECK:          <key>col</key><integer>10</integer>
202 //CHECK:          <key>file</key><integer>0</integer>
203 //CHECK:         </dict>
204 //CHECK:        </array>
205 //CHECK:      </array>
206 //CHECK:      <key>depth</key><integer>1</integer>
207 //CHECK:      <key>extended_message</key>
208 //CHECK:      <string>Assuming pointer value is null</string>
209 //CHECK:      <key>message</key>
210 //CHECK: <string>Assuming pointer value is null</string>
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>22</integer>
217 //CHECK:       <key>col</key><integer>3</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>22</integer>
225 //CHECK:          <key>col</key><integer>3</integer>
226 //CHECK:          <key>file</key><integer>0</integer>
227 //CHECK:         </dict>
228 //CHECK:         <dict>
229 //CHECK:          <key>line</key><integer>22</integer>
230 //CHECK:          <key>col</key><integer>18</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>Returning from &apos;inlined&apos;</string>
238 //CHECK:      <key>message</key>
239 //CHECK: <string>Returning from &apos;inlined&apos;</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>22</integer>
250 //CHECK:            <key>col</key><integer>3</integer>
251 //CHECK:            <key>file</key><integer>0</integer>
252 //CHECK:           </dict>
253 //CHECK:           <dict>
254 //CHECK:            <key>line</key><integer>22</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>25</integer>
263 //CHECK:            <key>col</key><integer>3</integer>
264 //CHECK:            <key>file</key><integer>0</integer>
265 //CHECK:           </dict>
266 //CHECK:           <dict>
267 //CHECK:            <key>line</key><integer>25</integer>
268 //CHECK:            <key>col</key><integer>3</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>control</string>
277 //CHECK:      <key>edges</key>
278 //CHECK:       <array>
279 //CHECK:        <dict>
280 //CHECK:         <key>start</key>
281 //CHECK:          <array>
282 //CHECK:           <dict>
283 //CHECK:            <key>line</key><integer>25</integer>
284 //CHECK:            <key>col</key><integer>3</integer>
285 //CHECK:            <key>file</key><integer>0</integer>
286 //CHECK:           </dict>
287 //CHECK:           <dict>
288 //CHECK:            <key>line</key><integer>25</integer>
289 //CHECK:            <key>col</key><integer>3</integer>
290 //CHECK:            <key>file</key><integer>0</integer>
291 //CHECK:           </dict>
292 //CHECK:          </array>
293 //CHECK:         <key>end</key>
294 //CHECK:          <array>
295 //CHECK:           <dict>
296 //CHECK:            <key>line</key><integer>25</integer>
297 //CHECK:            <key>col</key><integer>8</integer>
298 //CHECK:            <key>file</key><integer>0</integer>
299 //CHECK:           </dict>
300 //CHECK:           <dict>
301 //CHECK:            <key>line</key><integer>25</integer>
302 //CHECK:            <key>col</key><integer>8</integer>
303 //CHECK:            <key>file</key><integer>0</integer>
304 //CHECK:           </dict>
305 //CHECK:          </array>
306 //CHECK:        </dict>
307 //CHECK:       </array>
308 //CHECK:     </dict>
309 //CHECK:     <dict>
310 //CHECK:      <key>kind</key><string>event</string>
311 //CHECK:      <key>location</key>
312 //CHECK:      <dict>
313 //CHECK:       <key>line</key><integer>25</integer>
314 //CHECK:       <key>col</key><integer>8</integer>
315 //CHECK:       <key>file</key><integer>0</integer>
316 //CHECK:      </dict>
317 //CHECK:      <key>ranges</key>
318 //CHECK:      <array>
319 //CHECK:        <array>
320 //CHECK:         <dict>
321 //CHECK:          <key>line</key><integer>25</integer>
322 //CHECK:          <key>col</key><integer>13</integer>
323 //CHECK:          <key>file</key><integer>0</integer>
324 //CHECK:         </dict>
325 //CHECK:         <dict>
326 //CHECK:          <key>line</key><integer>25</integer>
327 //CHECK:          <key>col</key><integer>13</integer>
328 //CHECK:          <key>file</key><integer>0</integer>
329 //CHECK:         </dict>
330 //CHECK:        </array>
331 //CHECK:      </array>
332 //CHECK:      <key>depth</key><integer>0</integer>
333 //CHECK:      <key>extended_message</key>
334 //CHECK:      <string>Dereference of null pointer (loaded from field &apos;x&apos;)</string>
335 //CHECK:      <key>message</key>
336 //CHECK: <string>Dereference of null pointer (loaded from field &apos;x&apos;)</string>
337 //CHECK:     </dict>
338 //CHECK:    </array>
339 //CHECK:    <key>description</key><string>Dereference of null pointer (loaded from field &apos;x&apos;)</string>
340 //CHECK:    <key>category</key><string>Logic error</string>
341 //CHECK:    <key>type</key><string>Dereference of null pointer</string>
342 //CHECK:   <key>issue_context_kind</key><string>function</string>
343 //CHECK:   <key>issue_context</key><string>test</string>
344 //CHECK:   <key>issue_hash</key><integer>6</integer>
345 //CHECK:   <key>location</key>
346 //CHECK:   <dict>
347 //CHECK:    <key>line</key><integer>25</integer>
348 //CHECK:    <key>col</key><integer>8</integer>
349 //CHECK:    <key>file</key><integer>0</integer>
350 //CHECK:   </dict>
351 //CHECK:   </dict>
352 //CHECK:  </array>
353 //CHECK: </dict>
354 //CHECK: </plist>
355