Home | History | Annotate | Download | only in diagnostics
      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 &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