1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-checker=core,deadcode.DeadStores,alpha.deadcode.UnreachableCode -verify -analyzer-opt-analyze-nested-blocks -Wno-unused-value %s
2c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
3c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Careextern void foo(int a);
4c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
57bce3a122296eba0e74f401c188e55c71935132fTom Care// The first few tests are non-path specific - we should be able to find them
67bce3a122296eba0e74f401c188e55c71935132fTom Care
7c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Carevoid test(unsigned a) {
8c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  switch (a) {
9c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    a += 5; // expected-warning{{never executed}}
10c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  case 2:
11c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    a *= 10;
12c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  case 3:
13c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    a %= 2;
14c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  }
15c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  foo(a);
16c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care}
17c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
18c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Carevoid test2(unsigned a) {
19c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care help:
20c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  if (a > 0)
21c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    return;
22c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  if (a == 0)
23c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    return;
24c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  foo(a); // expected-warning{{never executed}}
25c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  goto help;
26c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care}
27c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
287bce3a122296eba0e74f401c188e55c71935132fTom Carevoid test3(unsigned a) {
297bce3a122296eba0e74f401c188e55c71935132fTom Care  while(1);
307bce3a122296eba0e74f401c188e55c71935132fTom Care  if (a > 5) { // expected-warning{{never executed}}
317bce3a122296eba0e74f401c188e55c71935132fTom Care    return;
327bce3a122296eba0e74f401c188e55c71935132fTom Care  }
337bce3a122296eba0e74f401c188e55c71935132fTom Care}
347bce3a122296eba0e74f401c188e55c71935132fTom Care
357bce3a122296eba0e74f401c188e55c71935132fTom Care// These next tests are path-sensitive
367bce3a122296eba0e74f401c188e55c71935132fTom Care
377bce3a122296eba0e74f401c188e55c71935132fTom Carevoid test4() {
38c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  int a = 5;
39c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
40c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  while (a > 1)
41c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    a -= 2;
42c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
43c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  if (a > 1) {
44c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    a = a + 56; // expected-warning{{never executed}}
45c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  }
46c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
47c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  foo(a);
48c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care}
49c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
50c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Careextern void bar(char c);
51c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
52c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Carevoid test5(const char *c) {
53c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  foo(c[0]);
54c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
55c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  if (!c) {
56c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care    bar(1); // expected-warning{{never executed}}
57c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care  }
58c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care}
59c4b5bd89e1ef611c7a31b767763030acc45274c8Tom Care
607bce3a122296eba0e74f401c188e55c71935132fTom Care// These next tests are false positives and should not generate warnings
617bce3a122296eba0e74f401c188e55c71935132fTom Care
625e04bdde8e74d991feffe9cf95d731f7e473dbb7Jordy Rosevoid test6(const char *c) {
635e04bdde8e74d991feffe9cf95d731f7e473dbb7Jordy Rose  if (c) return;
645e04bdde8e74d991feffe9cf95d731f7e473dbb7Jordy Rose  if (!c) return;
655e04bdde8e74d991feffe9cf95d731f7e473dbb7Jordy Rose  __builtin_unreachable(); // no-warning
665e04bdde8e74d991feffe9cf95d731f7e473dbb7Jordy Rose}
675e04bdde8e74d991feffe9cf95d731f7e473dbb7Jordy Rose
687bce3a122296eba0e74f401c188e55c71935132fTom Care// Compile-time constant false positives
697bce3a122296eba0e74f401c188e55c71935132fTom Care#define CONSTANT 0
707bce3a122296eba0e74f401c188e55c71935132fTom Careenum test_enum { Off, On };
717bce3a122296eba0e74f401c188e55c71935132fTom Carevoid test7() {
727bce3a122296eba0e74f401c188e55c71935132fTom Care  if (CONSTANT)
737bce3a122296eba0e74f401c188e55c71935132fTom Care    return; // no-warning
747bce3a122296eba0e74f401c188e55c71935132fTom Care
757bce3a122296eba0e74f401c188e55c71935132fTom Care  if (sizeof(int))
767bce3a122296eba0e74f401c188e55c71935132fTom Care    return; // no-warning
777bce3a122296eba0e74f401c188e55c71935132fTom Care
787bce3a122296eba0e74f401c188e55c71935132fTom Care  if (Off)
797bce3a122296eba0e74f401c188e55c71935132fTom Care    return; // no-warning
807bce3a122296eba0e74f401c188e55c71935132fTom Care}
817bce3a122296eba0e74f401c188e55c71935132fTom Care
827bce3a122296eba0e74f401c188e55c71935132fTom Carevoid test8() {
837bce3a122296eba0e74f401c188e55c71935132fTom Care  static unsigned a = 0;
847bce3a122296eba0e74f401c188e55c71935132fTom Care
857bce3a122296eba0e74f401c188e55c71935132fTom Care  if (a)
867bce3a122296eba0e74f401c188e55c71935132fTom Care    a = 123; // no-warning
877bce3a122296eba0e74f401c188e55c71935132fTom Care
887bce3a122296eba0e74f401c188e55c71935132fTom Care  a = 5;
897bce3a122296eba0e74f401c188e55c71935132fTom Care}
907bce3a122296eba0e74f401c188e55c71935132fTom Care
910600918d1418c2eac2c96491637946206009c4deTom Care// Check for bugs where multiple statements are reported
920600918d1418c2eac2c96491637946206009c4deTom Carevoid test9(unsigned a) {
930600918d1418c2eac2c96491637946206009c4deTom Care  switch (a) {
940600918d1418c2eac2c96491637946206009c4deTom Care    if (a) // expected-warning{{never executed}}
950600918d1418c2eac2c96491637946206009c4deTom Care      foo(a + 5); // no-warning
964895b9cf34b26b20e674a88fa8104489e1d06812Tom Care    else          // no-warning
974895b9cf34b26b20e674a88fa8104489e1d06812Tom Care      foo(a);     // no-warning
980600918d1418c2eac2c96491637946206009c4deTom Care    case 1:
990600918d1418c2eac2c96491637946206009c4deTom Care    case 2:
1000600918d1418c2eac2c96491637946206009c4deTom Care      break;
1010600918d1418c2eac2c96491637946206009c4deTom Care    default:
1020600918d1418c2eac2c96491637946206009c4deTom Care      break;
1030600918d1418c2eac2c96491637946206009c4deTom Care  }
1040600918d1418c2eac2c96491637946206009c4deTom Care}
1054895b9cf34b26b20e674a88fa8104489e1d06812Tom Care
1064895b9cf34b26b20e674a88fa8104489e1d06812Tom Care// Tests from flow-sensitive version
1074895b9cf34b26b20e674a88fa8104489e1d06812Tom Carevoid test10() {
1084895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  goto c;
1094895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  d:
1104895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  goto e; // expected-warning {{never executed}}
1114895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  c: ;
1124895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  int i;
1134895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  return;
1144895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  goto b; // expected-warning {{never executed}}
1154895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  goto a; // expected-warning {{never executed}}
1164895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  b:
117848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  i = 1; // no-warning
1184895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  a:
119848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  i = 2;  // no-warning
1204895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  goto f;
1214895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  e:
1224895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  goto d;
1234895b9cf34b26b20e674a88fa8104489e1d06812Tom Care  f: ;
1244895b9cf34b26b20e674a88fa8104489e1d06812Tom Care}
12528cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek
12628cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek// test11: we can actually end up in the default case, even if it is not
12728cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek// obvious: there might be something wrong with the given argument.
12828cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenekenum foobar { FOO, BAR };
12928cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenekextern void error();
13028cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenekvoid test11(enum foobar fb) {
13128cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek  switch (fb) {
13228cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek    case FOO:
13328cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek      break;
13428cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek    case BAR:
13528cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek      break;
13628cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek    default:
13728cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek      error(); // no-warning
13828cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek      return;
13928cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek      error(); // expected-warning {{never executed}}
14028cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek  }
14128cd22d7c2d2458575ce9cc19dfe63c6321010ceTed Kremenek}
14251718e3555404192040a5fad715367bc4cef22fbJordan Rose
14351718e3555404192040a5fad715367bc4cef22fbJordan Rosevoid inlined(int condition) {
14451718e3555404192040a5fad715367bc4cef22fbJordan Rose  if (condition) {
14551718e3555404192040a5fad715367bc4cef22fbJordan Rose    foo(5); // no-warning
14651718e3555404192040a5fad715367bc4cef22fbJordan Rose  } else {
14751718e3555404192040a5fad715367bc4cef22fbJordan Rose    foo(6);
14851718e3555404192040a5fad715367bc4cef22fbJordan Rose  }
14951718e3555404192040a5fad715367bc4cef22fbJordan Rose}
15051718e3555404192040a5fad715367bc4cef22fbJordan Rose
15151718e3555404192040a5fad715367bc4cef22fbJordan Rosevoid testInlined() {
15251718e3555404192040a5fad715367bc4cef22fbJordan Rose  extern int coin();
15351718e3555404192040a5fad715367bc4cef22fbJordan Rose  int cond = coin();
15451718e3555404192040a5fad715367bc4cef22fbJordan Rose  if (!cond) {
15551718e3555404192040a5fad715367bc4cef22fbJordan Rose    inlined(0);
15651718e3555404192040a5fad715367bc4cef22fbJordan Rose    if (cond) {
15751718e3555404192040a5fad715367bc4cef22fbJordan Rose      foo(5); // expected-warning {{never executed}}
15851718e3555404192040a5fad715367bc4cef22fbJordan Rose    }
15951718e3555404192040a5fad715367bc4cef22fbJordan Rose  }
16051718e3555404192040a5fad715367bc4cef22fbJordan Rose}
161