diff --git a/src/plugins/e-acsl/real.ml b/src/plugins/e-acsl/real.ml index 5a530410a0cee366f60372a7fc70a5adb3d3014f..8827392aaf1eeb7b0b69a137cde0ee25bb90347e 100644 --- a/src/plugins/e-acsl/real.ml +++ b/src/plugins/e-acsl/real.ml @@ -60,6 +60,11 @@ let mk_real ~loc ?name e env t_opt = e, env exception Not_a_decimal of string +exception Is_a_float + +(* The possible float suffixes (ISO C 6.4.4.2) are lLfF. + dD is a GNU extension accepted by Frama-C (only!) in the logic *) +let float_suffixes = [ 'f'; 'F'; 'l'; 'L'; 'd'; 'D' ] (* Computes the fractional representation of a decimal number. Does NOT perform reduction. @@ -88,6 +93,10 @@ let decimal_to_fractional str = Bytes.unsafe_set buf (i - 1) c; Bytes.unsafe_set buf len' '0'; post str len buf (len' + 1) (i + 1) + | c when List.mem c float_suffixes -> + (* [JS] a suffix denoting a C type is possible *) + assert (i = len - 1); + raise Is_a_float | _ -> raise (Not_a_decimal str) in @@ -106,6 +115,10 @@ let decimal_to_fractional str = | c when '0' <= c && c <= '9' -> Bytes.unsafe_set buf i c; pre str len buf (i + 1) + | c when List.mem c float_suffixes -> + (* [JS] a suffix denoting a C type is possible *) + assert (i = len - 1); + raise Is_a_float | _ -> raise (Not_a_decimal str) in @@ -115,7 +128,8 @@ let decimal_to_fractional str = as the decimal one. *) 2 * strlen in - pre str strlen (Bytes.create buflen) 0 + try pre str strlen (Bytes.create buflen) 0 + with Is_a_float -> str (* just left it unchanged *) (* ACSL considers strings written in decimal expansion to be reals. Yet GMPQ considers them to be double: diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c index 6bba81c1a8918212a07a50ff815639fe1a6cfa5b..7627bd75e465e994363437329d9248bf68129f77 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c @@ -1,6 +1,8 @@ /* Generated by Frama-C */ #include "stdio.h" #include "stdlib.h" +extern int __e_acsl_sound_verdict; + /*@ ensures \let delta = 1; \let avg_real = (\old(a) + \old(b)) / 2; avg_real - delta < \result < avg_real + delta; @@ -91,20 +93,20 @@ int main(void) { __e_acsl_mpq_t __gen_e_acsl__8; double __gen_e_acsl_cast_2; - __e_acsl_mpq_t __gen_e_acsl__9; double __gen_e_acsl_cast_3; + __e_acsl_mpq_t __gen_e_acsl__9; __e_acsl_mpq_t __gen_e_acsl__10; int __gen_e_acsl_ne_3; __gmpq_init(__gen_e_acsl__8); __gmpq_set_str(__gen_e_acsl__8,"01/10",10); __gen_e_acsl_cast_2 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8)); + __gen_e_acsl_cast_3 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8)); __gmpq_init(__gen_e_acsl__9); /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_2); */ /*@ assert Eva: is_nan_or_infinite: \is_finite((float)__gen_e_acsl_cast_2); */ __gmpq_set_d(__gen_e_acsl__9,(double)((float)__gen_e_acsl_cast_2)); - __gen_e_acsl_cast_3 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8)); __gmpq_init(__gen_e_acsl__10); /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_3); */ __gmpq_set_d(__gen_e_acsl__10,__gen_e_acsl_cast_3); @@ -122,32 +124,32 @@ int main(void) double __gen_e_acsl_cast_4; __e_acsl_mpq_t __gen_e_acsl__12; __e_acsl_mpq_t __gen_e_acsl__13; - __e_acsl_mpq_t __gen_e_acsl__14; __e_acsl_mpq_t __gen_e_acsl_add_2; + __e_acsl_mpq_t __gen_e_acsl__14; int __gen_e_acsl_ne_4; __gmpq_init(__gen_e_acsl__11); __gmpq_set_str(__gen_e_acsl__11,"11/10",10); __gen_e_acsl_cast_4 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__11)); __gmpq_init(__gen_e_acsl__12); - /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_4); */ - __gmpq_set_d(__gen_e_acsl__12,__gen_e_acsl_cast_4); + __gmpq_set_str(__gen_e_acsl__12,"1",10); __gmpq_init(__gen_e_acsl__13); - __gmpq_set_str(__gen_e_acsl__13,"1",10); - __gmpq_init(__gen_e_acsl__14); - __gmpq_set_str(__gen_e_acsl__14,"01/10",10); + __gmpq_set_str(__gen_e_acsl__13,"01/10",10); __gmpq_init(__gen_e_acsl_add_2); __gmpq_add(__gen_e_acsl_add_2, - (__e_acsl_mpq_struct const *)(__gen_e_acsl__13), - (__e_acsl_mpq_struct const *)(__gen_e_acsl__14)); - __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__12), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__12), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__13)); + __gmpq_init(__gen_e_acsl__14); + /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_4); */ + __gmpq_set_d(__gen_e_acsl__14,__gen_e_acsl_cast_4); + __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__14), (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2)); __e_acsl_assert(__gen_e_acsl_ne_4 != 0,(char *)"Assertion", (char *)"main",(char *)"(double)1.1 != 1 + 0.1",19); __gmpq_clear(__gen_e_acsl__11); __gmpq_clear(__gen_e_acsl__12); __gmpq_clear(__gen_e_acsl__13); - __gmpq_clear(__gen_e_acsl__14); __gmpq_clear(__gen_e_acsl_add_2); + __gmpq_clear(__gen_e_acsl__14); } /*@ assert 1 + 0.1 ≡ 2 - 0.9; */ { @@ -190,65 +192,86 @@ int main(void) float sum = x + y; /*@ assert sum ≢ x * y; */ { - __e_acsl_mpq_t __gen_e_acsl_sum; - __e_acsl_mpq_t __gen_e_acsl_x; __e_acsl_mpq_t __gen_e_acsl_y; + __e_acsl_mpq_t __gen_e_acsl__19; __e_acsl_mpq_t __gen_e_acsl_mul; + __e_acsl_mpq_t __gen_e_acsl__20; int __gen_e_acsl_ne_5; - __gmpq_init(__gen_e_acsl_sum); - __gmpq_set_d(__gen_e_acsl_sum,(double)sum); - __gmpq_init(__gen_e_acsl_x); - __gmpq_set_d(__gen_e_acsl_x,(double)x); __gmpq_init(__gen_e_acsl_y); __gmpq_set_d(__gen_e_acsl_y,(double)y); + __gmpq_init(__gen_e_acsl__19); + __gmpq_set_d(__gen_e_acsl__19,(double)x); __gmpq_init(__gen_e_acsl_mul); __gmpq_mul(__gen_e_acsl_mul, - (__e_acsl_mpq_struct const *)(__gen_e_acsl_x), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__19), (__e_acsl_mpq_struct const *)(__gen_e_acsl_y)); - __gen_e_acsl_ne_5 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_sum), + __gmpq_init(__gen_e_acsl__20); + __gmpq_set_d(__gen_e_acsl__20,(double)sum); + __gen_e_acsl_ne_5 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__20), (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul)); __e_acsl_assert(__gen_e_acsl_ne_5 != 0,(char *)"Assertion", (char *)"main",(char *)"sum != x * y",24); - __gmpq_clear(__gen_e_acsl_sum); - __gmpq_clear(__gen_e_acsl_x); __gmpq_clear(__gen_e_acsl_y); + __gmpq_clear(__gen_e_acsl__19); __gmpq_clear(__gen_e_acsl_mul); + __gmpq_clear(__gen_e_acsl__20); } /*@ assert \let n = 1; 4 ≡ n + 3.0; */ { int __gen_e_acsl_n; - __e_acsl_mpq_t __gen_e_acsl__19; - __e_acsl_mpq_t __gen_e_acsl_n_2; - __e_acsl_mpq_t __gen_e_acsl__20; + __e_acsl_mpq_t __gen_e_acsl__21; + __e_acsl_mpq_t __gen_e_acsl__22; + __e_acsl_mpq_t __gen_e_acsl__23; __e_acsl_mpq_t __gen_e_acsl_add_4; int __gen_e_acsl_eq_4; __gen_e_acsl_n = 1; - __gmpq_init(__gen_e_acsl__19); - __gmpq_set_str(__gen_e_acsl__19,"4",10); - __gmpq_init(__gen_e_acsl_n_2); - __gmpq_set_si(__gen_e_acsl_n_2,(long)__gen_e_acsl_n); - __gmpq_init(__gen_e_acsl__20); - __gmpq_set_str(__gen_e_acsl__20,"30/10",10); + __gmpq_init(__gen_e_acsl__21); + __gmpq_set_str(__gen_e_acsl__21,"4",10); + __gmpq_init(__gen_e_acsl__22); + __gmpq_set_str(__gen_e_acsl__22,"30/10",10); + __gmpq_init(__gen_e_acsl__23); + __gmpq_set_si(__gen_e_acsl__23,(long)__gen_e_acsl_n); __gmpq_init(__gen_e_acsl_add_4); __gmpq_add(__gen_e_acsl_add_4, - (__e_acsl_mpq_struct const *)(__gen_e_acsl_n_2), - (__e_acsl_mpq_struct const *)(__gen_e_acsl__20)); - __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__19), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__23), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__22)); + __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__21), (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_4)); __e_acsl_assert(__gen_e_acsl_eq_4 == 0,(char *)"Assertion", (char *)"main",(char *)"\\let n = 1; 4 == n + 3.0",25); - __gmpq_clear(__gen_e_acsl__19); - __gmpq_clear(__gen_e_acsl_n_2); - __gmpq_clear(__gen_e_acsl__20); + __gmpq_clear(__gen_e_acsl__21); + __gmpq_clear(__gen_e_acsl__22); + __gmpq_clear(__gen_e_acsl__23); __gmpq_clear(__gen_e_acsl_add_4); } double d = 0.1; __gen_e_acsl_avg(4.3,11.7); - long double ld = 0.1l; - /*@ assert d + 1 ≢ ld + 1; */ ; - /*@ assert 1.1d ≢ 1 + 0.1; */ ; - /*@ assert 3 ≢ 1e5; */ ; - /*@ assert \let n = 99999999999999999999999999; 4 ≢ n + 3.7; */ ; + /*@ assert 1.1d ≢ 1 + 0.1; */ + { + __e_acsl_mpq_t __gen_e_acsl__24; + __e_acsl_mpq_t __gen_e_acsl__25; + __e_acsl_mpq_t __gen_e_acsl__26; + __e_acsl_mpq_t __gen_e_acsl_add_5; + int __gen_e_acsl_ne_6; + __gmpq_init(__gen_e_acsl__24); + __gmpq_set_str(__gen_e_acsl__24,"1.1d",10); + __gmpq_init(__gen_e_acsl__25); + __gmpq_set_str(__gen_e_acsl__25,"1",10); + __gmpq_init(__gen_e_acsl__26); + __gmpq_set_str(__gen_e_acsl__26,"01/10",10); + __gmpq_init(__gen_e_acsl_add_5); + __gmpq_add(__gen_e_acsl_add_5, + (__e_acsl_mpq_struct const *)(__gen_e_acsl__25), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__26)); + __gen_e_acsl_ne_6 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__24), + (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_5)); + __e_acsl_assert(__gen_e_acsl_ne_6 != 0,(char *)"Assertion", + (char *)"main",(char *)"1.1d != 1 + 0.1",31); + __gmpq_clear(__gen_e_acsl__24); + __gmpq_clear(__gen_e_acsl__25); + __gmpq_clear(__gen_e_acsl__26); + __gmpq_clear(__gen_e_acsl_add_5); + } __retres = 0; return __retres; } @@ -259,18 +282,10 @@ int main(void) */ double __gen_e_acsl_avg(double a, double b) { - __e_acsl_mpq_t __gen_e_acsl_at_2; + double __gen_e_acsl_at_2; __e_acsl_mpq_t __gen_e_acsl_at; double __retres; - { - __e_acsl_mpq_t __gen_e_acsl_b; - __gmpq_init(__gen_e_acsl_b); - __gmpq_set_d(__gen_e_acsl_b,b); - __gmpq_init(__gen_e_acsl_at_2); - __gmpq_set(__gen_e_acsl_at_2, - (__e_acsl_mpq_struct const *)(__gen_e_acsl_b)); - __gmpq_clear(__gen_e_acsl_b); - } + __gen_e_acsl_at_2 = b; { __e_acsl_mpq_t __gen_e_acsl_a; __gmpq_init(__gen_e_acsl_a); @@ -283,25 +298,28 @@ double __gen_e_acsl_avg(double a, double b) { int __gen_e_acsl_delta; __e_acsl_mpq_t __gen_e_acsl_avg_real; - __e_acsl_mpq_t __gen_e_acsl_add; __e_acsl_mpq_t __gen_e_acsl_; + __e_acsl_mpq_t __gen_e_acsl_add; + __e_acsl_mpq_t __gen_e_acsl__2; __e_acsl_mpq_t __gen_e_acsl_div; __e_acsl_mpq_t __gen_e_acsl_delta_2; __e_acsl_mpq_t __gen_e_acsl_sub; - __e_acsl_mpq_t __gen_e_acsl_result; + __e_acsl_mpq_t __gen_e_acsl__3; int __gen_e_acsl_lt; int __gen_e_acsl_and; __gen_e_acsl_delta = 1; + __gmpq_init(__gen_e_acsl_); + __gmpq_set_d(__gen_e_acsl_,__gen_e_acsl_at_2); __gmpq_init(__gen_e_acsl_add); __gmpq_add(__gen_e_acsl_add, (__e_acsl_mpq_struct const *)(__gen_e_acsl_at), - (__e_acsl_mpq_struct const *)(__gen_e_acsl_at_2)); - __gmpq_init(__gen_e_acsl_); - __gmpq_set_str(__gen_e_acsl_,"2",10); + (__e_acsl_mpq_struct const *)(__gen_e_acsl_)); + __gmpq_init(__gen_e_acsl__2); + __gmpq_set_str(__gen_e_acsl__2,"2",10); __gmpq_init(__gen_e_acsl_div); __gmpq_div(__gen_e_acsl_div, (__e_acsl_mpq_struct const *)(__gen_e_acsl_add), - (__e_acsl_mpq_struct const *)(__gen_e_acsl_)); + (__e_acsl_mpq_struct const *)(__gen_e_acsl__2)); __gmpq_init(__gen_e_acsl_avg_real); __gmpq_set(__gen_e_acsl_avg_real, (__e_acsl_mpq_struct const *)(__gen_e_acsl_div)); @@ -311,43 +329,43 @@ double __gen_e_acsl_avg(double a, double b) __gmpq_sub(__gen_e_acsl_sub, (__e_acsl_mpq_struct const *)(__gen_e_acsl_avg_real), (__e_acsl_mpq_struct const *)(__gen_e_acsl_delta_2)); - __gmpq_init(__gen_e_acsl_result); - __gmpq_set_d(__gen_e_acsl_result,__retres); + __gmpq_init(__gen_e_acsl__3); + __gmpq_set_d(__gen_e_acsl__3,__retres); __gen_e_acsl_lt = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_sub), - (__e_acsl_mpq_struct const *)(__gen_e_acsl_result)); + (__e_acsl_mpq_struct const *)(__gen_e_acsl__3)); if (__gen_e_acsl_lt < 0) { - __e_acsl_mpq_t __gen_e_acsl_result_2; __e_acsl_mpq_t __gen_e_acsl_delta_3; __e_acsl_mpq_t __gen_e_acsl_add_2; + __e_acsl_mpq_t __gen_e_acsl__4; int __gen_e_acsl_lt_2; - __gmpq_init(__gen_e_acsl_result_2); - __gmpq_set_d(__gen_e_acsl_result_2,__retres); __gmpq_init(__gen_e_acsl_delta_3); __gmpq_set_si(__gen_e_acsl_delta_3,(long)__gen_e_acsl_delta); __gmpq_init(__gen_e_acsl_add_2); __gmpq_add(__gen_e_acsl_add_2, (__e_acsl_mpq_struct const *)(__gen_e_acsl_avg_real), (__e_acsl_mpq_struct const *)(__gen_e_acsl_delta_3)); - __gen_e_acsl_lt_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_result_2), + __gmpq_init(__gen_e_acsl__4); + __gmpq_set_d(__gen_e_acsl__4,__retres); + __gen_e_acsl_lt_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__4), (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2)); __gen_e_acsl_and = __gen_e_acsl_lt_2 < 0; - __gmpq_clear(__gen_e_acsl_result_2); __gmpq_clear(__gen_e_acsl_delta_3); __gmpq_clear(__gen_e_acsl_add_2); + __gmpq_clear(__gen_e_acsl__4); } else __gen_e_acsl_and = 0; __e_acsl_assert(__gen_e_acsl_and,(char *)"Postcondition",(char *)"avg", (char *)"\\let delta = 1;\n\\let avg_real = (\\old(a) + \\old(b)) / 2;\n avg_real - delta < \\result < avg_real + delta", 6); __gmpq_clear(__gen_e_acsl_avg_real); - __gmpq_clear(__gen_e_acsl_add); __gmpq_clear(__gen_e_acsl_); + __gmpq_clear(__gen_e_acsl_add); + __gmpq_clear(__gen_e_acsl__2); __gmpq_clear(__gen_e_acsl_div); __gmpq_clear(__gen_e_acsl_delta_2); __gmpq_clear(__gen_e_acsl_sub); - __gmpq_clear(__gen_e_acsl_result); + __gmpq_clear(__gen_e_acsl__3); __gmpq_clear(__gen_e_acsl_at); - __gmpq_clear(__gen_e_acsl_at_2); return __retres; } } diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c index 6bba81c1a8918212a07a50ff815639fe1a6cfa5b..7627bd75e465e994363437329d9248bf68129f77 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c @@ -1,6 +1,8 @@ /* Generated by Frama-C */ #include "stdio.h" #include "stdlib.h" +extern int __e_acsl_sound_verdict; + /*@ ensures \let delta = 1; \let avg_real = (\old(a) + \old(b)) / 2; avg_real - delta < \result < avg_real + delta; @@ -91,20 +93,20 @@ int main(void) { __e_acsl_mpq_t __gen_e_acsl__8; double __gen_e_acsl_cast_2; - __e_acsl_mpq_t __gen_e_acsl__9; double __gen_e_acsl_cast_3; + __e_acsl_mpq_t __gen_e_acsl__9; __e_acsl_mpq_t __gen_e_acsl__10; int __gen_e_acsl_ne_3; __gmpq_init(__gen_e_acsl__8); __gmpq_set_str(__gen_e_acsl__8,"01/10",10); __gen_e_acsl_cast_2 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8)); + __gen_e_acsl_cast_3 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8)); __gmpq_init(__gen_e_acsl__9); /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_2); */ /*@ assert Eva: is_nan_or_infinite: \is_finite((float)__gen_e_acsl_cast_2); */ __gmpq_set_d(__gen_e_acsl__9,(double)((float)__gen_e_acsl_cast_2)); - __gen_e_acsl_cast_3 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8)); __gmpq_init(__gen_e_acsl__10); /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_3); */ __gmpq_set_d(__gen_e_acsl__10,__gen_e_acsl_cast_3); @@ -122,32 +124,32 @@ int main(void) double __gen_e_acsl_cast_4; __e_acsl_mpq_t __gen_e_acsl__12; __e_acsl_mpq_t __gen_e_acsl__13; - __e_acsl_mpq_t __gen_e_acsl__14; __e_acsl_mpq_t __gen_e_acsl_add_2; + __e_acsl_mpq_t __gen_e_acsl__14; int __gen_e_acsl_ne_4; __gmpq_init(__gen_e_acsl__11); __gmpq_set_str(__gen_e_acsl__11,"11/10",10); __gen_e_acsl_cast_4 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__11)); __gmpq_init(__gen_e_acsl__12); - /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_4); */ - __gmpq_set_d(__gen_e_acsl__12,__gen_e_acsl_cast_4); + __gmpq_set_str(__gen_e_acsl__12,"1",10); __gmpq_init(__gen_e_acsl__13); - __gmpq_set_str(__gen_e_acsl__13,"1",10); - __gmpq_init(__gen_e_acsl__14); - __gmpq_set_str(__gen_e_acsl__14,"01/10",10); + __gmpq_set_str(__gen_e_acsl__13,"01/10",10); __gmpq_init(__gen_e_acsl_add_2); __gmpq_add(__gen_e_acsl_add_2, - (__e_acsl_mpq_struct const *)(__gen_e_acsl__13), - (__e_acsl_mpq_struct const *)(__gen_e_acsl__14)); - __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__12), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__12), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__13)); + __gmpq_init(__gen_e_acsl__14); + /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast_4); */ + __gmpq_set_d(__gen_e_acsl__14,__gen_e_acsl_cast_4); + __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__14), (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2)); __e_acsl_assert(__gen_e_acsl_ne_4 != 0,(char *)"Assertion", (char *)"main",(char *)"(double)1.1 != 1 + 0.1",19); __gmpq_clear(__gen_e_acsl__11); __gmpq_clear(__gen_e_acsl__12); __gmpq_clear(__gen_e_acsl__13); - __gmpq_clear(__gen_e_acsl__14); __gmpq_clear(__gen_e_acsl_add_2); + __gmpq_clear(__gen_e_acsl__14); } /*@ assert 1 + 0.1 ≡ 2 - 0.9; */ { @@ -190,65 +192,86 @@ int main(void) float sum = x + y; /*@ assert sum ≢ x * y; */ { - __e_acsl_mpq_t __gen_e_acsl_sum; - __e_acsl_mpq_t __gen_e_acsl_x; __e_acsl_mpq_t __gen_e_acsl_y; + __e_acsl_mpq_t __gen_e_acsl__19; __e_acsl_mpq_t __gen_e_acsl_mul; + __e_acsl_mpq_t __gen_e_acsl__20; int __gen_e_acsl_ne_5; - __gmpq_init(__gen_e_acsl_sum); - __gmpq_set_d(__gen_e_acsl_sum,(double)sum); - __gmpq_init(__gen_e_acsl_x); - __gmpq_set_d(__gen_e_acsl_x,(double)x); __gmpq_init(__gen_e_acsl_y); __gmpq_set_d(__gen_e_acsl_y,(double)y); + __gmpq_init(__gen_e_acsl__19); + __gmpq_set_d(__gen_e_acsl__19,(double)x); __gmpq_init(__gen_e_acsl_mul); __gmpq_mul(__gen_e_acsl_mul, - (__e_acsl_mpq_struct const *)(__gen_e_acsl_x), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__19), (__e_acsl_mpq_struct const *)(__gen_e_acsl_y)); - __gen_e_acsl_ne_5 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_sum), + __gmpq_init(__gen_e_acsl__20); + __gmpq_set_d(__gen_e_acsl__20,(double)sum); + __gen_e_acsl_ne_5 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__20), (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul)); __e_acsl_assert(__gen_e_acsl_ne_5 != 0,(char *)"Assertion", (char *)"main",(char *)"sum != x * y",24); - __gmpq_clear(__gen_e_acsl_sum); - __gmpq_clear(__gen_e_acsl_x); __gmpq_clear(__gen_e_acsl_y); + __gmpq_clear(__gen_e_acsl__19); __gmpq_clear(__gen_e_acsl_mul); + __gmpq_clear(__gen_e_acsl__20); } /*@ assert \let n = 1; 4 ≡ n + 3.0; */ { int __gen_e_acsl_n; - __e_acsl_mpq_t __gen_e_acsl__19; - __e_acsl_mpq_t __gen_e_acsl_n_2; - __e_acsl_mpq_t __gen_e_acsl__20; + __e_acsl_mpq_t __gen_e_acsl__21; + __e_acsl_mpq_t __gen_e_acsl__22; + __e_acsl_mpq_t __gen_e_acsl__23; __e_acsl_mpq_t __gen_e_acsl_add_4; int __gen_e_acsl_eq_4; __gen_e_acsl_n = 1; - __gmpq_init(__gen_e_acsl__19); - __gmpq_set_str(__gen_e_acsl__19,"4",10); - __gmpq_init(__gen_e_acsl_n_2); - __gmpq_set_si(__gen_e_acsl_n_2,(long)__gen_e_acsl_n); - __gmpq_init(__gen_e_acsl__20); - __gmpq_set_str(__gen_e_acsl__20,"30/10",10); + __gmpq_init(__gen_e_acsl__21); + __gmpq_set_str(__gen_e_acsl__21,"4",10); + __gmpq_init(__gen_e_acsl__22); + __gmpq_set_str(__gen_e_acsl__22,"30/10",10); + __gmpq_init(__gen_e_acsl__23); + __gmpq_set_si(__gen_e_acsl__23,(long)__gen_e_acsl_n); __gmpq_init(__gen_e_acsl_add_4); __gmpq_add(__gen_e_acsl_add_4, - (__e_acsl_mpq_struct const *)(__gen_e_acsl_n_2), - (__e_acsl_mpq_struct const *)(__gen_e_acsl__20)); - __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__19), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__23), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__22)); + __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__21), (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_4)); __e_acsl_assert(__gen_e_acsl_eq_4 == 0,(char *)"Assertion", (char *)"main",(char *)"\\let n = 1; 4 == n + 3.0",25); - __gmpq_clear(__gen_e_acsl__19); - __gmpq_clear(__gen_e_acsl_n_2); - __gmpq_clear(__gen_e_acsl__20); + __gmpq_clear(__gen_e_acsl__21); + __gmpq_clear(__gen_e_acsl__22); + __gmpq_clear(__gen_e_acsl__23); __gmpq_clear(__gen_e_acsl_add_4); } double d = 0.1; __gen_e_acsl_avg(4.3,11.7); - long double ld = 0.1l; - /*@ assert d + 1 ≢ ld + 1; */ ; - /*@ assert 1.1d ≢ 1 + 0.1; */ ; - /*@ assert 3 ≢ 1e5; */ ; - /*@ assert \let n = 99999999999999999999999999; 4 ≢ n + 3.7; */ ; + /*@ assert 1.1d ≢ 1 + 0.1; */ + { + __e_acsl_mpq_t __gen_e_acsl__24; + __e_acsl_mpq_t __gen_e_acsl__25; + __e_acsl_mpq_t __gen_e_acsl__26; + __e_acsl_mpq_t __gen_e_acsl_add_5; + int __gen_e_acsl_ne_6; + __gmpq_init(__gen_e_acsl__24); + __gmpq_set_str(__gen_e_acsl__24,"1.1d",10); + __gmpq_init(__gen_e_acsl__25); + __gmpq_set_str(__gen_e_acsl__25,"1",10); + __gmpq_init(__gen_e_acsl__26); + __gmpq_set_str(__gen_e_acsl__26,"01/10",10); + __gmpq_init(__gen_e_acsl_add_5); + __gmpq_add(__gen_e_acsl_add_5, + (__e_acsl_mpq_struct const *)(__gen_e_acsl__25), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__26)); + __gen_e_acsl_ne_6 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__24), + (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_5)); + __e_acsl_assert(__gen_e_acsl_ne_6 != 0,(char *)"Assertion", + (char *)"main",(char *)"1.1d != 1 + 0.1",31); + __gmpq_clear(__gen_e_acsl__24); + __gmpq_clear(__gen_e_acsl__25); + __gmpq_clear(__gen_e_acsl__26); + __gmpq_clear(__gen_e_acsl_add_5); + } __retres = 0; return __retres; } @@ -259,18 +282,10 @@ int main(void) */ double __gen_e_acsl_avg(double a, double b) { - __e_acsl_mpq_t __gen_e_acsl_at_2; + double __gen_e_acsl_at_2; __e_acsl_mpq_t __gen_e_acsl_at; double __retres; - { - __e_acsl_mpq_t __gen_e_acsl_b; - __gmpq_init(__gen_e_acsl_b); - __gmpq_set_d(__gen_e_acsl_b,b); - __gmpq_init(__gen_e_acsl_at_2); - __gmpq_set(__gen_e_acsl_at_2, - (__e_acsl_mpq_struct const *)(__gen_e_acsl_b)); - __gmpq_clear(__gen_e_acsl_b); - } + __gen_e_acsl_at_2 = b; { __e_acsl_mpq_t __gen_e_acsl_a; __gmpq_init(__gen_e_acsl_a); @@ -283,25 +298,28 @@ double __gen_e_acsl_avg(double a, double b) { int __gen_e_acsl_delta; __e_acsl_mpq_t __gen_e_acsl_avg_real; - __e_acsl_mpq_t __gen_e_acsl_add; __e_acsl_mpq_t __gen_e_acsl_; + __e_acsl_mpq_t __gen_e_acsl_add; + __e_acsl_mpq_t __gen_e_acsl__2; __e_acsl_mpq_t __gen_e_acsl_div; __e_acsl_mpq_t __gen_e_acsl_delta_2; __e_acsl_mpq_t __gen_e_acsl_sub; - __e_acsl_mpq_t __gen_e_acsl_result; + __e_acsl_mpq_t __gen_e_acsl__3; int __gen_e_acsl_lt; int __gen_e_acsl_and; __gen_e_acsl_delta = 1; + __gmpq_init(__gen_e_acsl_); + __gmpq_set_d(__gen_e_acsl_,__gen_e_acsl_at_2); __gmpq_init(__gen_e_acsl_add); __gmpq_add(__gen_e_acsl_add, (__e_acsl_mpq_struct const *)(__gen_e_acsl_at), - (__e_acsl_mpq_struct const *)(__gen_e_acsl_at_2)); - __gmpq_init(__gen_e_acsl_); - __gmpq_set_str(__gen_e_acsl_,"2",10); + (__e_acsl_mpq_struct const *)(__gen_e_acsl_)); + __gmpq_init(__gen_e_acsl__2); + __gmpq_set_str(__gen_e_acsl__2,"2",10); __gmpq_init(__gen_e_acsl_div); __gmpq_div(__gen_e_acsl_div, (__e_acsl_mpq_struct const *)(__gen_e_acsl_add), - (__e_acsl_mpq_struct const *)(__gen_e_acsl_)); + (__e_acsl_mpq_struct const *)(__gen_e_acsl__2)); __gmpq_init(__gen_e_acsl_avg_real); __gmpq_set(__gen_e_acsl_avg_real, (__e_acsl_mpq_struct const *)(__gen_e_acsl_div)); @@ -311,43 +329,43 @@ double __gen_e_acsl_avg(double a, double b) __gmpq_sub(__gen_e_acsl_sub, (__e_acsl_mpq_struct const *)(__gen_e_acsl_avg_real), (__e_acsl_mpq_struct const *)(__gen_e_acsl_delta_2)); - __gmpq_init(__gen_e_acsl_result); - __gmpq_set_d(__gen_e_acsl_result,__retres); + __gmpq_init(__gen_e_acsl__3); + __gmpq_set_d(__gen_e_acsl__3,__retres); __gen_e_acsl_lt = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_sub), - (__e_acsl_mpq_struct const *)(__gen_e_acsl_result)); + (__e_acsl_mpq_struct const *)(__gen_e_acsl__3)); if (__gen_e_acsl_lt < 0) { - __e_acsl_mpq_t __gen_e_acsl_result_2; __e_acsl_mpq_t __gen_e_acsl_delta_3; __e_acsl_mpq_t __gen_e_acsl_add_2; + __e_acsl_mpq_t __gen_e_acsl__4; int __gen_e_acsl_lt_2; - __gmpq_init(__gen_e_acsl_result_2); - __gmpq_set_d(__gen_e_acsl_result_2,__retres); __gmpq_init(__gen_e_acsl_delta_3); __gmpq_set_si(__gen_e_acsl_delta_3,(long)__gen_e_acsl_delta); __gmpq_init(__gen_e_acsl_add_2); __gmpq_add(__gen_e_acsl_add_2, (__e_acsl_mpq_struct const *)(__gen_e_acsl_avg_real), (__e_acsl_mpq_struct const *)(__gen_e_acsl_delta_3)); - __gen_e_acsl_lt_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_result_2), + __gmpq_init(__gen_e_acsl__4); + __gmpq_set_d(__gen_e_acsl__4,__retres); + __gen_e_acsl_lt_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__4), (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2)); __gen_e_acsl_and = __gen_e_acsl_lt_2 < 0; - __gmpq_clear(__gen_e_acsl_result_2); __gmpq_clear(__gen_e_acsl_delta_3); __gmpq_clear(__gen_e_acsl_add_2); + __gmpq_clear(__gen_e_acsl__4); } else __gen_e_acsl_and = 0; __e_acsl_assert(__gen_e_acsl_and,(char *)"Postcondition",(char *)"avg", (char *)"\\let delta = 1;\n\\let avg_real = (\\old(a) + \\old(b)) / 2;\n avg_real - delta < \\result < avg_real + delta", 6); __gmpq_clear(__gen_e_acsl_avg_real); - __gmpq_clear(__gen_e_acsl_add); __gmpq_clear(__gen_e_acsl_); + __gmpq_clear(__gen_e_acsl_add); + __gmpq_clear(__gen_e_acsl__2); __gmpq_clear(__gen_e_acsl_div); __gmpq_clear(__gen_e_acsl_delta_2); __gmpq_clear(__gen_e_acsl_sub); - __gmpq_clear(__gen_e_acsl_result); + __gmpq_clear(__gen_e_acsl__3); __gmpq_clear(__gen_e_acsl_at); - __gmpq_clear(__gen_e_acsl_at_2); return __retres; } } diff --git a/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle index a78fea8aefe39c321fa534ca71723b4a388a926e..a1a5dd8416dc57984e6502155398de1c462b9a77 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle +++ b/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle @@ -3,20 +3,6 @@ (warn-once: no further messages from category 'parser:decimal-float' will be emitted) [e-acsl] beginning translation. [e-acsl] Warning: R to float: double rounding might cause unsoundness -[e-acsl] tests/gmp/reals.c:33: Warning: - E-ACSL construct `creating gmp from long double' is not yet supported. - Ignoring annotation. -[e-acsl] tests/gmp/reals.c:34: Warning: - E-ACSL construct `number not written in decimal expansion' - is not yet supported. - Ignoring annotation. -[e-acsl] tests/gmp/reals.c:35: Warning: - E-ACSL construct `number not written in decimal expansion' - is not yet supported. - Ignoring annotation. -[e-acsl] tests/gmp/reals.c:37: Warning: - E-ACSL construct `reals: creating Q from Z' is not yet supported. - Ignoring annotation. [e-acsl] translation done in project "e-acsl". [eva] Analyzing a complete application starting at main [eva] Computing initial state @@ -27,6 +13,7 @@ __e_acsl_math_HUGE_VAL ∈ [-1.79769313486e+308 .. 1.79769313486e+308] __e_acsl_math_HUGE_VALF ∈ [-3.40282346639e+38 .. 3.40282346639e+38] __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + __e_acsl_sound_verdict ∈ [--..--] [eva] using specification for function __e_acsl_memory_init [eva] using specification for function __gmpq_init [eva] using specification for function __gmpq_set_str @@ -78,7 +65,7 @@ function __e_acsl_assert: precondition got status unknown. [eva:alarm] tests/gmp/reals.c:6: Warning: function __gen_e_acsl_avg: postcondition got status unknown. -[eva:alarm] tests/gmp/reals.c:33: Warning: assertion got status unknown. -[eva:alarm] tests/gmp/reals.c:34: Warning: assertion got status unknown. -[eva:alarm] tests/gmp/reals.c:36: Warning: assertion got status unknown. +[eva:alarm] tests/gmp/reals.c:31: Warning: assertion got status unknown. +[eva:alarm] tests/gmp/reals.c:31: Warning: + function __e_acsl_assert: precondition got status unknown. [eva] done for function main diff --git a/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle index a78fea8aefe39c321fa534ca71723b4a388a926e..a1a5dd8416dc57984e6502155398de1c462b9a77 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle +++ b/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle @@ -3,20 +3,6 @@ (warn-once: no further messages from category 'parser:decimal-float' will be emitted) [e-acsl] beginning translation. [e-acsl] Warning: R to float: double rounding might cause unsoundness -[e-acsl] tests/gmp/reals.c:33: Warning: - E-ACSL construct `creating gmp from long double' is not yet supported. - Ignoring annotation. -[e-acsl] tests/gmp/reals.c:34: Warning: - E-ACSL construct `number not written in decimal expansion' - is not yet supported. - Ignoring annotation. -[e-acsl] tests/gmp/reals.c:35: Warning: - E-ACSL construct `number not written in decimal expansion' - is not yet supported. - Ignoring annotation. -[e-acsl] tests/gmp/reals.c:37: Warning: - E-ACSL construct `reals: creating Q from Z' is not yet supported. - Ignoring annotation. [e-acsl] translation done in project "e-acsl". [eva] Analyzing a complete application starting at main [eva] Computing initial state @@ -27,6 +13,7 @@ __e_acsl_math_HUGE_VAL ∈ [-1.79769313486e+308 .. 1.79769313486e+308] __e_acsl_math_HUGE_VALF ∈ [-3.40282346639e+38 .. 3.40282346639e+38] __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + __e_acsl_sound_verdict ∈ [--..--] [eva] using specification for function __e_acsl_memory_init [eva] using specification for function __gmpq_init [eva] using specification for function __gmpq_set_str @@ -78,7 +65,7 @@ function __e_acsl_assert: precondition got status unknown. [eva:alarm] tests/gmp/reals.c:6: Warning: function __gen_e_acsl_avg: postcondition got status unknown. -[eva:alarm] tests/gmp/reals.c:33: Warning: assertion got status unknown. -[eva:alarm] tests/gmp/reals.c:34: Warning: assertion got status unknown. -[eva:alarm] tests/gmp/reals.c:36: Warning: assertion got status unknown. +[eva:alarm] tests/gmp/reals.c:31: Warning: assertion got status unknown. +[eva:alarm] tests/gmp/reals.c:31: Warning: + function __e_acsl_assert: precondition got status unknown. [eva] done for function main diff --git a/src/plugins/e-acsl/tests/gmp/reals.c b/src/plugins/e-acsl/tests/gmp/reals.c index 928cfdd7db546f674085e694dd60779dfcd125b7..d199b47504555a479b6268e2be5c6d64556f76ee 100644 --- a/src/plugins/e-acsl/tests/gmp/reals.c +++ b/src/plugins/e-acsl/tests/gmp/reals.c @@ -28,11 +28,12 @@ int main(void) { avg(4.3, 11.7); + /*@ assert 1.1d != 1 + 0.1; */ ; + // Not yet: - long double ld = 0.1l; - /*@ assert d + 1 != ld + 1; */ ; // long double - /*@ assert 1.1d != 1 + 0.1; */ ; // number not written in decimal expansion form - /*@ assert 3 != 1e5; */ ; // number not written in decimal expansion form - /*@ assert \let n = 99999999999999999999999999; - 4 != n + 3.7; */ ; // creating Q from Z -} \ No newline at end of file + // long double ld = 0.1l; + // /*@ assert d + 1 != ld + 1; */ ; // long double + // /*@ assert 3 != 1e5; */ ; // number not written in decimal expansion form + ///*@ assert \let n = 99999999999999999999999999; + // 4 != n + 3.7; */ ; // creating Q from Z +}