10a65f946721f1505e5577b1910f3193888696573Ted Kremenek// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -Wconditional-uninitialized -fsyntax-only -fblocks %s -verify
2610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
3540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenektypedef __typeof(sizeof(int)) size_t;
4540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenekvoid *malloc(size_t);
5540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek
6610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test1() {
74f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
8f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  return x; // expected-warning{{variable 'x' is uninitialized when used here}}
9610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
10610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
11610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test2() {
12610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  int x = 0;
13610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  return x; // no-warning
14610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
15610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
16610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test3() {
17610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  int x;
18610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  x = 0;
19610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  return x; // no-warning
20610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
21610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
22610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test4() {
234f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
24f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  ++x; // expected-warning{{variable 'x' is uninitialized when used here}}
25610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  return x;
26610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
27610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
28610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test5() {
294f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x, y; // expected-note{{initialize the variable 'y' to silence this warning}}
30f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  x = y; // expected-warning{{variable 'y' is uninitialized when used here}}
31610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  return x;
32610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
33610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
34610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test6() {
354f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
366cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  x += 2; // expected-warning{{variable 'x' is uninitialized when used here}}
376cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  return x;
38610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
39610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
40610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test7(int y) {
414f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
42bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  if (y) // expected-warning{{variable 'x' is used uninitialized whenever 'if' condition is false}} \
43bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith         // expected-note{{remove the 'if' if its condition is always true}}
44610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    x = 1;
45bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note{{uninitialized use occurs here}}
46610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
47610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
480d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gayint test7b(int y) {
490d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay  int x = x; // expected-note{{variable 'x' is declared here}}
500d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay  if (y)
510d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay    x = 1;
522815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  // Warn with "may be uninitialized" here (not "is sometimes uninitialized"),
532815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  // since the self-initialization is intended to suppress a -Wuninitialized
542815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  // warning.
550d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay  return x; // expected-warning{{variable 'x' may be uninitialized when used here}}
560d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay}
570d381810da19dd7677b9a79fca516d298fa5addbMatt Beaumont-Gay
58610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test8(int y) {
59610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  int x;
60610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  if (y)
61610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    x = 1;
62610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  else
63610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    x = 0;
64609e3170841dac81c3b7b6b9eccb9c520e42c9b2Ted Kremenek  return x;
65610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
66610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
67610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test9(int n) {
684f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
69610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  for (unsigned i = 0 ; i < n; ++i) {
70610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    if (i == n - 1)
71610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek      break;
7294b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek    x = 1;
73610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  }
74584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth  return x; // expected-warning{{variable 'x' may be uninitialized when used here}}
75610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
76610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
77610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test10(unsigned n) {
784f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
79610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  for (unsigned i = 0 ; i < n; ++i) {
80610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    x = 1;
81610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  }
82584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth  return x; // expected-warning{{variable 'x' may be uninitialized when used here}}
83610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
84610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
85610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test11(unsigned n) {
864f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
87610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  for (unsigned i = 0 ; i <= n; ++i) {
88610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    x = 1;
89610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  }
90584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth  return x; // expected-warning{{variable 'x' may be uninitialized when used here}}
91610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
92610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
93610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekvoid test12(unsigned n) {
944f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  for (unsigned i ; n ; ++i) ; // expected-warning{{variable 'i' is uninitialized when used here}} expected-note{{initialize the variable 'i' to silence this warning}}
95610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
96610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
97610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekint test13() {
98610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  static int i;
99610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  return i; // no-warning
100610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek}
101610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
102c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Simply don't crash on this test case.
103c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test14() {
104c104e53639de4424b83955acfadc977773b5883dTed Kremenek  const char *p = 0;
105c104e53639de4424b83955acfadc977773b5883dTed Kremenek  for (;;) {}
106c104e53639de4424b83955acfadc977773b5883dTed Kremenek}
107c104e53639de4424b83955acfadc977773b5883dTed Kremenek
1089e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenekvoid test15() {
1099e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek  int x = x; // no-warning: signals intended lack of initialization.
1109e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek}
1119e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek
1129e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenekint test15b() {
1139e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek  // Warn here with the self-init, since it does result in a use of
1149e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek  // an unintialized variable and this is the root cause.
1159e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek  int x = x; // expected-warning {{variable 'x' is uninitialized when used within its own initialization}}
1169e7617220135a6f6226cf09cb242cc1b905aedb4Ted Kremenek  return x;
117c104e53639de4424b83955acfadc977773b5883dTed Kremenek}
118610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
119c104e53639de4424b83955acfadc977773b5883dTed Kremenek// Don't warn in the following example; shows dataflow confluence.
120c104e53639de4424b83955acfadc977773b5883dTed Kremenekchar *test16_aux();
121c104e53639de4424b83955acfadc977773b5883dTed Kremenekvoid test16() {
122c104e53639de4424b83955acfadc977773b5883dTed Kremenek  char *p = test16_aux();
123c104e53639de4424b83955acfadc977773b5883dTed Kremenek  for (unsigned i = 0 ; i < 100 ; i++)
124c104e53639de4424b83955acfadc977773b5883dTed Kremenek    p[i] = 'a'; // no-warning
125c104e53639de4424b83955acfadc977773b5883dTed Kremenek}
126c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek
127c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekvoid test17() {
128c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  // Don't warn multiple times about the same uninitialized variable
129c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  // along the same path.
1304f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int *x; // expected-note{{initialize the variable 'x' to silence this warning}}
131f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  *x = 1; // expected-warning{{variable 'x' is uninitialized when used here}}
132c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  *x = 1; // no-warning
133c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek}
13413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek
13513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test18(int x, int y) {
13613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  int z;
13713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  if (x && y && (z = 1)) {
13813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek    return z; // no-warning
13913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  }
14013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  return 0;
14113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek}
14213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek
14313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux1();
14413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux2();
14513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19_aux3(int *x);
14613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test19() {
14713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  int z;
14813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  if (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 test20() {
1544f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int z; // expected-note{{initialize the variable 'z' to silence this warning}}
1553f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek  if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z)) // expected-warning {{variable 'z' is used uninitialized whenever '||' condition is true}} expected-note {{remove the '||' if its condition is always false}}
1563f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek    return z; // expected-note {{uninitialized use occurs here}}
15713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  return 0;
15813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek}
15913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek
16013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test21(int x, int y) {
1614f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int z; // expected-note{{initialize the variable 'z' to silence this warning}}
1623f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek  if ((x && y) || test19_aux3(&z) || test19_aux2()) // expected-warning {{variable 'z' is used uninitialized whenever '||' condition is true}} expected-note {{remove the '||' if its condition is always false}}
1633f635c08b2d0b2d5bafb38da09589cb238407faaTed Kremenek    return z; // expected-note {{uninitialized use occurs here}}
16413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  return 0;
16513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek}
16613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek
16713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test22() {
16813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  int z;
16913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  while (test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z))
17013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek    return z; // no-warning
17113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  return 0;
17213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek}
17313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek
17413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test23() {
17513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  int z;
17613bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  for ( ; test19_aux1() + test19_aux2() && test19_aux1() && test19_aux3(&z) ; )
17713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek    return z; // no-warning
17813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  return 0;
17913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek}
18013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek
18113bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// The basic uninitialized value analysis doesn't have enough path-sensitivity
18213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// to catch initializations relying on control-dependencies spanning multiple
18313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// conditionals.  This possibly can be handled by making the CFG itself
18413bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek// represent such control-dependencies, but it is a niche case.
18513bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenekint test24(int flag) {
1864f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  unsigned val; // expected-note{{initialize the variable 'val' to silence this warning}}
18713bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  if (flag)
18813bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek    val = 1;
18913bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek  if (!flag)
19013bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek    val = 1;
191584b9d6bd0ce199787900695fe75528fcde405feChandler Carruth  return val; // expected-warning{{variable 'val' may be uninitialized when used here}}
19213bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek}
19313bd4236ab8297350be388ab442b4c42eb8fe437Ted Kremenek
194dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenekfloat test25() {
1954f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  float x; // expected-note{{initialize the variable 'x' to silence this warning}}
196f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  return x; // expected-warning{{variable 'x' is uninitialized when used here}}
197dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek}
198dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek
199dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenektypedef int MyInt;
200dcfb360f6e1aaab0754a98e1e245c2607c46058aTed KremenekMyInt test26() {
2014f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  MyInt x; // expected-note{{initialize the variable 'x' to silence this warning}}
202f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  return x; // expected-warning{{variable 'x' is uninitialized when used here}}
203dcfb360f6e1aaab0754a98e1e245c2607c46058aTed Kremenek}
2049660803cd332d5c605899435019bb3b37fca3accTed Kremenek
2059660803cd332d5c605899435019bb3b37fca3accTed Kremenek// Test handling of sizeof().
2069660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test27() {
2079660803cd332d5c605899435019bb3b37fca3accTed Kremenek  struct test_27 { int x; } *y;
2089660803cd332d5c605899435019bb3b37fca3accTed Kremenek  return sizeof(y->x); // no-warning
2099660803cd332d5c605899435019bb3b37fca3accTed Kremenek}
2109660803cd332d5c605899435019bb3b37fca3accTed Kremenek
2119660803cd332d5c605899435019bb3b37fca3accTed Kremenekint test28() {
2124f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int len; // expected-note{{initialize the variable 'len' to silence this warning}}
213f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  return sizeof(int[len]); // expected-warning{{variable 'len' is uninitialized when used here}}
2149660803cd332d5c605899435019bb3b37fca3accTed Kremenek}
2159660803cd332d5c605899435019bb3b37fca3accTed Kremenek
216a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test29() {
2174f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
218f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  (void) ^{ (void) x; }; // expected-warning{{variable 'x' is uninitialized when captured by block}}
219a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek}
220a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek
221a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test30() {
222a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek  static int x; // no-warning
223a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek  (void) ^{ (void) x; };
224a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek}
225a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek
226a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test31() {
227a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek  __block int x; // no-warning
228a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek  (void) ^{ (void) x; };
229a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek}
230a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek
231a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekint test32_x;
232a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenekvoid test32() {
233a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek  (void) ^{ (void) test32_x; }; // no-warning
234a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek}
235a8c17a5babab35f2db26bf218e7571d1af4afedfTed Kremenek
236dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekvoid test_33() {
237dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek  int x; // no-warning
238dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek  (void) x;
239dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek}
240dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek
241dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenekint test_34() {
2424f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
243dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek  (void) x;
244f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  return x; // expected-warning{{variable 'x' is uninitialized when used here}}
245dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek}
246dd0f7942c5415ce146dcc02d57fc503c683f8625Ted Kremenek
24740900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek// Test that this case doesn't crash.
24840900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenekvoid test35(int x) {
24940900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek  __block int y = 0;
25040900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek  ^{ y = (x == 0); }();
25140900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek}
25240900ee8f3072d05456134b57c0fad85a6bb21a6Ted Kremenek
25396554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek// Test handling of indirect goto.
25496554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenekvoid test36()
25596554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek{
2564f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  void **pc; // expected-note{{initialize the variable 'pc' to silence this warning}}
25796554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek  void *dummy[] = { &&L1, &&L2 };
25896554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L1:
259d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth    goto *pc; // expected-warning{{variable 'pc' is uninitialized when used here}}
26096554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek L2:
26196554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek    goto *pc;
26296554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek}
26396554fd1aa7350498de8911fb6f303a9262e6ec0Ted Kremenek
2649fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test && nested in ||.
2659fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_a();
2669fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37_b();
2679fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test37()
2689fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{
2699fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek    int identifier;
2709fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek    if ((test37_a() && (identifier = 1)) ||
2719fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek        (test37_b() && (identifier = 2))) {
2729fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek        return identifier; // no-warning
2739fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek    }
2749fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek    return 0;
2759fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek}
2769fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek
2779fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek// Test merging of path-specific dataflow values (without asserting).
2789fcbceed43e5610fdff43defe533934733453ae2Ted Kremenekint test38(int r, int x, int y)
2799fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek{
2809fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek  int z;
2819fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek  return ((r < 0) || ((r == 0) && (x < y)));
2829fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek}
2839fcbceed43e5610fdff43defe533934733453ae2Ted Kremenek
284f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test39(int x) {
2854f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int y; // expected-note{{initialize the variable 'y' to silence this warning}}
286f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  int z = x + y; // expected-warning {{variable 'y' is uninitialized when used here}}
287f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  return z;
288f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
289f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
290f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
291f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test40(int x) {
2924f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int y; // expected-note{{initialize the variable 'y' to silence this warning}}
293f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  return x ? 1 : y; // expected-warning {{variable 'y' is uninitialized when used here}}
294f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
295f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
296f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test41(int x) {
2974f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int y; // expected-note{{initialize the variable 'y' to silence this warning}}
298bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  if (x) y = 1; // expected-warning{{variable 'y' is used uninitialized whenever 'if' condition is false}} \
299bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith                // expected-note{{remove the 'if' if its condition is always true}}
300bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return y; // expected-note{{uninitialized use occurs here}}
301f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
302f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
303f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test42() {
304f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  int a;
305f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  a = 30; // no-warning
306f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
307f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
308f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43_aux(int x);
309f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test43(int i) {
3104f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note{{initialize the variable 'x' to silence this warning}}
311f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  for (i = 0 ; i < 10; i++)
312d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth    test43_aux(x++); // expected-warning {{variable 'x' is uninitialized when used here}}
313f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
314f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
315f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test44(int i) {
316f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  int x = i;
3174f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int y; // expected-note{{initialize the variable 'y' to silence this warning}}
318f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  for (i = 0; i < 10; i++ ) {
319f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek    test43_aux(x++); // no-warning
320d837c0dc361a000b951593eaaa80c46b73d15b1dChandler Carruth    x += y; // expected-warning {{variable 'y' is uninitialized when used here}}
321f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  }
322f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
323f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
324f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekint test45(int j) {
325f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  int x = 1, y = x + 1;
326f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  if (y) // no-warning
327f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek    return x;
328f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  return y;
329f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
330f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
331f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test46()
332f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{
3334f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int i; // expected-note{{initialize the variable 'i' to silence this warning}}
334f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  int j = i ? : 1; // expected-warning {{variable 'i' is uninitialized when used here}}
335f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
336f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
337f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test47(int *i)
338f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{
339f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  return i ? : 0; // no-warning
340f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
341f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
342f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid *test49(int *i)
343f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{
344f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  int a;
345f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  return &a ? : i; // no-warning
346f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
347f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
348f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenekvoid test50()
349f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek{
350f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek  char c[1 ? : 2]; // no-warning
351f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek}
352f3f5379f6da7f8f141a53e2945871a5aa5431e02Ted Kremenek
353bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenekint test51(void)
354bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek{
355bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek    __block int a;
356bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek    ^(void) {
357bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek      a = 42;
358bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek    }();
359bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek    return a; // no-warning
360bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek}
361bc8b44c4ee7f9c4c3ad296369e72feda61bdb580Ted Kremenek
362e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek// FIXME: This is a false positive, but it tests logical operations in switch statements.
363e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenekint test52(int a, int b) {
3644f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x;  // expected-note {{initialize the variable 'x' to silence this warning}}
365e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek  switch (a || b) { // expected-warning {{switch condition has boolean value}}
366e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek    case 0:
367e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek      x = 1;
368e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek      break;
369e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek    case 1:
370e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek      x = 2;
371e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek      break;
372e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek  }
373e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek  return x; // expected-warning {{variable 'x' may be uninitialized when used here}}
374e6c28039c63d829577a2e37170e06a1dbdf89748Ted Kremenek}
3758435069798b5621615f9f65c471c7e7808316b20Chandler Carruth
376d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenekvoid test53() {
3774f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x; // expected-note {{initialize the variable 'x' to silence this warning}}
37862d126e942f9f420c6f398d32deb914d413226a3Ted Kremenek  int y = (x);  // expected-warning {{variable 'x' is uninitialized when used here}}
379d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenek}
380d626ec404fd0f27244363200f1a85a7db219cd11Ted Kremenek
3818435069798b5621615f9f65c471c7e7808316b20Chandler Carruth// This CFG caused the uninitialized values warning to inf-loop.
3828435069798b5621615f9f65c471c7e7808316b20Chandler Carruthextern int PR10379_g();
3838435069798b5621615f9f65c471c7e7808316b20Chandler Carruthvoid PR10379_f(int *len) {
3844f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int new_len; // expected-note{{initialize the variable 'new_len' to silence this warning}}
3858435069798b5621615f9f65c471c7e7808316b20Chandler Carruth  for (int i = 0; i < 42 && PR10379_g() == 0; i++) {
3868435069798b5621615f9f65c471c7e7808316b20Chandler Carruth    if (PR10379_g() == 1)
3878435069798b5621615f9f65c471c7e7808316b20Chandler Carruth      continue;
3888435069798b5621615f9f65c471c7e7808316b20Chandler Carruth    if (PR10379_g() == 2)
3898435069798b5621615f9f65c471c7e7808316b20Chandler Carruth      PR10379_f(&new_len);
3908435069798b5621615f9f65c471c7e7808316b20Chandler Carruth    else if (PR10379_g() == 3)
3918435069798b5621615f9f65c471c7e7808316b20Chandler Carruth      PR10379_f(&new_len);
3928435069798b5621615f9f65c471c7e7808316b20Chandler Carruth    *len += new_len; // expected-warning {{variable 'new_len' may be uninitialized when used here}}
3938435069798b5621615f9f65c471c7e7808316b20Chandler Carruth  }
3948435069798b5621615f9f65c471c7e7808316b20Chandler Carruth}
395540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek
396540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek// Test that sizeof(VLA) doesn't trigger a warning.
397540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenekvoid test_vla_sizeof(int x) {
398540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek  double (*memory)[2][x] = malloc(sizeof(*memory)); // no-warning
399540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek}
400540dda6f2e4982b3eab0300c804345f5b6104c11Ted Kremenek
4016f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek// Test absurd case of deadcode + use of blocks.  This previously was a false positive
4026f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek// due to an analysis bug.
4036f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenekint test_block_and_dead_code() {
4046f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek  __block int x;
4056f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek  ^{ x = 1; }();
4066f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek  if (0)
4076f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek    return x;
4086f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek  return x; // no-warning
4096f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek}
4106f27542da8843b5c1c579b86e342385bcc43d5f0Ted Kremenek
411c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek// This previously triggered an infinite loop in the analysis.
412c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenekvoid PR11069(int a, int b) {
413c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek  unsigned long flags;
414c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek  for (;;) {
415c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek    if (a && !b)
416c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek      break;
417c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek  }
418c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek  for (;;) {
419c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek    // This does not trigger a warning because it isn't a real use.
420c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek    (void)(flags); // no-warning
421c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek  }
422c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek}
423c5f740ecdbc21d5ba08f97b89cc05c9d4f230fdaTed Kremenek
424aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek// Test uninitialized value used in loop condition.
425aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenekvoid rdar9432305(float *P) {
426aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek  int i; // expected-note {{initialize the variable 'i' to silence this warning}}
427aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek  for (; i < 10000; ++i) // expected-warning {{variable 'i' is uninitialized when used here}}
428aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek    P[i] = 0.0f;
429aa2176b4cd1115adb29f29eca3e6e2fc6d543170Ted Kremenek}
4307b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu
4317b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu// Test that fixits are not emitted inside macros.
4327b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu#define UNINIT(T, x, y) T x; T y = x;
4337b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu#define ASSIGN(T, x, y) T y = x;
4347b0a3e378c441cec60f929d13bd48846c267a008Richard Trieuvoid test54() {
4357b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu  UNINIT(int, a, b);  // expected-warning {{variable 'a' is uninitialized when used here}} \
4367b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu                      // expected-note {{variable 'a' is declared here}}
4377b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu  int c;  // expected-note {{initialize the variable 'c' to silence this warning}}
4387b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu  ASSIGN(int, c, d);  // expected-warning {{variable 'c' is uninitialized when used here}}
4397b0a3e378c441cec60f929d13bd48846c267a008Richard Trieu}
4408f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith
4417e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenberger// Taking the address is fine
4427e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenbergerstruct { struct { void *p; } a; } test55 = { { &test55.a }}; // no-warning
4437e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenbergerstruct { struct { void *p; } a; } test56 = { { &(test56.a) }}; // no-warning
4447e58ad5a6756f31b48a0d54d5f5c367328150a46Joerg Sonnenberger
4458f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smithvoid uninit_in_loop() {
4468f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  int produce(void);
4478f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  void consume(int);
4488f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  for (int n = 0; n < 100; ++n) {
4498f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    int k; // expected-note {{initialize}}
4508f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    consume(k); // expected-warning {{variable 'k' is uninitialized}}
4518f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    k = produce();
4528f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  }
4538f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith}
4548f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith
4558f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smithvoid uninit_in_loop_goto() {
4568f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  int produce(void);
4578f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  void consume(int);
4588f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  for (int n = 0; n < 100; ++n) {
4598f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    goto skip_decl;
4608f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    int k; // expected-note {{initialize}}
4618f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smithskip_decl:
4628f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    // FIXME: This should produce the 'is uninitialized' diagnostic, but we
4638f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    // don't have enough information in the CFG to easily tell that the
4648f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    // variable's scope has been left and re-entered.
4658f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    consume(k); // expected-warning {{variable 'k' may be uninitialized}}
4668f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith    k = produce();
4678f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith  }
4688f40dcc4ddbe4ef796dd1bf0696ac66d4e40e99aRichard Smith}
469a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith
470a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithtypedef char jmp_buf[256];
471a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithextern int setjmp(jmp_buf env); // implicitly returns_twice
472a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith
473a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithvoid do_stuff_and_longjmp(jmp_buf env, int *result) __attribute__((noreturn));
474a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith
475a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smithint returns_twice() {
476a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith  int a; // expected-note {{initialize}}
477a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith  if (!a) { // expected-warning {{variable 'a' is uninitialized}}
478a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith    jmp_buf env;
479a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith    int b;
480a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith    if (setjmp(env) == 0) {
481a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith      do_stuff_and_longjmp(env, &b);
482a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith    } else {
483a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith      a = b; // no warning
484a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith    }
485a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith  }
486a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith  return a;
487a9e8b9e3e90fcfe10a04624a89c39b63c32614d1Richard Smith}
4889532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith
4899532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smithint compound_assign(int *arr, int n) {
4909532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith  int sum; // expected-note {{initialize}}
4919532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith  for (int i = 0; i < n; ++i)
4926cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith    sum += arr[i]; // expected-warning {{variable 'sum' is uninitialized}}
4936cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  return sum / n;
4949532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith}
4959532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith
4966cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smithint compound_assign_2() {
4976cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  int x; // expected-note {{initialize}}
4986cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  return x += 1; // expected-warning {{variable 'x' is uninitialized}}
4996cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith}
5006cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith
5016cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smithint compound_assign_3() {
5026cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  int x; // expected-note {{initialize}}
5036cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  x *= 0; // expected-warning {{variable 'x' is uninitialized}}
5046cfa78f6bd4e7d5e23366a0907f8f8792366bc4cRichard Smith  return x;
5059532e0d89ca2afa556f032aa9377f6ec1d3eaa3eRichard Smith}
50656df4a9e0461d4dfb2a740cb6b0ce531d6c82538Richard Smith
50756df4a9e0461d4dfb2a740cb6b0ce531d6c82538Richard Smithint self_init_in_cond(int *p) {
50856df4a9e0461d4dfb2a740cb6b0ce531d6c82538Richard Smith  int n = ((p && (0 || 1)) && (n = *p)) ? n : -1; // ok
50956df4a9e0461d4dfb2a740cb6b0ce531d6c82538Richard Smith  return n;
51056df4a9e0461d4dfb2a740cb6b0ce531d6c82538Richard Smith}
51144ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek
51244ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenekvoid test_analyzer_noreturn_aux() __attribute__((analyzer_noreturn));
51344ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek
51444ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenekvoid test_analyzer_noreturn(int y) {
51544ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  int x; // expected-note {{initialize the variable 'x' to silence this warning}}
51644ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  if (y) {
51744ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek    test_analyzer_noreturn_aux();
51844ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek	++x; // no-warning
51944ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  }
52044ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  else {
52144ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek	++x; // expected-warning {{variable 'x' is uninitialized when used here}}
52244ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  }
52344ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek}
52444ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenekvoid test_analyzer_noreturn_2(int y) {
52544ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  int x;
52644ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  if (y) {
52744ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek    test_analyzer_noreturn_aux();
52844ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  }
52944ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  else {
53044ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek	x = 1;
53144ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  }
53244ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek  ++x; // no-warning
53344ca53f34deb5efe9fc6f246781f66f1ed83eabcTed Kremenek}
534