uninit-variables.c revision 8435069798b5621615f9f65c471c7e7808316b20
10a65f946721f1505e5577b1910f3193888696573Ted Kremenek// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -Wconditional-uninitialized -fsyntax-only -fblocks %s -verify 2610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 3610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test1() { 4609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 5f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 6610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 7610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 8610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test2() { 9610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek int x = 0; 10610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; // no-warning 11610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 12610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 13610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test3() { 14610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek int x; 15610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 0; 16610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; // no-warning 17610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 18610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 19610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test4() { 20609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 21f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth ++x; // expected-warning{{variable 'x' is uninitialized when used here}} 22610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 23610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 24610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 25610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test5() { 26609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x, y; // expected-note{{variable 'y' is declared here}} expected-note{{add initialization to silence this warning}} 27f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth x = y; // expected-warning{{variable 'y' is uninitialized when used here}} 28610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 29610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 30610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 31610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test6() { 32609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 33f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth x += 2; // expected-warning{{variable 'x' is uninitialized when used here}} 34610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 35610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 36610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 37610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test7(int y) { 38609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 39610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (y) 40610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 41584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 42610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 43610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 44610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test8(int y) { 45610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek int x; 46610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (y) 47610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 48610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek else 49610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 0; 50609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek return x; 51610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 52610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 53610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test9(int n) { 54609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 55610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i < n; ++i) { 56610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (i == n - 1) 57610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek break; 5894b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek x = 1; 59610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 60584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 61610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 62610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 63610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test10(unsigned n) { 64609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 65610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i < n; ++i) { 66610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 67610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 68584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 69610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 70610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 71610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test11(unsigned n) { 72609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 73610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i <= n; ++i) { 74610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 75610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 76584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 77610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 78610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 79610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekvoid test12(unsigned n) { 808435069798b5621615f9f65c471c7e7808316b20Chandler Carruth for (unsigned i ; n ; ++i) ; // expected-warning{{variable 'i' may be uninitialized when used here}} expected-note{{variable 'i' is declared here}} expected-note{{add initialization to silence this warning}} 81610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 82610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 83610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test13() { 84610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek static int i; 85610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return i; // no-warning 86610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 87610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 88c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Simply don't crash on this test case. 89c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test14() { 90c104e53639de4424b83955acfadc977773b5883dTed Kremenek const char *p = 0; 91c104e53639de4424b83955acfadc977773b5883dTed Kremenek for (;;) {} 92c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 93c104e53639de4424b83955acfadc977773b5883dTed Kremenek 94b88fb027bfe2f85da3a341f42549900bd658ac8bChandler Carruthint test15() { 95b88fb027bfe2f85da3a341f42549900bd658ac8bChandler Carruth int x = x; // no-warning: signals intended lack of initialization. \ 96b88fb027bfe2f85da3a341f42549900bd658ac8bChandler Carruth // expected-note{{variable 'x' is declared here}} 97f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 98c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 99610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 100c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Don't warn in the following example; shows dataflow confluence. 101c104e53639de4424b83955acfadc977773b5883dTed Kremenekchar *test16_aux(); 102c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test16() { 103c104e53639de4424b83955acfadc977773b5883dTed Kremenek char *p = test16_aux(); 104c104e53639de4424b83955acfadc977773b5883dTed Kremenek for (unsigned i = 0 ; i < 100 ; i++) 105c104e53639de4424b83955acfadc977773b5883dTed Kremenek p[i] = 'a'; // no-warning 106c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 107c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek 108c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekvoid test17() { 109c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // Don't warn multiple times about the same uninitialized variable 110c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // along the same path. 111609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int *x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 112f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth *x = 1; // expected-warning{{variable 'x' is uninitialized when used here}} 113c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek *x = 1; // no-warning 114c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek} 11513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 11613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test18(int x, int y) { 11713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 11813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (x && y && (z = 1)) { 11913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 12013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek } 12113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 12213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 12313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 12413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux1(); 12513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux2(); 12613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux3(int *x); 12713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19() { 12813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 12913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z)) 13013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 13113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 13213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 13313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 13413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test20() { 135609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int z; // expected-note{{variable 'z' is declared here}} expected-note{{add initialization to silence this warning}} 13613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z)) 137584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return z; // expected-warning{{variable 'z' may be uninitialized when used here}} 13813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 13913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 14013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 14113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test21(int x, int y) { 142609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int z; // expected-note{{variable 'z' is declared here}} expected-note{{add initialization to silence this warning}} 14313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if ((x && y) || test19_aux3(&z) || test19_aux2()) 144584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return z; // expected-warning{{variable 'z' may be uninitialized when used here}} 14513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 14613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 14713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 14813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test22() { 14913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 15013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek while (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z)) 15113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 15213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 15313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 15413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 15513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test23() { 15613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 15713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek for ( ; test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z) ; ) 15813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 15913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 16013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 16113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 16213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// The basic uninitialized value analysis doesn't have enough path-sensitivity 16313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// to catch initializations relying on control-dependencies spanning multiple 16413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// conditionals. This possibly can be handled by making the CFG itself 16513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// represent such control-dependencies, but it is a niche case. 16613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test24(int flag) { 167609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek unsigned val; // expected-note{{variable 'val' is declared here}} expected-note{{add initialization to silence this warning}} 16813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (flag) 16913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 17013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (!flag) 17113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 172584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return val; // expected-warning{{variable 'val' may be uninitialized when used here}} 17313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 17413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 175dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenekfloat test25() { 176609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek float x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 177f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 178dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 179dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek 180dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenektypedef int MyInt; 181dcfb360f6e1aaab0754a98e1e245c2607c46058aTed KremenekMyInt test26() { 182609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek MyInt x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 183f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 184dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 1859660803cd332d5c605899435019bb3b37fca3accTed Kremenek 1869660803cd332d5c605899435019bb3b37fca3accTed Kremenek// Test handling of sizeof(). 1879660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test27() { 1889660803cd332d5c605899435019bb3b37fca3accTed Kremenek struct test_27 { int x; } *y; 1899660803cd332d5c605899435019bb3b37fca3accTed Kremenek return sizeof(y->x); // no-warning 1909660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 1919660803cd332d5c605899435019bb3b37fca3accTed Kremenek 1929660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test28() { 193609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int len; // expected-note{{variable 'len' is declared here}} expected-note{{add initialization to silence this warning}} 194f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return sizeof(int[len]); // expected-warning{{variable 'len' is uninitialized when used here}} 1959660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 1969660803cd332d5c605899435019bb3b37fca3accTed Kremenek 197a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test29() { 198553304523bcce281aa3b1afe0f84ae34a90a3c86Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 199f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth (void) ^{ (void) x; }; // expected-warning{{variable 'x' is uninitialized when captured by block}} 200a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 201a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 202a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test30() { 203a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek static int x; // no-warning 204a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 205a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 206a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 207a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test31() { 208a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek __block int x; // no-warning 209a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 210a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 211a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 212a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekint test32_x; 213a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test32() { 214a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) test32_x; }; // no-warning 215a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 216a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 217dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekvoid test_33() { 218dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek int x; // no-warning 219dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek (void) x; 220dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek} 221dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek 222dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekint test_34() { 223609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek int x; // expected-note{{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 224dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek (void) x; 225f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 226dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek} 227dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek 22840900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek// Test that this case doesn't crash. 22940900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenekvoid test35(int x) { 23040900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek __block int y = 0; 23140900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek ^{ y = (x == 0); }(); 23240900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek} 23340900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek 23496554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek// Test handling of indirect goto. 23596554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenekvoid test36() 23696554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek{ 237609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek void **pc; // expected-note{{variable 'pc' is declared here}} expected-note{{add initialization to silence this warning}} 23896554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek void *dummy[] = { &&L1, &&L2 }; 23996554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L1: 2408435069798b5621615f9f65c471c7e7808316b20Chandler Carruth goto *pc; // expected-warning{{variable 'pc' may be uninitialized when used here}} 24196554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L2: 24296554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek goto *pc; 24396554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek} 24496554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek 2459fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test && nested in ||. 2469fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_a(); 2479fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_b(); 2489fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37() 2499fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{ 2509fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek int identifier; 2519fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek if ((test37_a() && (identifier = 1)) || 2529fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek (test37_b() && (identifier = 2))) { 2539fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return identifier; // no-warning 2549fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek } 2559fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return 0; 2569fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek} 2579fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek 2589fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test merging of path-specific dataflow values (without asserting). 2599fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test38(int r, int x, int y) 2609fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{ 2619fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek int z; 2629fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return ((r < 0) || ((r == 0) && (x < y))); 2639fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek} 2649fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek 265f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test39(int x) { 266f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int y; // expected-note {{variable 'y' is declared here}} expected-note{{add initialization to silence this warning}} 267f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth int z = x + y; // expected-warning {{variable 'y' is uninitialized when used here}} 268f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return z; 269f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 270f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 271f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 272f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test40(int x) { 273f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int y; // expected-note {{variable 'y' is declared here}} expected-note{{add initialization to silence this warning}} 274f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x ? 1 : y; // expected-warning {{variable 'y' is uninitialized when used here}} 275f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 276f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 277f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test41(int x) { 278f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int y; // expected-note {{variable 'y' is declared here}} expected-note{{add initialization to silence this warning}} 279f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek if (x) y = 1; // no-warning 280584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return y; // expected-warning {{variable 'y' may be uninitialized when used here}} 281f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 282f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 283f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test42() { 284f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int a; 285f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek a = 30; // no-warning 286f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 287f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 288f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43_aux(int x); 289f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43(int i) { 290f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int x; // expected-note {{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}} 291f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek for (i = 0 ; i < 10; i++) 2928435069798b5621615f9f65c471c7e7808316b20Chandler Carruth test43_aux(x++); // expected-warning {{variable 'x' may be uninitialized when used here}} 293f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 294f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 295f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test44(int i) { 296f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int x = i; 297f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int y; // expected-note {{variable 'y' is declared here}} expected-note{{add initialization to silence this warning}} 298f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek for (i = 0; i < 10; i++ ) { 299f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek test43_aux(x++); // no-warning 3008435069798b5621615f9f65c471c7e7808316b20Chandler Carruth x += y; // expected-warning {{variable 'y' may be uninitialized when used here}} 301f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek } 302f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 303f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 304f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test45(int j) { 305f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int x = 1, y = x + 1; 306f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek if (y) // no-warning 307f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return x; 308f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return y; 309f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 310f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 311f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test46() 312f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 313f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int i; // expected-note {{variable 'i' is declared here}} expected-note{{add initialization to silence this warning}} 314f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth int j = i ? : 1; // expected-warning {{variable 'i' is uninitialized when used here}} 315f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 316f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 317f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test47(int *i) 318f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 319f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return i ? : 0; // no-warning 320f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 321f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 322f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test49(int *i) 323f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 324f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int a; 325f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return &a ? : i; // no-warning 326f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 327f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 328f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test50() 329f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 330f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek char c[1 ? : 2]; // no-warning 331f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 332f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 333bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenekint test51(void) 334bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek{ 335bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek __block int a; 336bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek ^(void) { 337bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek a = 42; 338bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek }(); 339bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek return a; // no-warning 340bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek} 341bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek 342e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek// FIXME: This is a false positive, but it tests logical operations in switch statements. 343e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenekint test52(int a, int b) { 344e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek int x; // expected-note {{variable 'x' is declared here}} expected-note {{add initialization to silence this warning}} 345e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek switch (a || b) { // expected-warning {{switch condition has boolean value}} 346e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek case 0: 347e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek x = 1; 348e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek break; 349e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek case 1: 350e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek x = 2; 351e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek break; 352e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek } 353e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek return x; // expected-warning {{variable 'x' may be uninitialized when used here}} 354e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek} 3558435069798b5621615f9f65c471c7e7808316b20Chandler Carruth 3568435069798b5621615f9f65c471c7e7808316b20Chandler Carruth// This CFG caused the uninitialized values warning to inf-loop. 3578435069798b5621615f9f65c471c7e7808316b20Chandler Carruthextern int PR10379_g(); 3588435069798b5621615f9f65c471c7e7808316b20Chandler Carruthvoid PR10379_f(int *len) { 3598435069798b5621615f9f65c471c7e7808316b20Chandler Carruth int new_len; // expected-note {{variable 'new_len' is declared here}} expected-note{{add initialization to silence this warning}} 3608435069798b5621615f9f65c471c7e7808316b20Chandler Carruth for (int i = 0; i < 42 && PR10379_g() == 0; i++) { 3618435069798b5621615f9f65c471c7e7808316b20Chandler Carruth if (PR10379_g() == 1) 3628435069798b5621615f9f65c471c7e7808316b20Chandler Carruth continue; 3638435069798b5621615f9f65c471c7e7808316b20Chandler Carruth if (PR10379_g() == 2) 3648435069798b5621615f9f65c471c7e7808316b20Chandler Carruth PR10379_f(&new_len); 3658435069798b5621615f9f65c471c7e7808316b20Chandler Carruth else if (PR10379_g() == 3) 3668435069798b5621615f9f65c471c7e7808316b20Chandler Carruth PR10379_f(&new_len); 3678435069798b5621615f9f65c471c7e7808316b20Chandler Carruth *len += new_len; // expected-warning {{variable 'new_len' may be uninitialized when used here}} 3688435069798b5621615f9f65c471c7e7808316b20Chandler Carruth } 3698435069798b5621615f9f65c471c7e7808316b20Chandler Carruth} 370