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