uninit-variables.c revision a8c17a5babab35f2db26bf218e7571d1af4afedf
1a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek// RUN: %clang_cc1 -fsyntax-only -Wuninitialized-experimental -fsyntax-only -fblocks %s -verify 2610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 3610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test1() { 4dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 594b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return x; // expected-note{{variable 'x' is possibly 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() { 20dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 2194b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek ++x; // expected-note{{variable 'x' is possibly uninitialized when used here}} 22610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 23610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 24610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 25610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test5() { 26dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x, y; // expected-warning{{use of uninitialized variable 'y'}} expected-note{{add initialization to silence this warning}} 2794b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek x = y; // expected-note{{variable 'y' is possibly uninitialized when used here}} 28610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 29610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 30610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 31610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test6() { 32dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 3394b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek x += 2; // expected-note{{variable 'x' is possibly uninitialized when used here}} 34610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; 35610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 36610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 37610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test7(int y) { 38dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 39610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (y) 40610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 4194b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return x; // expected-note{{variable 'x' is possibly 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; 50610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return x; // no-warning 51610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 52610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 53610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test9(int n) { 54dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} 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 } 6094b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} 61610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 62610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 63610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test10(unsigned n) { 64dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 65610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i < n; ++i) { 66610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 67610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 6894b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} 69610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 70610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 71610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test11(unsigned n) { 72dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 73610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i <= n; ++i) { 74610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 75610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 7694b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return x; //expected-note{{variable 'x' is possibly uninitialized when used here}} 77610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 78610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 79610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekvoid test12(unsigned n) { 80dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek for (unsigned i ; n ; ++i) ; // expected-warning{{use of uninitialized variable 'i'}} expected-note{{variable 'i' is possibly uninitialized when used 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 94c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test15() { 95dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int x = x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{variable 'x' is possibly uninitialized when used here}} expected-note{{add initialization to silence this warning}} 96c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 97610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 98c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Don't warn in the following example; shows dataflow confluence. 99c104e53639de4424b83955acfadc977773b5883dTed Kremenekchar *test16_aux(); 100c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test16() { 101c104e53639de4424b83955acfadc977773b5883dTed Kremenek char *p = test16_aux(); 102c104e53639de4424b83955acfadc977773b5883dTed Kremenek for (unsigned i = 0 ; i < 100 ; i++) 103c104e53639de4424b83955acfadc977773b5883dTed Kremenek p[i] = 'a'; // no-warning 104c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 105c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek 106c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekvoid test17() { 107c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // Don't warn multiple times about the same uninitialized variable 108c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // along the same path. 109fbb178a0b47fca1b0fb78c5d41198614cf52aa70Ted Kremenek int *x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 11094b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek *x = 1; // expected-note{{variable 'x' is possibly uninitialized when used here}} 111c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek *x = 1; // no-warning 112c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek} 11313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 11413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test18(int x, int y) { 11513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 11613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (x && y && (z = 1)) { 11713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 11813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek } 11913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 12013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 12113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 12213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux1(); 12313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux2(); 12413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux3(int *x); 12513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19() { 12613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 12713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z)) 12813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 12913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 13013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 13113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 13213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test20() { 133dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int z; // expected-warning{{use of uninitialized variable 'z'}} expected-note{{add initialization to silence this warning}} 13413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z)) 13594b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return z; // expected-note{{variable 'z' is possibly uninitialized when used here}} 13613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 13713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 13813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 13913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test21(int x, int y) { 140dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek int z; // expected-warning{{use of uninitialized variable 'z'}} expected-note{{add initialization to silence this warning}} 14113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if ((x && y) || test19_aux3(&z) || test19_aux2()) 14294b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return z; // expected-note{{variable 'z' is possibly uninitialized when used here}} 14313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 14413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 14513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 14613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test22() { 14713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 14813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek while (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z)) 14913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 15013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 15113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 15213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 15313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test23() { 15413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 15513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek for ( ; test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z) ; ) 15613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 15713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 15813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 15913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 16013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// The basic uninitialized value analysis doesn't have enough path-sensitivity 16113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// to catch initializations relying on control-dependencies spanning multiple 16213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// conditionals. This possibly can be handled by making the CFG itself 16313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// represent such control-dependencies, but it is a niche case. 16413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test24(int flag) { 165dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek unsigned val; // expected-warning{{use of uninitialized variable 'val'}} expected-note{{add initialization to silence this warning}} 16613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (flag) 16713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 16813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (!flag) 16913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 17094b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek return val; // expected-note{{variable 'val' is possibly uninitialized when used here}} 17113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 17213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 173dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenekfloat test25() { 174dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek float x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 175dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} 176dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 177dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek 178dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenektypedef int MyInt; 179dcfb360f6e1aaab0754a98e1e245c2607c46058aTed KremenekMyInt test26() { 180dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek MyInt x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 181dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} 182dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 1839660803cd332d5c605899435019bb3b37fca3accTed Kremenek 1849660803cd332d5c605899435019bb3b37fca3accTed Kremenek// Test handling of sizeof(). 1859660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test27() { 1869660803cd332d5c605899435019bb3b37fca3accTed Kremenek struct test_27 { int x; } *y; 1879660803cd332d5c605899435019bb3b37fca3accTed Kremenek return sizeof(y->x); // no-warning 1889660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 1899660803cd332d5c605899435019bb3b37fca3accTed Kremenek 1909660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test28() { 1919660803cd332d5c605899435019bb3b37fca3accTed Kremenek int len; // expected-warning{{use of uninitialized variable 'len'}} expected-note{{add initialization to silence this warning}} 1929660803cd332d5c605899435019bb3b37fca3accTed Kremenek return sizeof(int[len]); // expected-note{{variable 'len' is possibly uninitialized when used here}} 1939660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 1949660803cd332d5c605899435019bb3b37fca3accTed Kremenek 195a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test29() { 196a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} 197a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; // expected-note{{variable 'x' is possibly uninitialized when captured by block}} 198a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 199a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 200a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test30() { 201a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek static int x; // no-warning 202a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 203a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 204a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 205a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test31() { 206a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek __block int x; // no-warning 207a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 208a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 209a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 210a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekint test32_x; 211a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test32() { 212a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) test32_x; }; // no-warning 213a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 214a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 215