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