110 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment,optin.taint -verify -std=c99 -Dbool=_Bool %s2// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment,optin.taint -verify -x c++ %s3 4// Test C++'s bool and C's _Bool.5// FIXME: We stopped warning on these when SValBuilder got smarter about6// casts to bool. Arguably, however, these conversions are okay; the result7// is always 'true' or 'false'.8 9void test_stdbool_initialization(int y) {10 bool constant = 2; // no-warning11 if (y < 0) {12 bool x = y; // no-warning13 return;14 }15 if (y > 1) {16 bool x = y; // no-warning17 return;18 }19 bool x = y; // no-warning20}21 22void test_stdbool_assignment(int y) {23 bool x = 0; // no-warning24 if (y < 0) {25 x = y; // no-warning26 return;27 }28 if (y > 1) {29 x = y; // no-warning30 return;31 }32 x = y; // no-warning33}34 35// Test Objective-C's BOOL36 37typedef signed char BOOL;38 39void 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 BOOL x = y; // no-warning47 return;48 }49 if (y >= 127 && y < 150) {50 BOOL x = y; // expected-warning{{Assignment of a non-Boolean value}}51 return;52 }53 if (y > 1) {54 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}55 return;56 }57 BOOL x = y; // no-warning58}59 60void test_BOOL_assignment(int y) {61 BOOL x = 0; // no-warning62 if (y < 0) {63 x = y; // expected-warning {{Assignment of a non-Boolean value}}64 return;65 }66 if (y > 1) {67 x = y; // expected-warning {{Assignment of a non-Boolean value}}68 return;69 }70 x = y; // no-warning71}72 73 74// Test MacTypes.h's Boolean75 76typedef unsigned char Boolean;77 78void test_Boolean_initialization(int y) {79 Boolean constant = 2; // expected-warning {{Assignment of a non-Boolean value}}80 if (y < 0) {81 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}82 return;83 }84 if (y > 1) {85 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}86 return;87 }88 Boolean x = y; // no-warning89}90 91void test_Boolean_assignment(int y) {92 Boolean x = 0; // no-warning93 if (y < 0) {94 x = y; // expected-warning {{Assignment of a non-Boolean value}}95 return;96 }97 if (y > 1) {98 x = y; // expected-warning {{Assignment of a non-Boolean value}}99 return;100 }101 x = y; // no-warning102}103 104int scanf(const char *format, ...);105void test_tainted_Boolean() {106 int n;107 scanf("%d", &n);108 Boolean copy = n; // expected-warning {{Might assign a tainted non-Boolean value}}109}110