Skip to content

Commit 6608030

Browse files
committed
division-by-zero on float
This disables the division-by-zero check for floating-point operations. Division by zero on floating-point numbers is defined behavior when using IEEE 754.
1 parent 9411c77 commit 6608030

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
lines changed

regression/cbmc/pragma_cprover_enable_all/main.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ int main()
3030
char *p = malloc(N * sizeof(*p));
3131
char *q;
3232
char *r;
33-
float den;
34-
float x;
35-
float y;
33+
int den;
34+
int x;
35+
int y;
3636
ABC e;
3737
bool readable;
3838
char i;
@@ -41,9 +41,9 @@ int main()
4141
q = p + 2000000000000;
4242
q = r;
4343
if(nondet_bool())
44-
den = 0.0;
44+
den = 0;
4545
else
46-
den = 1.0;
46+
den = 1;
4747
y = x / den;
4848
e = 10;
4949
i += 1;
@@ -67,9 +67,9 @@ int main()
6767
char *p = malloc(N * sizeof(*p));
6868
char *q;
6969
char *r;
70-
float den;
71-
float x;
72-
float y;
70+
int den;
71+
int x;
72+
int y;
7373
ABC e;
7474
bool readable;
7575
char i;
@@ -78,9 +78,9 @@ int main()
7878
q = p + 2000000000000;
7979
q = r;
8080
if(nondet_bool())
81-
den = 0.0;
81+
den = 0;
8282
else
83-
den = 1.0;
83+
den = 1;
8484
y = x / den;
8585
e = 10;
8686
i += 1;

regression/cbmc/pragma_cprover_enable_all/test.desc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ main.c
44
^\[main\.pointer_primitives\.\d+\] line 77 pointer invalid in R_OK\(q, \(unsigned (long (long )?)?int\)1\): FAILURE$
55
^\[main\.pointer_primitives\.\d+\] line 77 pointer outside object bounds in R_OK\(q, \(unsigned (long (long )?)?int\)1\): FAILURE$
66
^\[main\.pointer_arithmetic\.\d+\] line 78 pointer arithmetic: pointer outside object bounds in p \+ (\(signed int\))?2000000000000(l|ll): FAILURE
7-
^\[main\.NaN\.\d+\] line 84 NaN on / in x / den: FAILURE
87
^\[main\.division-by-zero\.\d+\] line 84 division by zero in x / den: FAILURE
9-
^\[main\.overflow\.\d+\] line 84 arithmetic overflow on floating-point division in x / den: FAILURE
8+
^\[main\.overflow\.\d+\] line 84 arithmetic overflow on signed division in x / den: SUCCESS
109
^\[main\.enum-range-check\.\d+\] line 85 enum range check in \(ABC\)10: FAILURE
1110
^\[main\.overflow\.\d+\] line 86 arithmetic overflow on signed (to unsigned )?type conversion in \(char\)\(\(signed int\)i \+ 1\): FAILURE
1211
^\[main\.overflow\.\d+\] line 87 arithmetic overflow on signed \+ in j \+ 1: FAILURE
@@ -17,9 +16,8 @@ main.c
1716
^\[main\.pointer_primitives\.\d+\] line 40 pointer invalid in R_OK\(q, \(unsigned (long (long )?)?int\)1\): FAILURE$
1817
^\[main\.pointer_primitives\.\d+\] line 40 pointer outside object bounds in R_OK\(q, \(unsigned (long (long )?)?int\)1\): FAILURE$
1918
^\[main\.pointer_arithmetic\.\d+\] line 41 pointer arithmetic: pointer outside object bounds in p \+ .*2000000000000(l|ll): FAILURE
20-
^\[main\.NaN\.\d+\] line 47 NaN on / in x / den: FAILURE
2119
^\[main\.division-by-zero\.\d+\] line 47 division by zero in x / den: FAILURE
22-
^\[main\.overflow\.\d+\] line 47 arithmetic overflow on floating-point division in x / den: FAILURE
20+
^\[main\.overflow\.\d+\] line 47 arithmetic overflow on signed division in x / den: SUCCESS
2321
^\[main\.enum-range-check\.\d+\] line 48 enum range check in \(ABC\)10: FAILURE
2422
^\[main\.overflow\.\d+\] line 49 arithmetic overflow on signed type conversion in \(char\)\(signed int\)i \+ 1\): FAILURE
2523
^\[main\.overflow\.\d+\] line 50 arithmetic overflow on signed \+ in j \+ 1: FAILURE

src/ansi-c/goto_check_c.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1850,7 +1850,15 @@ void goto_check_ct::check_rec_div(
18501850
const div_exprt &div_expr,
18511851
const guardt &guard)
18521852
{
1853-
div_by_zero_check(to_div_expr(div_expr), guard);
1853+
if(
1854+
div_expr.type().id() == ID_signedbv ||
1855+
div_expr.type().id() == ID_unsignedbv || div_expr.type().id() == ID_c_bool)
1856+
{
1857+
// Division by zero is undefined behavior for all integer types.
1858+
// Division by zero is defined behavior for
1859+
// floating-point types if IEEE 754 is used.
1860+
div_by_zero_check(to_div_expr(div_expr), guard);
1861+
}
18541862

18551863
if(div_expr.type().id() == ID_signedbv)
18561864
integer_overflow_check(div_expr, guard);

0 commit comments

Comments
 (0)