brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · f0942cc Raw
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