Clang Project

clang_source_code/test/Analysis/bool-assignment.c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -std=c99 -Dbool=_Bool %s
2// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -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
9void 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
22void 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
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#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
64void 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
80typedef unsigned char Boolean;
81
82void 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
95void 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