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