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