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 '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