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 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 } 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 'inlined'</string> 98 //CHECK: <key>message</key> 99 //CHECK: <string>Calling 'inlined'</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 'test'</string> 112 //CHECK: <key>message</key> 113 //CHECK: <string>Entered call from 'test'</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 'inlined'</string> 238 //CHECK: <key>message</key> 239 //CHECK: <string>Returning from 'inlined'</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 'x')</string> 335 //CHECK: <key>message</key> 336 //CHECK: <string>Dereference of null pointer (loaded from field 'x')</string> 337 //CHECK: </dict> 338 //CHECK: </array> 339 //CHECK: <key>description</key><string>Dereference of null pointer (loaded from field 'x')</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