diff --git a/src/plugins/e-acsl/src/code_generator/translate.ml b/src/plugins/e-acsl/src/code_generator/translate.ml index bebbab025e8e29e7e5b85e8e399444b20827920c..5266965f380027bb921c0bc82538219872020458 100644 --- a/src/plugins/e-acsl/src/code_generator/translate.ml +++ b/src/plugins/e-acsl/src/code_generator/translate.ml @@ -190,42 +190,45 @@ and tlval_to_lval kf env (host, offset) = let name = match offset with NoOffset -> name | Field _ | Index _ -> "" in (host, offset), env, name -(* Compute the expression which corresponds to an extended_quantifier term in a - given environment. [t] is the extended_quantifier term, [t_min] the lower bound, - [t max] the upper bound, [lambda] the lambda term and [name] is the identifier of - the extended quantifier ("\sum" or "\product") *) +(* Translate extended_quantifier terms to expressions in a given environment. + [t] is the extended_quantifier term, [t_min] the lower bound, [t max] the + upper bound, [lambda] the lambda term and [name] is the identifier of the + extended quantifier ("\sum" or "\product"). Do not take care of "\numof" + that have already been converted to "\sum". *) and extended_quantifier_to_exp ~adata ~loc kf env t t_min t_max lambda name = match lambda.term_node with - | Tlambda([ k ] ,lt) when name.lv_name="\\product" || name.lv_name="\\sum" -> + | Tlambda([ k ] ,lt) + when name.lv_name = "\\product" || name.lv_name = "\\sum" + -> let ty_op = Typing.get_typ ~lenv:(Env.Local_vars.get env) t in let ty_k = match Typing.get_cast ~lenv:(Env.Local_vars.get env) t_min with - |Some e ->e + | Some e -> e | _ -> Options.fatal "unexpected error in \\sum translation" in let e_min, adata, env = term_to_exp ~adata kf env t_min in let e_max, adata, env = term_to_exp ~adata kf env t_max in let k_as_varinfo, k_as_exp, env = Env.Logic_binding.add ~ty:ty_k env kf k in let init_k_stmt = Gmp.init_set ~loc (Cil.var k_as_varinfo) k_as_exp e_min in - (*variable initialization*) - (*one = 1;*) + (* variable initialization *) + (* one = 1; *) let _, one_as_exp, env = create_and_init_var ~loc kf ty_k "one" (Cil.one ~loc) env in - (*cond = 0;*) + (* cond = 0; *) let cond_as_varinfo, cond_as_exp, env = create_and_init_var ~loc kf Cil.intType "cond" (Cil.zero ~loc) env in - (*lbda = 0;*) + (* lbda = 0; *) let lbd_as_varinfo, lbd_as_exp, env = create_and_init_var ~loc kf ty_op "lambda" (Cil.zero ~loc) env in - (*accumulator = neutral value;*) + (* accumulator = neutral value; *) let acc_as_varinfo, acc_as_exp, env = if name.lv_name="\\sum" then create_and_init_var ~loc kf ty_op "accumulator" (Cil.zero ~loc) env else create_and_init_var ~loc kf ty_op "accumulator" (Cil.one ~loc) env in - (*lambda_as_varinfo affectation*) + (* lambda_as_varinfo assignment *) let env = Env.push env in let e_lbd, _, env = term_to_exp ~adata:Assert.no_data kf env lt in Interval.Env.remove k; @@ -234,42 +237,48 @@ and extended_quantifier_to_exp ~adata ~loc kf env t t_min t_max lambda name = (Gmp.affect ~loc (Cil.var lbd_as_varinfo) lbd_as_exp e_lbd) false Env.Middle in - (*statement construction*) - (*cond = k > e_max; or cond = __gmpz_cmp(k,e_max)*) + (* statement construction *) + (* cond = k > e_max; or cond = __gmpz_cmp(k,e_max) *) let cond_stmt = affect_binop ~loc cond_as_varinfo None Gt ty_k k_as_exp e_max in - (*acc = acc op lbda; or __gmpz_op(acc,acc,lbda);*) - let acc_plus_lbd_stmt = if name.lv_name = "\\sum" then - affect_binop - ~loc acc_as_varinfo (Some acc_as_exp) PlusA ty_op acc_as_exp lbd_as_exp - else - affect_binop - ~loc acc_as_varinfo (Some acc_as_exp) Mult ty_op acc_as_exp lbd_as_exp + (* acc = acc op lbda; or __gmpz_op(acc,acc,lbda); *) + let op = if name.lv_name = "\\sum" then PlusA else Mult in + let acc_plus_lbd_stmt = + affect_binop + ~loc + acc_as_varinfo + (Some acc_as_exp) + op + ty_op + acc_as_exp + lbd_as_exp in - (*k = k + one; or __gmpz_add(k,k,one);*) + (* k = k + one; or __gmpz_add(k,k,one); *) let k_plus_one_stmt = affect_binop ~loc k_as_varinfo (Some k_as_exp) PlusA ty_k k_as_exp one_as_exp in - (*if ty_k is gmpz then the result of the comparison must be interpreted - as true if cond=1 and as false if cond=0 or -1 because of the semantics of - __gmpz_cmp. That differs from the conventional interpretation*) + (* if [ty_k] is gmpz, then the result of the comparison must be interpreted + as [true] if [cond == 1] and as [false] if [cond == 0] or [-1] because of + the semantics of __gmpz_cmp. That differs from the conventional + interpretation. *) let cond_as_exp = if Gmp_types.Z.is_t ty_k then (Cil.mkBinOp ~loc Gt cond_as_exp (Cil.zero ~loc)) else cond_as_exp in - (*statement combination*) + (* statement combination *) let if_stmt = Smart_stmt.if_stmt ~loc ~cond:cond_as_exp ~else_blk: - (Cil.mkBlock [ - Smart_stmt.block_stmt lbd_stmt; acc_plus_lbd_stmt; k_plus_one_stmt - ]) + (Cil.mkBlock + [ Smart_stmt.block_stmt lbd_stmt; + acc_plus_lbd_stmt; + k_plus_one_stmt ]) (Cil.mkBlock [ Smart_stmt.break ~loc ]) in let for_stmt = @@ -282,7 +291,7 @@ and extended_quantifier_to_exp ~adata ~loc kf env t t_min t_max lambda name = let adata, env = Assert.register_term ~loc kf env t acc_as_exp adata in acc_as_exp, adata, env, Typed_number.C_number, "" | _ -> - assert false (* unreachable branch *) + assert false and context_insensitive_term_to_exp ~adata kf env t = let loc = t.term_loc in diff --git a/src/plugins/e-acsl/tests/arith/oracle/extended_quantifiers.res.oracle b/src/plugins/e-acsl/tests/arith/oracle/extended_quantifiers.res.oracle index 5e6f5a2c5ad8e1a5e21fa9c4a2ece5b2542785e3..b7eeb0e3976dd9cdc7967be9347ee32819c5d572 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/extended_quantifiers.res.oracle +++ b/src/plugins/e-acsl/tests/arith/oracle/extended_quantifiers.res.oracle @@ -30,14 +30,6 @@ function __e_acsl_assert, behavior blocking: precondition got status unknown. [eva:alarm] tests/arith/extended_quantifiers.c:15: Warning: assertion got status unknown. -[eva:alarm] tests/arith/extended_quantifiers.c:16: Warning: - signed overflow. - assert __gen_e_acsl_accumulator_6 + __gen_e_acsl_lambda_6 ≤ 2147483647; -[eva:alarm] tests/arith/extended_quantifiers.c:16: Warning: - signed overflow. - assert -2147483648 ≤ __gen_e_acsl_accumulator_6 + __gen_e_acsl_lambda_6; -[eva:alarm] tests/arith/extended_quantifiers.c:16: Warning: - signed overflow. assert __gen_e_acsl_accumulator_6 + 1 ≤ 2147483647; [eva:alarm] tests/arith/extended_quantifiers.c:16: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. [eva:alarm] tests/arith/extended_quantifiers.c:16: Warning: diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c b/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c index a0e149f92f43d13fca7b6a8f593082da26685826..a72ff215733ff39817b372797141af41c4b52ecb 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c @@ -218,8 +218,8 @@ int main(void) unsigned int __gen_e_acsl_k_6; unsigned int __gen_e_acsl_one_6; int __gen_e_acsl_cond_6; - int __gen_e_acsl_lambda_6; - int __gen_e_acsl_accumulator_6; + unsigned int __gen_e_acsl_lambda_6; + unsigned int __gen_e_acsl_accumulator_6; __gen_e_acsl_one_6 = 1; __gen_e_acsl_cond_6 = 0; __gen_e_acsl_lambda_6 = 0; @@ -229,26 +229,13 @@ int main(void) __gen_e_acsl_cond_6 = __gen_e_acsl_k_6 > 2147483647U; if (__gen_e_acsl_cond_6) break; else { - __gen_e_acsl_lambda_6 = (int)__gen_e_acsl_k_6; - /*@ assert - Eva: signed_overflow: - __gen_e_acsl_accumulator_6 + __gen_e_acsl_lambda_6 ≤ - 2147483647; - */ - /*@ assert - Eva: signed_overflow: - -2147483648 ≤ - __gen_e_acsl_accumulator_6 + __gen_e_acsl_lambda_6; - */ + __gen_e_acsl_lambda_6 = __gen_e_acsl_k_6; __gen_e_acsl_accumulator_6 += __gen_e_acsl_lambda_6; __gen_e_acsl_k_6 += __gen_e_acsl_one_6; } } - /*@ assert - Eva: signed_overflow: __gen_e_acsl_accumulator_6 + 1 ≤ 2147483647; - */ - __e_acsl_assert((unsigned int)(__gen_e_acsl_accumulator_6 + 1) > 2147483647U, - 1,"Assertion","main", + __e_acsl_assert(__gen_e_acsl_accumulator_6 + 1U > 2147483647U,1, + "Assertion","main", "\\sum(2147483647, 2147483647, \\lambda integer k; k) + 1 > 2147483647", "tests/arith/extended_quantifiers.c",16); } @@ -381,8 +368,8 @@ int main(void) int __gen_e_acsl_k_11; int __gen_e_acsl_one_10; int __gen_e_acsl_cond_10; - unsigned int __gen_e_acsl_lambda_10; - unsigned int __gen_e_acsl_accumulator_10; + unsigned long __gen_e_acsl_lambda_10; + unsigned long __gen_e_acsl_accumulator_10; __gen_e_acsl_one_10 = 1; __gen_e_acsl_cond_10 = 0; __gen_e_acsl_lambda_10 = 0; @@ -392,7 +379,7 @@ int main(void) __gen_e_acsl_cond_10 = __gen_e_acsl_k_11 > 10; if (__gen_e_acsl_cond_10) break; else { - __gen_e_acsl_lambda_10 = (unsigned int)__gen_e_acsl_k_11; + __gen_e_acsl_lambda_10 = (unsigned long)__gen_e_acsl_k_11; __gen_e_acsl_accumulator_10 *= __gen_e_acsl_lambda_10; /*@ assert Eva: signed_overflow: @@ -401,7 +388,7 @@ int main(void) __gen_e_acsl_k_11 += __gen_e_acsl_one_10; } } - __e_acsl_assert(__gen_e_acsl_accumulator_10 == 3628800U,1,"Assertion", + __e_acsl_assert(__gen_e_acsl_accumulator_10 == 3628800UL,1,"Assertion", "main", "\\product(1, 10, \\lambda integer k; k) == 3628800", "tests/arith/extended_quantifiers.c",23);