uninit-variables.c revision 9532e0d89ca2afa556f032aa9377f6ec1d3eaa3e
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}} 369532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith x += 2; 379532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith return x; // expected-warning{{variable 'x' is uninitialized when used here}} 38610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 39610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 40610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test7(int y) { 414f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 42bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith if (y) // expected-warning{{variable 'x' is used uninitialized whenever 'if' condition is false}} \ 43bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith // expected-note{{remove the 'if' if its condition is always true}} 44610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 45bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith return x; // expected-note{{uninitialized use occurs here}} 46610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 47610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 480d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gayint test7b(int y) { 490d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay int x = x; // expected-note{{variable 'x' is declared here}} 500d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay if (y) 510d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay x = 1; 522815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith // Warn with "may be uninitialized" here (not "is sometimes uninitialized"), 532815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith // since the self-initialization is intended to suppress a -Wuninitialized 542815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith // warning. 550d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 560d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay} 570d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay 58610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test8(int y) { 59610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek int x; 60610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (y) 61610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 62610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek else 63610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 0; 64609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek return x; 65610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 66610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 67610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test9(int n) { 684f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 69610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i < n; ++i) { 70610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek if (i == n - 1) 71610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek break; 7294b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek x = 1; 73610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 74584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 75610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 76610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 77610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test10(unsigned n) { 784f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 79610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i < n; ++i) { 80610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 81610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 82584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 83610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 84610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 85610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test11(unsigned n) { 864f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 87610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek for (unsigned i = 0 ; i <= n; ++i) { 88610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek x = 1; 89610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek } 90584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return x; // expected-warning{{variable 'x' may be uninitialized when used here}} 91610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 92610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 93610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekvoid test12(unsigned n) { 944f4f349208b2b2307454e169ac7b039e989f003fDavid 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}} 95610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 96610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 97610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test13() { 98610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek static int i; 99610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek return i; // no-warning 100610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek} 101610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 102c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Simply don't crash on this test case. 103c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test14() { 104c104e53639de4424b83955acfadc977773b5883dTed Kremenek const char *p = 0; 105c104e53639de4424b83955acfadc977773b5883dTed Kremenek for (;;) {} 106c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 107c104e53639de4424b83955acfadc977773b5883dTed Kremenek 1089e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenekvoid test15() { 1099e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek int x = x; // no-warning: signals intended lack of initialization. 1109e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek} 1119e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek 1129e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenekint test15b() { 1139e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek // Warn here with the self-init, since it does result in a use of 1149e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek // an unintialized variable and this is the root cause. 1159e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek int x = x; // expected-warning {{variable 'x' is uninitialized when used within its own initialization}} 1169e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek return x; 117c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 118610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek 119c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Don't warn in the following example; shows dataflow confluence. 120c104e53639de4424b83955acfadc977773b5883dTed Kremenekchar *test16_aux(); 121c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test16() { 122c104e53639de4424b83955acfadc977773b5883dTed Kremenek char *p = test16_aux(); 123c104e53639de4424b83955acfadc977773b5883dTed Kremenek for (unsigned i = 0 ; i < 100 ; i++) 124c104e53639de4424b83955acfadc977773b5883dTed Kremenek p[i] = 'a'; // no-warning 125c104e53639de4424b83955acfadc977773b5883dTed Kremenek} 126c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek 127c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekvoid test17() { 128c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // Don't warn multiple times about the same uninitialized variable 129c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek // along the same path. 1304f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int *x; // expected-note{{initialize the variable 'x' to silence this warning}} 131f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth *x = 1; // expected-warning{{variable 'x' is uninitialized when used here}} 132c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek *x = 1; // no-warning 133c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek} 13413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 13513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test18(int x, int y) { 13613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 13713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (x && y && (z = 1)) { 13813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 13913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek } 14013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 14113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 14213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 14313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux1(); 14413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux2(); 14513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux3(int *x); 14613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19() { 14713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 14813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (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 test20() { 1544f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int z; // expected-note{{initialize the variable 'z' to silence this warning}} 1553f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z)) // expected-warning {{variable 'z' is used uninitialized whenever '||' condition is true}} expected-note {{remove the '||' if its condition is always false}} 1563f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek return z; // expected-note {{uninitialized use occurs here}} 15713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 15813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 15913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 16013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test21(int x, int y) { 1614f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int z; // expected-note{{initialize the variable 'z' to silence this warning}} 1623f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek if ((x && y) || test19_aux3(&z) || test19_aux2()) // expected-warning {{variable 'z' is used uninitialized whenever '||' condition is true}} expected-note {{remove the '||' if its condition is always false}} 1633f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek return z; // expected-note {{uninitialized use occurs here}} 16413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 16513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 16613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 16713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test22() { 16813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 16913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek while (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z)) 17013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 17113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 17213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 17313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 17413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test23() { 17513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek int z; 17613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek for ( ; test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z) ; ) 17713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return z; // no-warning 17813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek return 0; 17913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 18013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 18113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// The basic uninitialized value analysis doesn't have enough path-sensitivity 18213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// to catch initializations relying on control-dependencies spanning multiple 18313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// conditionals. This possibly can be handled by making the CFG itself 18413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// represent such control-dependencies, but it is a niche case. 18513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test24(int flag) { 1864f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie unsigned val; // expected-note{{initialize the variable 'val' to silence this warning}} 18713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (flag) 18813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 18913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek if (!flag) 19013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek val = 1; 191584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth return val; // expected-warning{{variable 'val' may be uninitialized when used here}} 19213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek} 19313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek 194dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenekfloat test25() { 1954f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie float x; // expected-note{{initialize the variable 'x' to silence this warning}} 196f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 197dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 198dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek 199dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenektypedef int MyInt; 200dcfb360f6e1aaab0754a98e1e245c2607c46058aTed KremenekMyInt test26() { 2014f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie MyInt x; // expected-note{{initialize the variable 'x' to silence this warning}} 202f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 203dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek} 2049660803cd332d5c605899435019bb3b37fca3accTed Kremenek 2059660803cd332d5c605899435019bb3b37fca3accTed Kremenek// Test handling of sizeof(). 2069660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test27() { 2079660803cd332d5c605899435019bb3b37fca3accTed Kremenek struct test_27 { int x; } *y; 2089660803cd332d5c605899435019bb3b37fca3accTed Kremenek return sizeof(y->x); // no-warning 2099660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 2109660803cd332d5c605899435019bb3b37fca3accTed Kremenek 2119660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test28() { 2124f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int len; // expected-note{{initialize the variable 'len' to silence this warning}} 213f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return sizeof(int[len]); // expected-warning{{variable 'len' is uninitialized when used here}} 2149660803cd332d5c605899435019bb3b37fca3accTed Kremenek} 2159660803cd332d5c605899435019bb3b37fca3accTed Kremenek 216a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test29() { 2174f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 218f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth (void) ^{ (void) x; }; // expected-warning{{variable 'x' is uninitialized when captured by block}} 219a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 220a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 221a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test30() { 222a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek static int x; // no-warning 223a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 224a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 225a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 226a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test31() { 227a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek __block int x; // no-warning 228a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) x; }; 229a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 230a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 231a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekint test32_x; 232a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test32() { 233a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek (void) ^{ (void) test32_x; }; // no-warning 234a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek} 235a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek 236dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekvoid test_33() { 237dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek int x; // no-warning 238dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek (void) x; 239dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek} 240dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek 241dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekint test_34() { 2424f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 243dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek (void) x; 244f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x; // expected-warning{{variable 'x' is uninitialized when used here}} 245dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek} 246dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek 24740900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek// Test that this case doesn't crash. 24840900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenekvoid test35(int x) { 24940900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek __block int y = 0; 25040900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek ^{ y = (x == 0); }(); 25140900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek} 25240900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek 25396554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek// Test handling of indirect goto. 25496554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenekvoid test36() 25596554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek{ 2564f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie void **pc; // expected-note{{initialize the variable 'pc' to silence this warning}} 25796554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek void *dummy[] = { &&L1, &&L2 }; 25896554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L1: 259d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth goto *pc; // expected-warning{{variable 'pc' is uninitialized when used here}} 26096554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L2: 26196554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek goto *pc; 26296554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek} 26396554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek 2649fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test && nested in ||. 2659fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_a(); 2669fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_b(); 2679fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37() 2689fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{ 2699fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek int identifier; 2709fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek if ((test37_a() && (identifier = 1)) || 2719fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek (test37_b() && (identifier = 2))) { 2729fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return identifier; // no-warning 2739fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek } 2749fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return 0; 2759fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek} 2769fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek 2779fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test merging of path-specific dataflow values (without asserting). 2789fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test38(int r, int x, int y) 2799fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{ 2809fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek int z; 2819fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek return ((r < 0) || ((r == 0) && (x < y))); 2829fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek} 2839fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek 284f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test39(int x) { 2854f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 286f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth int z = x + y; // expected-warning {{variable 'y' is uninitialized when used here}} 287f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return z; 288f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 289f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 290f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 291f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test40(int x) { 2924f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 293f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return x ? 1 : y; // expected-warning {{variable 'y' is uninitialized when used here}} 294f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 295f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 296f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test41(int x) { 2974f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 298bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith if (x) y = 1; // expected-warning{{variable 'y' is used uninitialized whenever 'if' condition is false}} \ 299bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith // expected-note{{remove the 'if' if its condition is always true}} 300bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith return y; // expected-note{{uninitialized use occurs here}} 301f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 302f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 303f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test42() { 304f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int a; 305f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek a = 30; // no-warning 306f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 307f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 308f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43_aux(int x); 309f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43(int i) { 3104f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note{{initialize the variable 'x' to silence this warning}} 311f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek for (i = 0 ; i < 10; i++) 312d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth test43_aux(x++); // expected-warning {{variable 'x' is uninitialized when used here}} 313f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 314f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 315f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test44(int i) { 316f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int x = i; 3174f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int y; // expected-note{{initialize the variable 'y' to silence this warning}} 318f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek for (i = 0; i < 10; i++ ) { 319f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek test43_aux(x++); // no-warning 320d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth x += y; // expected-warning {{variable 'y' is uninitialized when used here}} 321f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek } 322f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 323f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 324f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test45(int j) { 325f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int x = 1, y = x + 1; 326f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek if (y) // no-warning 327f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return x; 328f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return y; 329f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 330f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 331f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test46() 332f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 3334f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int i; // expected-note{{initialize the variable 'i' to silence this warning}} 334f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth int j = i ? : 1; // expected-warning {{variable 'i' is uninitialized when used here}} 335f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 336f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 337f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test47(int *i) 338f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 339f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return i ? : 0; // no-warning 340f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 341f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 342f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test49(int *i) 343f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 344f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek int a; 345f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek return &a ? : i; // no-warning 346f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 347f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 348f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test50() 349f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{ 350f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek char c[1 ? : 2]; // no-warning 351f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek} 352f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek 353bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenekint test51(void) 354bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek{ 355bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek __block int a; 356bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek ^(void) { 357bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek a = 42; 358bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek }(); 359bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek return a; // no-warning 360bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek} 361bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek 362e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek// FIXME: This is a false positive, but it tests logical operations in switch statements. 363e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenekint test52(int a, int b) { 3644f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note {{initialize the variable 'x' to silence this warning}} 365e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek switch (a || b) { // expected-warning {{switch condition has boolean value}} 366e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek case 0: 367e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek x = 1; 368e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek break; 369e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek case 1: 370e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek x = 2; 371e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek break; 372e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek } 373e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek return x; // expected-warning {{variable 'x' may be uninitialized when used here}} 374e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek} 3758435069798b5621615f9f65c471c7e7808316b20Chandler Carruth 376d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenekvoid test53() { 3774f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int x; // expected-note {{initialize the variable 'x' to silence this warning}} 37862d126e942f9f420c6f398d32deb914d413226a3Ted Kremenek int y = (x); // expected-warning {{variable 'x' is uninitialized when used here}} 379d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenek} 380d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenek 3818435069798b5621615f9f65c471c7e7808316b20Chandler Carruth// This CFG caused the uninitialized values warning to inf-loop. 3828435069798b5621615f9f65c471c7e7808316b20Chandler Carruthextern int PR10379_g(); 3838435069798b5621615f9f65c471c7e7808316b20Chandler Carruthvoid PR10379_f(int *len) { 3844f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie int new_len; // expected-note{{initialize the variable 'new_len' to silence this warning}} 3858435069798b5621615f9f65c471c7e7808316b20Chandler Carruth for (int i = 0; i < 42 && PR10379_g() == 0; i++) { 3868435069798b5621615f9f65c471c7e7808316b20Chandler Carruth if (PR10379_g() == 1) 3878435069798b5621615f9f65c471c7e7808316b20Chandler Carruth continue; 3888435069798b5621615f9f65c471c7e7808316b20Chandler Carruth if (PR10379_g() == 2) 3898435069798b5621615f9f65c471c7e7808316b20Chandler Carruth PR10379_f(&new_len); 3908435069798b5621615f9f65c471c7e7808316b20Chandler Carruth else if (PR10379_g() == 3) 3918435069798b5621615f9f65c471c7e7808316b20Chandler Carruth PR10379_f(&new_len); 3928435069798b5621615f9f65c471c7e7808316b20Chandler Carruth *len += new_len; // expected-warning {{variable 'new_len' may be uninitialized when used here}} 3938435069798b5621615f9f65c471c7e7808316b20Chandler Carruth } 3948435069798b5621615f9f65c471c7e7808316b20Chandler Carruth} 395540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek 396540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek// Test that sizeof(VLA) doesn't trigger a warning. 397540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenekvoid test_vla_sizeof(int x) { 398540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek double (*memory)[2][x] = malloc(sizeof(*memory)); // no-warning 399540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek} 400540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek 4016f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek// Test absurd case of deadcode + use of blocks. This previously was a false positive 4026f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek// due to an analysis bug. 4036f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenekint test_block_and_dead_code() { 4046f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek __block int x; 4056f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek ^{ x = 1; }(); 4066f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek if (0) 4076f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek return x; 4086f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek return x; // no-warning 4096f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek} 4106f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek 411c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek// This previously triggered an infinite loop in the analysis. 412c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenekvoid PR11069(int a, int b) { 413c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek unsigned long flags; 414c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek for (;;) { 415c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek if (a && !b) 416c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek break; 417c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek } 418c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek for (;;) { 419c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek // This does not trigger a warning because it isn't a real use. 420c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek (void)(flags); // no-warning 421c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek } 422c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek} 423c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek 424aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek// Test uninitialized value used in loop condition. 425aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenekvoid rdar9432305(float *P) { 426aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek int i; // expected-note {{initialize the variable 'i' to silence this warning}} 427aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek for (; i < 10000; ++i) // expected-warning {{variable 'i' is uninitialized when used here}} 428aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek P[i] = 0.0f; 429aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek} 4307b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu 4317b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu// Test that fixits are not emitted inside macros. 4327b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu#define UNINIT(T, x, y) T x; T y = x; 4337b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu#define ASSIGN(T, x, y) T y = x; 4347b0a3e378c441cec60f929d13bd48846c267a008Richard Trieuvoid test54() { 4357b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu UNINIT(int, a, b); // expected-warning {{variable 'a' is uninitialized when used here}} \ 4367b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu // expected-note {{variable 'a' is declared here}} 4377b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu int c; // expected-note {{initialize the variable 'c' to silence this warning}} 4387b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu ASSIGN(int, c, d); // expected-warning {{variable 'c' is uninitialized when used here}} 4397b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu} 4408f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith 4417e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenberger// Taking the address is fine 4427e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenbergerstruct { struct { void *p; } a; } test55 = { { &test55.a }}; // no-warning 4437e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenbergerstruct { struct { void *p; } a; } test56 = { { &(test56.a) }}; // no-warning 4447e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenberger 4458f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smithvoid uninit_in_loop() { 4468f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith int produce(void); 4478f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith void consume(int); 4488f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith for (int n = 0; n < 100; ++n) { 4498f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith int k; // expected-note {{initialize}} 4508f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith consume(k); // expected-warning {{variable 'k' is uninitialized}} 4518f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith k = produce(); 4528f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith } 4538f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith} 4548f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith 4558f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smithvoid uninit_in_loop_goto() { 4568f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith int produce(void); 4578f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith void consume(int); 4588f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith for (int n = 0; n < 100; ++n) { 4598f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith goto skip_decl; 4608f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith int k; // expected-note {{initialize}} 4618f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smithskip_decl: 4628f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith // FIXME: This should produce the 'is uninitialized' diagnostic, but we 4638f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith // don't have enough information in the CFG to easily tell that the 4648f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith // variable's scope has been left and re-entered. 4658f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith consume(k); // expected-warning {{variable 'k' may be uninitialized}} 4668f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith k = produce(); 4678f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith } 4688f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith} 469a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith 470a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithtypedef char jmp_buf[256]; 471a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithextern int setjmp(jmp_buf env); // implicitly returns_twice 472a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith 473a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithvoid do_stuff_and_longjmp(jmp_buf env, int *result) __attribute__((noreturn)); 474a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith 475a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithint returns_twice() { 476a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith int a; // expected-note {{initialize}} 477a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith if (!a) { // expected-warning {{variable 'a' is uninitialized}} 478a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith jmp_buf env; 479a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith int b; 480a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith if (setjmp(env) == 0) { 481a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith do_stuff_and_longjmp(env, &b); 482a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith } else { 483a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith a = b; // no warning 484a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith } 485a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith } 486a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith return a; 487a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith} 4889532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith 4899532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smithint compound_assign(int *arr, int n) { 4909532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith int sum; // expected-note {{initialize}} 4919532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith for (int i = 0; i < n; ++i) 4929532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith sum += arr[i]; 4939532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith return sum / n; // expected-warning {{variable 'sum' is uninitialized}} 4949532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith} 4959532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith 4969532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smithvoid compound_assign_2(int n) { 4979532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith volatile int ignore; 4989532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith for (int j = 0; j < n; ++j) 4999532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith ignore += test1(); // ok 5009532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith} 501