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