xref: /aosp_15_r20/external/clang/test/Analysis/test-after-div-zero.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c99 -Dbool=_Bool -analyze -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -x c++ -analyze -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify %s
3*67e74705SXin Li 
4*67e74705SXin Li int var;
5*67e74705SXin Li 
err_eq(int x)6*67e74705SXin Li void err_eq(int x) {
7*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
8*67e74705SXin Li   if (x == 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
9*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
10*67e74705SXin Li 
err_eq2(int x)11*67e74705SXin Li void err_eq2(int x) {
12*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
13*67e74705SXin Li   if (0 == x) { } // expected-warning {{Value being compared against zero has already been used for division}}
14*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
15*67e74705SXin Li 
err_ne(int x)16*67e74705SXin Li void err_ne(int x) {
17*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
18*67e74705SXin Li   if (x != 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
19*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
20*67e74705SXin Li 
err_ge(int x)21*67e74705SXin Li void err_ge(int x) {
22*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
23*67e74705SXin Li   if (x >= 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
24*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
25*67e74705SXin Li 
err_le(int x)26*67e74705SXin Li void err_le(int x) {
27*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
28*67e74705SXin Li   if (x <= 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
29*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
30*67e74705SXin Li 
err_yes(int x)31*67e74705SXin Li void err_yes(int x) {
32*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
33*67e74705SXin Li   if (x) {} // expected-warning {{Value being compared against zero has already been used for division}}
34*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
err_not(int x)35*67e74705SXin Li void err_not(int x) {
36*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
37*67e74705SXin Li   if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
38*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
39*67e74705SXin Li 
err_pnot(int x)40*67e74705SXin Li void err_pnot(int x) {
41*67e74705SXin Li   int *y = &x;
42*67e74705SXin Li   var = 77 / *y; // expected-note {{Division with compared value made here}}
43*67e74705SXin Li   if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
44*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
45*67e74705SXin Li 
err_pnot2(int x)46*67e74705SXin Li void err_pnot2(int x) {
47*67e74705SXin Li   int *y = &x;
48*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
49*67e74705SXin Li   if (!*y) {} // expected-warning {{Value being compared against zero has already been used for division}}
50*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
51*67e74705SXin Li 
err_ppnot(int x)52*67e74705SXin Li void err_ppnot(int x) {
53*67e74705SXin Li   int *y = &x;
54*67e74705SXin Li   int **z = &y;
55*67e74705SXin Li   var = 77 / **z; // expected-note {{Division with compared value made here}}
56*67e74705SXin Li   if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
57*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
58*67e74705SXin Li 
err_orig_checker(int x)59*67e74705SXin Li void err_orig_checker(int x) {
60*67e74705SXin Li   if (x != 0) // expected-note {{Assuming 'x' is equal to 0}} expected-note {{Taking false branch}}
61*67e74705SXin Li     return;
62*67e74705SXin Li   var = 77 / x; // expected-warning {{Division by zero}} expected-note {{Division by zero}}
63*67e74705SXin Li   if (!x) {} // no-warning
64*67e74705SXin Li }
65*67e74705SXin Li 
ok_other(int x,int y)66*67e74705SXin Li void ok_other(int x, int y) {
67*67e74705SXin Li   var = 77 / y;
68*67e74705SXin Li   if (x == 0) {
69*67e74705SXin Li   }
70*67e74705SXin Li }
71*67e74705SXin Li 
ok_assign(int x)72*67e74705SXin Li void ok_assign(int x) {
73*67e74705SXin Li   var = 77 / x;
74*67e74705SXin Li   x = var / 77; // <- assignment => don't warn
75*67e74705SXin Li   if (x == 0) {
76*67e74705SXin Li   }
77*67e74705SXin Li }
78*67e74705SXin Li 
ok_assign2(int x)79*67e74705SXin Li void ok_assign2(int x) {
80*67e74705SXin Li   var = 77 / x;
81*67e74705SXin Li   x = var / 77; // <- assignment => don't warn
82*67e74705SXin Li   if (0 == x) {
83*67e74705SXin Li   }
84*67e74705SXin Li }
85*67e74705SXin Li 
ok_dec(int x)86*67e74705SXin Li void ok_dec(int x) {
87*67e74705SXin Li   var = 77 / x;
88*67e74705SXin Li   x--; // <- assignment => don't warn
89*67e74705SXin Li   if (x == 0) {
90*67e74705SXin Li   }
91*67e74705SXin Li }
92*67e74705SXin Li 
ok_inc(int x)93*67e74705SXin Li void ok_inc(int x) {
94*67e74705SXin Li   var = 77 / x;
95*67e74705SXin Li   x++; // <- assignment => don't warn
96*67e74705SXin Li   if (x == 0) {
97*67e74705SXin Li   }
98*67e74705SXin Li }
99*67e74705SXin Li 
100*67e74705SXin Li void do_something_ptr(int *x);
ok_callfunc_ptr(int x)101*67e74705SXin Li void ok_callfunc_ptr(int x) {
102*67e74705SXin Li   var = 77 / x;
103*67e74705SXin Li   do_something_ptr(&x); // <- pass address of x to function => don't warn
104*67e74705SXin Li   if (x == 0) {
105*67e74705SXin Li   }
106*67e74705SXin Li }
107*67e74705SXin Li 
108*67e74705SXin Li void do_something(int x);
nok_callfunc(int x)109*67e74705SXin Li void nok_callfunc(int x) {
110*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
111*67e74705SXin Li   do_something(x);
112*67e74705SXin Li   if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
113*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
114*67e74705SXin Li 
ok_if(int x)115*67e74705SXin Li void ok_if(int x) {
116*67e74705SXin Li   if (x > 3)
117*67e74705SXin Li     var = 77 / x;
118*67e74705SXin Li   if (x == 0) {
119*67e74705SXin Li   }
120*67e74705SXin Li }
121*67e74705SXin Li 
ok_if2(int x)122*67e74705SXin Li void ok_if2(int x) {
123*67e74705SXin Li   if (x < 3)
124*67e74705SXin Li     var = 77 / x;
125*67e74705SXin Li   if (x == 0) {
126*67e74705SXin Li   } // TODO warn here
127*67e74705SXin Li }
128*67e74705SXin Li 
ok_pif(int x)129*67e74705SXin Li void ok_pif(int x) {
130*67e74705SXin Li   int *y = &x;
131*67e74705SXin Li   if (x < 3)
132*67e74705SXin Li     var = 77 / *y;
133*67e74705SXin Li   if (x == 0) {
134*67e74705SXin Li   } // TODO warn here
135*67e74705SXin Li }
136*67e74705SXin Li 
137*67e74705SXin Li int getValue(bool *isPositive);
138*67e74705SXin Li void use(int a);
foo()139*67e74705SXin Li void foo() {
140*67e74705SXin Li   bool isPositive;
141*67e74705SXin Li   int x = getValue(&isPositive);
142*67e74705SXin Li   if (isPositive) {
143*67e74705SXin Li     use(5 / x);
144*67e74705SXin Li   }
145*67e74705SXin Li 
146*67e74705SXin Li   if (x == 0) {
147*67e74705SXin Li   }
148*67e74705SXin Li }
149*67e74705SXin Li 
150*67e74705SXin Li int getValue2();
foo2()151*67e74705SXin Li void foo2() {
152*67e74705SXin Li   int x = getValue2();
153*67e74705SXin Li   int y = x;
154*67e74705SXin Li 
155*67e74705SXin Li   use(5 / x); // expected-note {{Division with compared value made here}}
156*67e74705SXin Li   if (y == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
157*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
158*67e74705SXin Li 
ok_while(int x)159*67e74705SXin Li void ok_while(int x) {
160*67e74705SXin Li   int n = 100 / x;
161*67e74705SXin Li   while (x != 0) { // <- do not warn
162*67e74705SXin Li     x--;
163*67e74705SXin Li   }
164*67e74705SXin Li }
165*67e74705SXin Li 
err_not2(int x,int y)166*67e74705SXin Li void err_not2(int x, int y) {
167*67e74705SXin Li   int v;
168*67e74705SXin Li   var = 77 / x;
169*67e74705SXin Li 
170*67e74705SXin Li   if (y)
171*67e74705SXin Li     v = 0;
172*67e74705SXin Li 
173*67e74705SXin Li   if (!x) {
174*67e74705SXin Li   } // TODO warn here
175*67e74705SXin Li }
176*67e74705SXin Li 
inline_func(int x)177*67e74705SXin Li inline void inline_func(int x) {
178*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
179*67e74705SXin Li   if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
180*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
181*67e74705SXin Li 
err_inline(int x)182*67e74705SXin Li void err_inline(int x) {
183*67e74705SXin Li   var = 77 / x;
184*67e74705SXin Li   inline_func(x); // expected-note {{Calling 'inline_func'}}
185*67e74705SXin Li   if (x == 0) {
186*67e74705SXin Li   }
187*67e74705SXin Li }
188*67e74705SXin Li 
inline_func2(int x)189*67e74705SXin Li inline void inline_func2(int x) {}
190*67e74705SXin Li 
err_inline2(int x)191*67e74705SXin Li void err_inline2(int x) {
192*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
193*67e74705SXin Li   inline_func2(x);
194*67e74705SXin Li   if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
195*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
196*67e74705SXin Li 
inline_func3(int x)197*67e74705SXin Li inline void inline_func3(int x) {
198*67e74705SXin Li   var = 77 / x;
199*67e74705SXin Li }
ok_inline(int x)200*67e74705SXin Li void ok_inline(int x) {
201*67e74705SXin Li   var = 77 / x; // expected-note {{Division with compared value made here}}
202*67e74705SXin Li   inline_func3(x);
203*67e74705SXin Li   if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
204*67e74705SXin Li } // expected-note@-1 {{Value being compared against zero has already been used for division}}
205