[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / Analysis / test-after-div-zero.c
blobea1fd786d1543fca54d6370c7ddd13e8ea1be7b6
1 // RUN: %clang_analyze_cc1 -std=c99 -Dbool=_Bool -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s
2 // RUN: %clang_analyze_cc1 -x c++ -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s
4 int var;
6 void err_eq(int x) {
7 var = 77 / x; // expected-note {{Division with compared value made here}}
8 if (x == 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
9 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
11 void err_eq2(int x) {
12 var = 77 / x; // expected-note {{Division with compared value made here}}
13 if (0 == x) { } // expected-warning {{Value being compared against zero has already been used for division}}
14 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
16 void err_ne(int x) {
17 var = 77 / x; // expected-note {{Division with compared value made here}}
18 if (x != 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
19 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
21 void err_ge(int x) {
22 var = 77 / x; // expected-note {{Division with compared value made here}}
23 if (x >= 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
24 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
26 void err_le(int x) {
27 var = 77 / x; // expected-note {{Division with compared value made here}}
28 if (x <= 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
29 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
31 void err_yes(int x) {
32 var = 77 / x; // expected-note {{Division with compared value made here}}
33 if (x) {} // expected-warning {{Value being compared against zero has already been used for division}}
34 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
35 void err_not(int x) {
36 var = 77 / x; // expected-note {{Division with compared value made here}}
37 if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
38 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
40 void err_pnot(int x) {
41 int *y = &x;
42 var = 77 / *y; // expected-note {{Division with compared value made here}}
43 if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
44 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
46 void err_pnot2(int x) {
47 int *y = &x;
48 var = 77 / x; // expected-note {{Division with compared value made here}}
49 if (!*y) {} // expected-warning {{Value being compared against zero has already been used for division}}
50 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
52 void err_ppnot(int x) {
53 int *y = &x;
54 int **z = &y;
55 var = 77 / **z; // expected-note {{Division with compared value made here}}
56 if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
57 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
59 void err_orig_checker(int x) {
60 if (x != 0) // expected-note {{Assuming 'x' is equal to 0}} expected-note {{Taking false branch}}
61 return;
62 var = 77 / x; // expected-warning {{Division by zero}} expected-note {{Division by zero}}
63 if (!x) {} // no-warning
66 void ok_other(int x, int y) {
67 var = 77 / y;
68 if (x == 0) {
72 void ok_assign(int x) {
73 var = 77 / x;
74 x = var / 77; // <- assignment => don't warn
75 if (x == 0) {
79 void ok_assign2(int x) {
80 var = 77 / x;
81 x = var / 77; // <- assignment => don't warn
82 if (0 == x) {
86 void ok_dec(int x) {
87 var = 77 / x;
88 x--; // <- assignment => don't warn
89 if (x == 0) {
93 void ok_inc(int x) {
94 var = 77 / x;
95 x++; // <- assignment => don't warn
96 if (x == 0) {
100 void do_something_ptr(int *x);
101 void ok_callfunc_ptr(int x) {
102 var = 77 / x;
103 do_something_ptr(&x); // <- pass address of x to function => don't warn
104 if (x == 0) {
108 void do_something(int x);
109 void nok_callfunc(int x) {
110 var = 77 / x; // expected-note {{Division with compared value made here}}
111 do_something(x);
112 if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
113 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
115 void ok_if(int x) {
116 if (x > 3)
117 var = 77 / x;
118 if (x == 0) {
122 void ok_if2(int x) {
123 if (x < 3)
124 var = 77 / x;
125 if (x == 0) {
126 } // TODO warn here
129 void ok_pif(int x) {
130 int *y = &x;
131 if (x < 3)
132 var = 77 / *y;
133 if (x == 0) {
134 } // TODO warn here
137 int getValue(bool *isPositive);
138 void use(int a);
139 void foo(void) {
140 bool isPositive;
141 int x = getValue(&isPositive);
142 if (isPositive) {
143 use(5 / x);
146 if (x == 0) {
150 int getValue2(void);
151 void foo2(void) {
152 int x = getValue2();
153 int y = x;
155 use(5 / x); // expected-note {{Division with compared value made here}}
156 if (y == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
157 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
159 void ok_while(int x) {
160 int n = 100 / x;
161 while (x != 0) { // <- do not warn
162 x--;
166 void err_not2(int x, int y) {
167 int v;
168 var = 77 / x;
170 if (y)
171 v = 0;
173 if (!x) {
174 } // TODO warn here
177 inline void inline_func(int x) {
178 var = 77 / x; // expected-note {{Division with compared value made here}}
179 if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
180 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
182 void err_inline(int x) {
183 var = 77 / x;
184 inline_func(x); // expected-note {{Calling 'inline_func'}}
185 if (x == 0) {
189 inline void inline_func2(int x) {}
191 void err_inline2(int x) {
192 var = 77 / x; // expected-note {{Division with compared value made here}}
193 inline_func2(x);
194 if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
195 } // expected-note@-1 {{Value being compared against zero has already been used for division}}
197 inline void inline_func3(int x) {
198 var = 77 / x;
200 void ok_inline(int x) {
201 var = 77 / x; // expected-note {{Division with compared value made here}}
202 inline_func3(x);
203 if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
204 } // expected-note@-1 {{Value being compared against zero has already been used for division}}