uninit-variables.c revision fbb178a0b47fca1b0fb78c5d41198614cf52aa70
1a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov// RUN: %clang_cc1 -fsyntax-only -Wuninitialized-experimental -fsyntax-only %s -verify
27bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
37bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test1() {
47bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x; // expected-warning{{use of uninitialized variable 'x'}}
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner  return x; // expected-note{{variable 'x' is possibly uninitialized when used here}}
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner}
77bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
87bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test2() {
97bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x = 0;
107bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  return x; // no-warning
11a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov}
127bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
137bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test3() {
147bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x;
157bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  x = 0;
167bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  return x; // no-warning
177bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
187bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
197bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test4() {
207bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x; // expected-warning{{use of uninitialized variable 'x'}}
217bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  ++x; // expected-note{{variable 'x' is possibly uninitialized when used here}}
227bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  return x;
237bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
247bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
257bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test5() {
267bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x, y; // expected-warning{{use of uninitialized variable 'y'}}
277bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  x = y; // expected-note{{variable 'y' is possibly uninitialized when used here}}
287bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  return x;
297bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
307bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
317bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test6() {
327bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x; // expected-warning{{use of uninitialized variable 'x'}}
337bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  x += 2; // expected-note{{variable 'x' is possibly uninitialized when used here}}
347bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  return x;
357bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
367bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
377bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test7(int y) {
387bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x; // expected-warning{{use of uninitialized variable 'x'}}
39a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  if (y)
40a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov    x = 1;
41a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  return x;  // expected-note{{variable 'x' is possibly uninitialized when used here}}
42a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov}
43a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov
44a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikovint test8(int y) {
45a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  int x;
467bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  if (y)
477bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov    x = 1;
48a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  else
497bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov    x = 0;
50a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  return x; // no-warning
517bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
527bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
537bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test9(int n) {
547bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x; // expected-warning{{use of uninitialized variable 'x'}}
557bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  for (unsigned i = 0 ; i < n; ++i) {
567bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov    if (i == n - 1)
577bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov      break;
587bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov    x = 1;
597bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  }
60a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  return x; // expected-note{{variable 'x' is possibly uninitialized when used here}}
617bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
627bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
637bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test10(unsigned n) {
647bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  int x; // expected-warning{{use of uninitialized variable 'x'}}
65a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  for (unsigned i = 0 ; i < n; ++i) {
667bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov    x = 1;
677bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  }
687bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  return x; // expected-note{{variable 'x' is possibly uninitialized when used here}}
697bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
70a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov
71a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikovint test11(unsigned n) {
72a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  int x; // expected-warning{{use of uninitialized variable 'x'}}
73a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  for (unsigned i = 0 ; i <= n; ++i) {
74a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov    x = 1;
75a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  }
76a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  return x; //expected-note{{variable 'x' is possibly uninitialized when used here}}
77a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov}
78c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov
79c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikovvoid test12(unsigned n) {
80c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov  for (unsigned i ; n ; ++i) ; // expected-warning{{use of uninitialized variable 'i'}} expected-note{{variable 'i' is possibly uninitialized when used here}}}
81c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov}
827bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
837bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovint test13() {
847bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  static int i;
857bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  return i; // no-warning
867bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}
877bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
887bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov// Simply don't crash on this test case.
897bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovvoid test14() {
907bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  const char *p = 0;
917bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  for (;;) {}
92}
93
94void test15() {
95  int x = x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{variable 'x' is possibly uninitialized when used here}}
96}
97
98// Don't warn in the following example; shows dataflow confluence.
99char *test16_aux();
100void test16() {
101  char *p = test16_aux();
102  for (unsigned i = 0 ; i < 100 ; i++)
103    p[i] = 'a'; // no-warning
104}
105
106void test17() {
107  // Don't warn multiple times about the same uninitialized variable
108  // along the same path.
109  int *x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}}
110  *x = 1; // expected-note{{variable 'x' is possibly uninitialized when used here}}
111  *x = 1; // no-warning
112}
113
114int test18(int x, int y) {
115  int z;
116  if (x && y && (z = 1)) {
117    return z; // no-warning
118  }
119  return 0;
120}
121
122int test19_aux1();
123int test19_aux2();
124int test19_aux3(int *x);
125int test19() {
126  int z;
127  if (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z))
128    return z; // no-warning
129  return 0;
130}
131
132int test20() {
133  int z; // expected-warning{{use of uninitialized variable 'z'}}
134  if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z))
135    return z; //  expected-note{{variable 'z' is possibly uninitialized when used here}}
136  return 0;
137}
138
139int test21(int x, int y) {
140  int z; // expected-warning{{use of uninitialized variable 'z'}}
141  if ((x && y) || test19_aux3(&z) || test19_aux2())
142    return z; // expected-note{{variable 'z' is possibly uninitialized when used here}}
143  return 0;
144}
145
146int test22() {
147  int z;
148  while (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z))
149    return z; // no-warning
150  return 0;
151}
152
153int test23() {
154  int z;
155  for ( ; test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z) ; )
156    return z; // no-warning
157  return 0;
158}
159
160// The basic uninitialized value analysis doesn't have enough path-sensitivity
161// to catch initializations relying on control-dependencies spanning multiple
162// conditionals.  This possibly can be handled by making the CFG itself
163// represent such control-dependencies, but it is a niche case.
164int test24(int flag) {
165  unsigned val; // expected-warning{{use of uninitialized variable 'val'}}
166  if (flag)
167    val = 1;
168  if (!flag)
169    val = 1;
170  return val; //  expected-note{{variable 'val' is possibly uninitialized when used here}}
171}
172
173