uninit-variables.c revision 4f4f349208b2b2307454e169ac7b039e989f003f
10a65f946721f1505e5577b1910f3193888696573Ted Kremenek// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -Wconditional-uninitialized -fsyntax-only -fblocks %s -verify 2610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 3540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenektypedef __typeof(sizeof(int)) size_t; 4540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenekvoid *malloc(size_t); 5540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek 6610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test1() { 74f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 8f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 9610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 10610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 11610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test2() { 12610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek int x = 0; 13610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; // no-warning 14610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 15610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 16610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test3() { 17610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek int x; 18610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 0; 19610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; // no-warning 20610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 21610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 22610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test4() { 234f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 24f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth ++x; // expected-warning{{variable 'x' is uninitialized when used here}} 25610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 26610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 27610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 28610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test5() { 294f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x, y; // expected-note{{initialize the variable 'y' to silence this warning}} 30f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth x = y; // expected-warning{{variable 'y' is uninitialized when used here}} 31610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 32610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 33610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 34610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test6() { 354f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 36f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth x += 2; // expected-warning{{variable 'x' is uninitialized when used here}} 37610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 38610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 39610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 40610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test7(int y) { 414f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 42610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (y) 43610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 44584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 45610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 46610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 47610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test8(int y) { 48610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek int x; 49610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (y) 50610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 51610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek else 52610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 0; 53609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek return x; 54610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 55610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 56610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test9(int n) { 574f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 58610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i < n; ++i) { 59610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (i == n - 1) 60610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek break; 6194b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek x = 1; 62610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 63584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 64610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 65610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 66610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test10(unsigned n) { 674f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 68610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i < n; ++i) { 69610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 70610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 71584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 72610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 73610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 74610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test11(unsigned n) { 754f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 76610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i <= n; ++i) { 77610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 78610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 79584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 80610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 81610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 82610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekvoid test12(unsigned n) { 834f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie for (unsigned i ; n ; ++i) ; // expected-warning{{variable 'i' is uninitialized when used here}} expected-note{{initialize the variable 'i' to silence this warning}} 84610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 85610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 86610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test13() { 87610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek static int i; 88610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return i; // no-warning 89610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 90610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 91c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Simply don't crash on this test case. 92c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test14() { 93c104e53639de4424b83955acfadc977773b5883dTed Kremenek const char *p = 0; 94c104e53639de4424b83955acfadc977773b5883dTed Kremenek for (;;) {} 95c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 96c104e53639de4424b83955acfadc977773b5883dTed Kremenek 97b88fb027bfe2f85da3a341f42549900bd658ac8bChandler Carruthint test15() { 98b88fb027bfe2f85da3a341f42549900bd658ac8bChandler Carruth int x = x; // no-warning: signals intended lack of initialization. \ 99b88fb027bfe2f85da3a341f42549900bd658ac8bChandler Carruth // expected-note{{variable 'x' is declared here}} 100f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 101c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 102610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 103c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Don't warn in the following example; shows dataflow confluence. 104c104e53639de4424b83955acfadc977773b5883dTed Kremenekchar *test16_aux(); 105c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test16() { 106c104e53639de4424b83955acfadc977773b5883dTed Kremenek char *p = test16_aux(); 107c104e53639de4424b83955acfadc977773b5883dTed Kremenek for (unsigned i = 0 ; i < 100 ; i++) 108c104e53639de4424b83955acfadc977773b5883dTed Kremenek p[i] = 'a'; // no-warning 109c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 110c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek 111c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekvoid test17() { 112c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // Don't warn multiple times about the same uninitialized variable 113c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // along the same path. 1144f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int *x; // expected-note{{initialize the variable 'x' to silence this warning}} 115f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth *x = 1; // expected-warning{{variable 'x' is uninitialized when used here}} 116c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek *x = 1; // no-warning 117c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek} 11813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 11913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test18(int x, int y) { 12013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 12113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (x && y && (z = 1)) { 12213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 12313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek } 12413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 12513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 12613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 12713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux1(); 12813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux2(); 12913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux3(int *x); 13013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19() { 13113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 13213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z)) 13313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 13413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 13513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 13613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 13713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test20() { 1384f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int z; // expected-note{{initialize the variable 'z' to silence this warning}} 13913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z)) 140584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return z; // expected-warning{{variable 'z' may be uninitialized when used here}} 14113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 14213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 14313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 14413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test21(int x, int y) { 1454f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int z; // expected-note{{initialize the variable 'z' to silence this warning}} 14613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if ((x && y) || test19_aux3(&z) || test19_aux2()) 147584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return z; // expected-warning{{variable 'z' may be uninitialized when used here}} 14813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 14913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 15013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 15113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test22() { 15213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 15313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek while (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z)) 15413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 15513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 15613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 15713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 15813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test23() { 15913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 16013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek for ( ; test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z) ; ) 16113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 16213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 16313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 16413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 16513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// The basic uninitialized value analysis doesn't have enough path-sensitivity 16613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// to catch initializations relying on control-dependencies spanning multiple 16713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// conditionals. This possibly can be handled by making the CFG itself 16813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// represent such control-dependencies, but it is a niche case. 16913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test24(int flag) { 1704f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie unsigned val; // expected-note{{initialize the variable 'val' to silence this warning}} 17113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (flag) 17213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 17313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (!flag) 17413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 175584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return val; // expected-warning{{variable 'val' may be uninitialized when used here}} 17613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 17713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 178dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenekfloat test25() { 1794f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie float x; // expected-note{{initialize the variable 'x' to silence this warning}} 180f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 181dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 182dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek 183dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenektypedef int MyInt; 184dcfb360f6e1aaab0754a98e1e245c2607c46058aTed KremenekMyInt test26() { 1854f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie MyInt x; // expected-note{{initialize the variable 'x' to silence this warning}} 186f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 187dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 1889660803cd332d5c605899435019bb3b37fca3accTed Kremenek 1899660803cd332d5c605899435019bb3b37fca3accTed Kremenek// Test handling of sizeof(). 1909660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test27() { 1919660803cd332d5c605899435019bb3b37fca3accTed Kremenek struct test_27 { int x; } *y; 1929660803cd332d5c605899435019bb3b37fca3accTed Kremenek return sizeof(y->x); // no-warning 1939660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 1949660803cd332d5c605899435019bb3b37fca3accTed Kremenek 1959660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test28() { 1964f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int len; // expected-note{{initialize the variable 'len' to silence this warning}} 197f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return sizeof(int[len]); // expected-warning{{variable 'len' is uninitialized when used here}} 1989660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 1999660803cd332d5c605899435019bb3b37fca3accTed Kremenek 200a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test29() { 2014f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 202f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth (void) ^{ (void) x; }; // expected-warning{{variable 'x' is uninitialized when captured by block}} 203a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 204a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 205a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test30() { 206a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek static int x; // no-warning 207a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 208a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 209a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 210a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test31() { 211a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek __block int x; // no-warning 212a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 213a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 214a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 215a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekint test32_x; 216a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test32() { 217a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) test32_x; }; // no-warning 218a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 219a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 220dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekvoid test_33() { 221dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek int x; // no-warning 222dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek (void) x; 223dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek} 224dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek 225dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekint test_34() { 2264f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 227dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek (void) x; 228f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 229dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek} 230dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek 23140900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek// Test that this case doesn't crash. 23240900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenekvoid test35(int x) { 23340900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek __block int y = 0; 23440900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek ^{ y = (x == 0); }(); 23540900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek} 23640900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek 23796554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek// Test handling of indirect goto. 23896554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenekvoid test36() 23996554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek{ 2404f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie void **pc; // expected-note{{initialize the variable 'pc' to silence this warning}} 24196554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek void *dummy[] = { &&L1, &&L2 }; 24296554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L1: 243d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth goto *pc; // expected-warning{{variable 'pc' is uninitialized when used here}} 24496554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L2: 24596554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek goto *pc; 24696554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek} 24796554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek 2489fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test && nested in ||. 2499fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_a(); 2509fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_b(); 2519fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37() 2529fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{ 2539fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek int identifier; 2549fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek if ((test37_a() && (identifier = 1)) || 2559fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek (test37_b() && (identifier = 2))) { 2569fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return identifier; // no-warning 2579fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek } 2589fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return 0; 2599fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek} 2609fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek 2619fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test merging of path-specific dataflow values (without asserting). 2629fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test38(int r, int x, int y) 2639fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{ 2649fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek int z; 2659fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return ((r < 0) || ((r == 0) && (x < y))); 2669fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek} 2679fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek 268f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test39(int x) { 2694f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 270f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth int z = x + y; // expected-warning {{variable 'y' is uninitialized when used here}} 271f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return z; 272f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 273f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 274f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 275f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test40(int x) { 2764f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 277f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x ? 1 : y; // expected-warning {{variable 'y' is uninitialized when used here}} 278f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 279f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 280f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test41(int x) { 2814f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 282f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek if (x) y = 1; // no-warning 283584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return y; // expected-warning {{variable 'y' may be uninitialized when used here}} 284f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 285f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 286f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test42() { 287f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int a; 288f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek a = 30; // no-warning 289f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 290f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 291f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43_aux(int x); 292f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43(int i) { 2934f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 294f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek for (i = 0 ; i < 10; i++) 295d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth test43_aux(x++); // expected-warning {{variable 'x' is uninitialized when used here}} 296f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 297f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 298f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test44(int i) { 299f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int x = i; 3004f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 301f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek for (i = 0; i < 10; i++ ) { 302f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek test43_aux(x++); // no-warning 303d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth x += y; // expected-warning {{variable 'y' is uninitialized when used here}} 304f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek } 305f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 306f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 307f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test45(int j) { 308f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int x = 1, y = x + 1; 309f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek if (y) // no-warning 310f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return x; 311f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return y; 312f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 313f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 314f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test46() 315f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 3164f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int i; // expected-note{{initialize the variable 'i' to silence this warning}} 317f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth int j = i ? : 1; // expected-warning {{variable 'i' is uninitialized when used here}} 318f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 319f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 320f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test47(int *i) 321f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 322f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return i ? : 0; // no-warning 323f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 324f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 325f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test49(int *i) 326f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 327f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int a; 328f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return &a ? : i; // no-warning 329f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 330f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 331f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test50() 332f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 333f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek char c[1 ? : 2]; // no-warning 334f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 335f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 336bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenekint test51(void) 337bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek{ 338bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek __block int a; 339bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek ^(void) { 340bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek a = 42; 341bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek }(); 342bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek return a; // no-warning 343bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek} 344bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek 345e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek// FIXME: This is a false positive, but it tests logical operations in switch statements. 346e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenekint test52(int a, int b) { 3474f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note {{initialize the variable 'x' to silence this warning}} 348e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek switch (a || b) { // expected-warning {{switch condition has boolean value}} 349e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek case 0: 350e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek x = 1; 351e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek break; 352e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek case 1: 353e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek x = 2; 354e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek break; 355e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek } 356e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek return x; // expected-warning {{variable 'x' may be uninitialized when used here}} 357e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek} 3588435069798b5621615f9f65c471c7e7808316b20Chandler Carruth 359d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenekvoid test53() { 3604f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note {{initialize the variable 'x' to silence this warning}} 36162d126e942f9f420c6f398d32deb914d413226a3Ted Kremenek int y = (x); // expected-warning {{variable 'x' is uninitialized when used here}} 362d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenek} 363d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenek 3648435069798b5621615f9f65c471c7e7808316b20Chandler Carruth// This CFG caused the uninitialized values warning to inf-loop. 3658435069798b5621615f9f65c471c7e7808316b20Chandler Carruthextern int PR10379_g(); 3668435069798b5621615f9f65c471c7e7808316b20Chandler Carruthvoid PR10379_f(int *len) { 3674f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int new_len; // expected-note{{initialize the variable 'new_len' to silence this warning}} 3688435069798b5621615f9f65c471c7e7808316b20Chandler Carruth for (int i = 0; i < 42 && PR10379_g() == 0; i++) { 3698435069798b5621615f9f65c471c7e7808316b20Chandler Carruth if (PR10379_g() == 1) 3708435069798b5621615f9f65c471c7e7808316b20Chandler Carruth continue; 3718435069798b5621615f9f65c471c7e7808316b20Chandler Carruth if (PR10379_g() == 2) 3728435069798b5621615f9f65c471c7e7808316b20Chandler Carruth PR10379_f(&new_len); 3738435069798b5621615f9f65c471c7e7808316b20Chandler Carruth else if (PR10379_g() == 3) 3748435069798b5621615f9f65c471c7e7808316b20Chandler Carruth PR10379_f(&new_len); 3758435069798b5621615f9f65c471c7e7808316b20Chandler Carruth *len += new_len; // expected-warning {{variable 'new_len' may be uninitialized when used here}} 3768435069798b5621615f9f65c471c7e7808316b20Chandler Carruth } 3778435069798b5621615f9f65c471c7e7808316b20Chandler Carruth} 378540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek 379540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek// Test that sizeof(VLA) doesn't trigger a warning. 380540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenekvoid test_vla_sizeof(int x) { 381540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek double (*memory)[2][x] = malloc(sizeof(*memory)); // no-warning 382540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek} 383540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek 3846f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek// Test absurd case of deadcode + use of blocks. This previously was a false positive 3856f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek// due to an analysis bug. 3866f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenekint test_block_and_dead_code() { 3876f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek __block int x; 3886f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek ^{ x = 1; }(); 3896f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek if (0) 3906f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek return x; 3916f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek return x; // no-warning 3926f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek} 3936f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek 394