1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment,optin.taint -verify -std=c99 -Dbool=_Bool %s 2 // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment,optin.taint -verify -x c++ %s 3 4 // Test C++'s bool and C's _Bool. 5 // FIXME: We stopped warning on these when SValBuilder got smarter about 6 // casts to bool. Arguably, however, these conversions are okay; the result 7 // is always 'true' or 'false'. 8 9 void test_stdbool_initialization(int y) { 10 bool constant = 2; // no-warning 11 if (y < 0) { 12 bool x = y; // no-warning 13 return; 14 } 15 if (y > 1) { 16 bool x = y; // no-warning 17 return; 18 } 19 bool x = y; // no-warning 20 } 21 22 void test_stdbool_assignment(int y) { 23 bool x = 0; // no-warning 24 if (y < 0) { 25 x = y; // no-warning 26 return; 27 } 28 if (y > 1) { 29 x = y; // no-warning 30 return; 31 } 32 x = y; // no-warning 33 } 34 35 // Test Objective-C's BOOL 36 37 typedef signed char BOOL; 38 39 void test_BOOL_initialization(int y) { 40 BOOL constant = 2; // expected-warning {{Assignment of a non-Boolean value}} 41 if (y < 0) { 42 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} 43 return; 44 } 45 if (y > 200 && y < 250) { 46 #ifdef ANALYZER_CM_Z3 47 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} 48 #else 49 BOOL x = y; // no-warning 50 #endif 51 return; 52 } 53 if (y >= 127 && y < 150) { 54 BOOL x = y; // expected-warning{{Assignment of a non-Boolean value}} 55 return; 56 } 57 if (y > 1) { 58 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} 59 return; 60 } 61 BOOL x = y; // no-warning 62 } 63 64 void test_BOOL_assignment(int y) { 65 BOOL x = 0; // no-warning 66 if (y < 0) { 67 x = y; // expected-warning {{Assignment of a non-Boolean value}} 68 return; 69 } 70 if (y > 1) { 71 x = y; // expected-warning {{Assignment of a non-Boolean value}} 72 return; 73 } 74 x = y; // no-warning 75 } 76 77 78 // Test MacTypes.h's Boolean 79 80 typedef unsigned char Boolean; 81 82 void test_Boolean_initialization(int y) { 83 Boolean constant = 2; // expected-warning {{Assignment of a non-Boolean value}} 84 if (y < 0) { 85 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}} 86 return; 87 } 88 if (y > 1) { 89 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}} 90 return; 91 } 92 Boolean x = y; // no-warning 93 } 94 95 void test_Boolean_assignment(int y) { 96 Boolean x = 0; // no-warning 97 if (y < 0) { 98 x = y; // expected-warning {{Assignment of a non-Boolean value}} 99 return; 100 } 101 if (y > 1) { 102 x = y; // expected-warning {{Assignment of a non-Boolean value}} 103 return; 104 } 105 x = y; // no-warning 106 } 107 108 int scanf(const char *format, ...); 109 void test_tainted_Boolean() { 110 int n; 111 scanf("%d", &n); 112 Boolean copy = n; // expected-warning {{Might assign a tainted non-Boolean value}} 113 } 114