blob: 7ac225f5a3376f0ab4fa96ec1d5aecc971516cb1 [file] [log] [blame]
Ted Kremenek4dccb902011-01-18 05:00:42 +00001// RUN: %clang_cc1 -fsyntax-only -Wuninitialized-experimental -fsyntax-only %s -verify
Ted Kremenek610068c2011-01-15 02:58:47 +00002
3int test1() {
4 int x;
5 return x; // expected-warning{{use of uninitialized variable 'x'}}
6}
7
8int test2() {
9 int x = 0;
10 return x; // no-warning
11}
12
13int test3() {
14 int x;
15 x = 0;
16 return x; // no-warning
17}
18
19int test4() {
20 int x;
21 ++x; // expected-warning{{use of uninitialized variable 'x'}}
22 return x;
23}
24
25int test5() {
26 int x, y;
27 x = y; // expected-warning{{use of uninitialized variable 'y'}}
28 return x;
29}
30
31int test6() {
32 int x;
33 x += 2; // expected-warning{{use of uninitialized variable 'x'}}
34 return x;
35}
36
37int test7(int y) {
38 int x;
39 if (y)
40 x = 1;
41 return x; // expected-warning{{use of uninitialized variable 'x'}}
42}
43
44int test8(int y) {
45 int x;
46 if (y)
47 x = 1;
48 else
49 x = 0;
50 return x; // no-warning
51}
52
53int test9(int n) {
54 int x;
55 for (unsigned i = 0 ; i < n; ++i) {
56 if (i == n - 1)
57 break;
58 x = 1;
59 }
60 return x; // expected-warning{{use of uninitialized variable 'x'}}
61}
62
63int test10(unsigned n) {
64 int x;
65 for (unsigned i = 0 ; i < n; ++i) {
66 x = 1;
67 }
68 return x; // expected-warning{{use of uninitialized variable 'x'}}
69}
70
71int test11(unsigned n) {
72 int x;
73 for (unsigned i = 0 ; i <= n; ++i) {
74 x = 1;
75 }
76 return x; // expected-warning{{use of uninitialized variable 'x'}}
77}
78
79void test12(unsigned n) {
80 for (unsigned i ; n ; ++i) ; // expected-warning{{use of uninitialized variable 'i'}}
81}
82
83int test13() {
84 static int i;
85 return i; // no-warning
86}
87
Ted Kremenekc104e532011-01-18 04:53:25 +000088// Simply don't crash on this test case.
89void test14() {
90 const char *p = 0;
91 for (;;) {}
92}
Ted Kremenek610068c2011-01-15 02:58:47 +000093
Ted Kremenekc104e532011-01-18 04:53:25 +000094void test15() {
95 int x = x; // expected-warning{{use of uninitialized variable 'x'}}
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}
Ted Kremenekc21fed32011-01-18 21:18:58 +0000105
106void test17() {
107 // Don't warn multiple times about the same uninitialized variable
108 // along the same path.
109 int *x;
110 *x = 1; // expected-warning{{use of uninitialized variable 'x'}}
111 *x = 1; // no-warning
112}
Ted Kremenek13bd4232011-01-20 17:37:17 +0000113
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;
134 if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z))
135 return z; // expected-warning{{use of uninitialized variable 'z'}}
136 return 0;
137}
138
139int test21(int x, int y) {
140 int z;
141 if ((x && y) || test19_aux3(&z) || test19_aux2())
142 return z; // expected-warning{{use of uninitialized variable 'z'}}
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;
166 if (flag)
167 val = 1;
168 if (!flag)
169 val = 1;
170 return val; // expected-warning{{use of uninitialized variable 'val'}}
171}
172