From 3e1613da9ec1ff12d03e0c438304187f9a479462 Mon Sep 17 00:00:00 2001 From: Julien Signoles <julien.signoles@cea.fr> Date: Mon, 29 Apr 2019 15:21:46 +0200 Subject: [PATCH] [translate] better code generation for logic function calls --- src/plugins/e-acsl/at_with_lscope.ml | 83 +- src/plugins/e-acsl/dup_functions.ml | 3 +- src/plugins/e-acsl/env.ml | 60 +- src/plugins/e-acsl/env.mli | 14 +- src/plugins/e-acsl/gmpz.ml | 3 +- src/plugins/e-acsl/interval.ml | 2 +- src/plugins/e-acsl/keep_status.ml | 8 +- src/plugins/e-acsl/logic_functions.ml | 720 ++++------- src/plugins/e-acsl/logic_functions.mli | 20 +- src/plugins/e-acsl/loops.ml | 4 +- src/plugins/e-acsl/tests/gmp/functions_rec.c | 10 +- .../tests/gmp/oracle/functions.0.res.oracle | 9 +- .../tests/gmp/oracle/functions.1.res.oracle | 24 +- .../gmp/oracle/functions_rec.0.res.oracle | 86 +- .../gmp/oracle/functions_rec.1.res.oracle | 109 +- .../e-acsl/tests/gmp/oracle/gen_functions.c | 322 ++--- .../e-acsl/tests/gmp/oracle/gen_functions2.c | 405 +++--- .../tests/gmp/oracle/gen_functions_rec.c | 663 ++-------- .../tests/gmp/oracle/gen_functions_rec2.c | 1123 +++++++---------- .../tests/temporal/oracle/t_getenv.res.oracle | 2 +- .../tests/temporal/oracle/t_memcpy.res.oracle | 3 +- src/plugins/e-acsl/translate.ml | 64 +- src/plugins/e-acsl/typing.ml | 90 +- src/plugins/e-acsl/typing.mli | 10 +- src/plugins/e-acsl/visit.ml | 16 +- 25 files changed, 1576 insertions(+), 2277 deletions(-) diff --git a/src/plugins/e-acsl/at_with_lscope.ml b/src/plugins/e-acsl/at_with_lscope.ml index c4981badab3..9602bb5b614 100644 --- a/src/plugins/e-acsl/at_with_lscope.ml +++ b/src/plugins/e-acsl/at_with_lscope.ml @@ -237,46 +237,47 @@ let to_exp ~loc kf env pot label = end in let ty_ptr = TPtr(ty, []) in - let vi_at, e_at, env = Env.new_var - ~loc - ~name:"at" - ~scope:Env.Function - env - None - ty_ptr - (fun vi e -> - (* Handle [malloc] and [free] stmts *) - let lty_sizeof = Ctype Cil.(theMachine.typeOfSizeOf) in - let t_sizeof = Logic_const.term ~loc (TSizeOf ty) lty_sizeof in - let t_size = size_from_sizes_and_shifts ~loc sizes_and_shifts in - let t_size = - Logic_const.term ~loc (TBinOp(Mult, t_sizeof, t_size)) lty_sizeof - in - Typing.type_term ~use_gmp_opt:false t_size; - let malloc_stmt = match Typing.get_integer_ty t_size with - | Typing.C_type IInt -> - let e_size, _ = term_to_exp kf env t_size in - let e_size = Cil.constFold false e_size in - let malloc_stmt = - Misc.mk_call ~loc ~result:(Cil.var vi) "malloc" [e_size] - in - malloc_stmt - | Typing.C_type _ | Typing.Gmp -> - Error.not_yet - "\\at on purely logic variables that needs to allocate \ - too much memory (bigger than int_max bytes)" - | Typing.Other -> - Options.fatal - "quantification over non-integer type is not part of E-ACSL" - in - let free_stmt = Misc.mk_call ~loc "free" [e] in - (* The list of stmts returned by the current closure are inserted - LOCALLY to the block where the new var is FIRST used, whatever scope - is indicated to [Env.new_var]. - Thus we need to add [malloc] and [free] through dedicated functions. *) - Malloc.add kf malloc_stmt; - Free.add kf free_stmt; - []) + let vi_at, e_at, env = + Env.new_var + ~loc + ~name:"at" + ~scope:Env.Function + env + None + ty_ptr + (fun vi e -> + (* Handle [malloc] and [free] stmts *) + let lty_sizeof = Ctype Cil.(theMachine.typeOfSizeOf) in + let t_sizeof = Logic_const.term ~loc (TSizeOf ty) lty_sizeof in + let t_size = size_from_sizes_and_shifts ~loc sizes_and_shifts in + let t_size = + Logic_const.term ~loc (TBinOp(Mult, t_sizeof, t_size)) lty_sizeof + in + Typing.type_term ~use_gmp_opt:false t_size; + let malloc_stmt = match Typing.get_integer_ty t_size with + | Typing.C_type IInt -> + let e_size, _ = term_to_exp kf env t_size in + let e_size = Cil.constFold false e_size in + let malloc_stmt = + Misc.mk_call ~loc ~result:(Cil.var vi) "malloc" [e_size] + in + malloc_stmt + | Typing.C_type _ | Typing.Gmp -> + Error.not_yet + "\\at on purely logic variables that needs to allocate \ + too much memory (bigger than int_max bytes)" + | Typing.Other -> + Options.fatal + "quantification over non-integer type is not part of E-ACSL" + in + let free_stmt = Misc.mk_call ~loc "free" [e] in + (* The list of stmts returned by the current closure are inserted + LOCALLY to the block where the new var is FIRST used, whatever scope + is indicated to [Env.new_var]. Thus we need to add [malloc] and + [free] through dedicated functions. *) + Malloc.add kf malloc_stmt; + Free.add kf free_stmt; + []) in (* Index *) let t_index = index_from_sizes_and_shifts ~loc sizes_and_shifts in @@ -337,4 +338,4 @@ let to_exp ~loc kf env pot label = (* Returning *) let lval_at_index, env = lval_at_index ~loc kf env (e_at, vi_at, t_index) in let e = Cil.new_exp ~loc (Lval lval_at_index) in - e, env \ No newline at end of file + e, env diff --git a/src/plugins/e-acsl/dup_functions.ml b/src/plugins/e-acsl/dup_functions.ml index 1e4b879d319..0deac191f99 100644 --- a/src/plugins/e-acsl/dup_functions.ml +++ b/src/plugins/e-acsl/dup_functions.ml @@ -123,7 +123,8 @@ let dup_fundec loc spec bhv sound_verdict_vi kf vi new_vi = if vi.vname = "" then (* unnamed formal parameter: must generate a fresh name since a fundec cannot have unnamed formals (see bts #2303). *) - Env.Varname.get ~scope:Env.Function + Env.Varname.get + ~scope:Env.Function (Functions.RTL.mk_gen_name "unamed_formal") else vi.vname diff --git a/src/plugins/e-acsl/env.ml b/src/plugins/e-acsl/env.ml index e987bd4f613..fd2e6d3b208 100644 --- a/src/plugins/e-acsl/env.ml +++ b/src/plugins/e-acsl/env.ml @@ -24,6 +24,11 @@ module E_acsl_label = Label open Cil_types open Cil_datatype +type localized_scope = + | LGlobal + | LFunction of kernel_function + | LLocal_block of kernel_function + type scope = | Global | Function @@ -55,7 +60,7 @@ type t = lscope: Lscope.t; lscope_reset: bool; annotation_kind: Misc.annotation_kind; - new_global_vars: (varinfo * scope) list; + new_global_vars: (varinfo * localized_scope) list; (* generated variables. The scope indicates the level where the variable should be added. *) global_mpz_tbl: mpz_tbl; @@ -141,6 +146,19 @@ let has_no_new_stmt env = let local, _ = top env in local.block_info = empty_block +let current_kf env = + let v = env.visitor in + match v#current_kf with + | None -> None + | Some kf -> Some (Cil.get_kernel_function v#behavior kf) + +let set_current_kf env kf = + let v = env.visitor in + v#set_current_kf kf + +let get_visitor env = env.visitor +let get_behavior env = env.visitor#behavior + (* ************************************************************************** *) (** {2 Loop invariants} *) (* ************************************************************************** *) @@ -189,6 +207,11 @@ let do_new_var ~loc ?(scope=Local_block) ?(name="") env t ty mk_stmts = ty in v.vreferenced <- true; + let lscope = match scope with + | Global -> LGlobal + | Function -> LFunction (Extlib.the (current_kf env)) + | Local_block -> LLocal_block (Extlib.the (current_kf env)) + in (* Options.feedback "new variable %a (global? %b)" Varinfo.pretty v global;*) let e = Cil.evar v in let stmts = mk_stmts v e in @@ -222,7 +245,7 @@ let do_new_var ~loc ?(scope=Local_block) ?(name="") env t ty mk_stmts = (* also memoize the new variable, but must never be used *) { env with cpt = n; - new_global_vars = (v, scope) :: env.new_global_vars; + new_global_vars = (v, lscope) :: env.new_global_vars; global_mpz_tbl = extend_tbl env.global_mpz_tbl; env_stack = local_env :: tl_env } | Local_block -> @@ -234,9 +257,9 @@ let do_new_var ~loc ?(scope=Local_block) ?(name="") env t ty mk_stmts = { env with cpt = n; env_stack = local_env :: tl_env; - new_global_vars = (v, scope) :: env.new_global_vars } + new_global_vars = (v, lscope) :: env.new_global_vars } end else - let new_global_vars = (v, scope) :: env.new_global_vars in + let new_global_vars = (v, lscope) :: env.new_global_vars in let local_env = { local_env with block_info = new_block; @@ -262,10 +285,8 @@ let new_var ~loc ?(scope=Local_block) ?name env t ty mk_stmts = do_new_var ~loc ~scope ?name env t ty mk_stmts in match scope with - | Global | Function -> - memo env.global_mpz_tbl - | Local_block -> - memo local_env.mpz_tbl + | Global | Function -> memo env.global_mpz_tbl + | Local_block -> memo local_env.mpz_tbl let new_var_and_mpz_init ~loc ?scope ?name env t mk_stmts = new_var @@ -299,8 +320,7 @@ module Logic_binding = struct | Ltype _ as ty when Logic_const.is_boolean_type ty -> Cil.charType | Ltype _ | Lvar _ | Lreal | Larrow _ as lty -> let msg = - Format.asprintf - "logic variable of type %a" Logic_type.pretty lty + Format.asprintf "logic variable of type %a" Logic_type.pretty lty in Error.not_yet msg in @@ -324,26 +344,12 @@ module Logic_binding = struct let remove env logic_v = try let varinfos = Logic_var.Map.find logic_v env.var_mapping in - ignore (Stack.pop varinfos); - env + ignore (Stack.pop varinfos) with Not_found | Stack.Empty -> assert false end -let current_kf env = - let v = env.visitor in - match v#current_kf with - | None -> None - | Some kf -> Some (Cil.get_kernel_function v#behavior kf) - -let set_current_kf env kf = - let v = env.visitor in - v#set_current_kf kf - -let get_visitor env = env.visitor -let get_behavior env = env.visitor#behavior - module Logic_scope = struct let get env = env.lscope let extend env lvs = { env with lscope = Lscope.add lvs env.lscope } @@ -512,7 +518,9 @@ module Context = struct { env with new_global_vars = List.filter (fun (v, scope) -> - (scope = Global || scope = Function) + (match scope with + | LGlobal | LFunction _ -> true + | LLocal_block _ -> false) && List.for_all (fun (v', _) -> v != v') vars) !ctx @ vars } diff --git a/src/plugins/e-acsl/env.mli b/src/plugins/e-acsl/env.mli index abb50cb87e9..d3d408eb20d 100644 --- a/src/plugins/e-acsl/env.mli +++ b/src/plugins/e-acsl/env.mli @@ -36,6 +36,11 @@ val has_no_new_stmt: t -> bool (** Assume that a local context has been previously pushed. @return true iff the given env does not contain any new statement. *) +type localized_scope = + | LGlobal + | LFunction of kernel_function + | LLocal_block of kernel_function + type scope = | Global | Function @@ -75,8 +80,9 @@ module Logic_binding: sig val get: t -> logic_var -> varinfo (* Return the latest C binding. *) - val remove: t -> logic_var -> t + val remove: t -> logic_var -> unit (* Remove the latest C binding. *) + end val add_assert: t -> stmt -> predicate -> unit @@ -115,10 +121,8 @@ val pop: t -> t val transfer: from:t -> t -> t (** Pop the last local context of [from] and push it into the other env. *) -val get_generated_variables: t -> (varinfo * scope) list -(** All the new variables local to the visited function. - The boolean indicates whether the varinfo must be added to the outermost - function block. *) +val get_generated_variables: t -> (varinfo * localized_scope) list +(** All the new variables local to the visited function. *) val get_visitor: t -> Visitor.generic_frama_c_visitor val get_behavior: t -> Cil.visitor_behavior diff --git a/src/plugins/e-acsl/gmpz.ml b/src/plugins/e-acsl/gmpz.ml index 91c7c05e864..54e5597f325 100644 --- a/src/plugins/e-acsl/gmpz.ml +++ b/src/plugins/e-acsl/gmpz.ml @@ -54,7 +54,8 @@ let t_ptr () = TNamed( }, []) -let is_t ty = Cil_datatype.Typ.equal ty (t ()) +let is_t ty = + Cil_datatype.Typ.equal ty (t ()) || Cil_datatype.Typ.equal ty (t_ptr ()) let apply_on_var ~loc funname e = Misc.mk_call ~loc ("__gmpz_" ^ funname) [ e ] let init ~loc e = apply_on_var "init" ~loc e diff --git a/src/plugins/e-acsl/interval.ml b/src/plugins/e-acsl/interval.ml index bb8c0e6cba3..0332ee10c8f 100644 --- a/src/plugins/e-acsl/interval.ml +++ b/src/plugins/e-acsl/interval.ml @@ -348,7 +348,7 @@ and infer_term_lval (host, offset as tlv) = let ty = Logic_utils.logicCType (Cil.typeOfTermLval tlv) in interv_of_typ ty -and infer_term_host h = match h with +and infer_term_host = function | TVar v -> (try Env.find v with Not_found -> diff --git a/src/plugins/e-acsl/keep_status.ml b/src/plugins/e-acsl/keep_status.ml index 69da4223348..78c2d9551da 100644 --- a/src/plugins/e-acsl/keep_status.ml +++ b/src/plugins/e-acsl/keep_status.ml @@ -131,10 +131,11 @@ let must_translate kf kind = duplicate by [Dup_function] but they are still associated to the original function here *) let name = Functions.RTL.get_original_name kf in + try let info = - try Datatype.String.Hashtbl.find keep_status name - with Not_found -> - Options.fatal "[keep_status] unbound function" Datatype.String.pretty kf +(* try*) Datatype.String.Hashtbl.find keep_status name +(* with Not_found -> + Options.fatal "[keep_status] unbound function" Datatype.String.pretty kf*) in info.cpt <- info.cpt + 1; let kind', keep = @@ -148,3 +149,4 @@ let must_translate kf kind = pretty_kind kind pretty_kind kind'; keep + with Not_found -> true diff --git a/src/plugins/e-acsl/logic_functions.ml b/src/plugins/e-acsl/logic_functions.ml index 516127af015..8955a154b25 100644 --- a/src/plugins/e-acsl/logic_functions.ml +++ b/src/plugins/e-acsl/logic_functions.ml @@ -21,19 +21,13 @@ (**************************************************************************) open Cil_types - -type lfsig_info = { (* Logic Function SIGnature INFOrmation *) - lfs_li: logic_info; (* the logic definition, - base template to be specialized *) - lfs_args_lty: logic_type list; (* types of the args for the specialization *) - lfs_lty: logic_type (* return type for the specialization *) -} +open Cil_datatype (**************************************************************************) (********************** Forward references ********************************) (**************************************************************************) -let predicate_to_exp_ref +let named_predicate_to_exp_ref : (kernel_function -> Env.t -> predicate -> exp * Env.t) ref = Extlib.mk_fun "named_predicate_to_exp_ref" @@ -41,464 +35,310 @@ let term_to_exp_ref : (kernel_function -> Env.t -> term -> exp * Env.t) ref = Extlib.mk_fun "term_to_exp_ref" -let add_cast_ref - : (location -> Env.t -> typ option -> bool -> exp -> exp * Env.t) ref - = Extlib.mk_fun "add_cast_ref" +(*****************************************************************************) +(************************** Auxiliary functions* ****************************) +(*****************************************************************************) + +(* @return true iff the result of the function is provided by reference as the + first extra argument at each call *) +let result_as_extra_argument = Gmpz.is_t +(* TODO: to be extended to any compound type? E.g. returning a struct is not + good practice... *) (*****************************************************************************) (****************** Generation of function bodies ****************************) (*****************************************************************************) -let get_fundec kf = - try Kernel_function.get_definition kf - with Kernel_function.No_Definition -> - Options.fatal "no definition for function %a" Kernel_function.pretty kf +(* Generate the block of code containing the statement assigning [e] to [ret_vi] + (the result). *) +let generate_return_block ~loc env ret_vi e = match e.enode with + | Lval (Var _, NoOffset) -> + (* the returned value is a variable: Cil invariant preserved; + no need of [ret_vi] *) + let return_retres = Cil.mkStmt ~valid_sid:true (Return (Some e, loc)) in + let b, env = + Env.pop_and_get env return_retres ~global_clear:false Env.After + in + b.blocals <- b.blocals; + b.bscoping <- true; + b, env + | _ -> + (* the returned value is _not_ a variable: restore the invariant *) + let init = AssignInit (SingleInit e) in + let set = + Cil.mkStmtOneInstr ~valid_sid:true (Local_init (ret_vi, init, loc)) + in + let return = + Cil.mkStmt ~valid_sid:true (Return (Some (Cil.evar ~loc ret_vi), loc)) + in + let b, env = Env.pop_and_get env set ~global_clear:false Env.Middle in + ret_vi.vdefined <- true; + b.blocals <- ret_vi :: b.blocals; + b.bstmts <- b.bstmts @ [ return ]; + b.bscoping <- true; + b, env + +(* Generate the function's body for predicates. *) +let pred_to_block ~loc kf env ret_vi p = + Typing.type_named_predicate ~must_clear:false p; + let e, env = !named_predicate_to_exp_ref kf env p in + (* for predicate, since the result is either 0 or 1, return it directly (it + cannot be provided as extra argument *) + generate_return_block ~loc env ret_vi e -(* Determine the C typ corresponding to a formal argument based on its logic - type. In particular, [arg_typ_from_lty] MUST NOT return arrays: - they should be converted into pointers. *) -let arg_typ_from_lty lty = match lty with - | Linteger -> - Gmpz.t_ptr () (* but not [Gmpz.t] as returned by [Typing.typ_of_lty] *) - | Lreal -> - Error.not_yet "[arg_typ_from_lty] reals" (* TODO: handle in MR !226 *) - | Ctype _ | Ltype _ | Lvar _ | Larrow _ -> - let typ = Typing.typ_of_lty lty in - if Cil.isArrayType typ then Error.not_yet "[arg_typ_from_lty] array" - else typ +(* Generate the function's body for terms. *) +let term_to_block ~loc kf env ret_ty ret_vi t = + Typing.type_term ~use_gmp_opt:false ~ctx:(Typing.integer_ty_of_typ ret_ty) t; + let e, env = !term_to_exp_ref kf env t in + if Cil.isVoidType ret_ty then + (* if the function's result is a GMP, it is the first parameter of the + function (by reference). *) + let set = + let lv_star_ret = Cil.mkMem ~addr:(Cil.evar ~loc ret_vi) ~off:NoOffset in + let star_ret = Cil.new_exp ~loc (Lval lv_star_ret) in + Gmpz.init_set ~loc lv_star_ret star_ret e + in + let return_void = Cil.mkStmt ~valid_sid:true (Return (None, loc)) in + let b, env = Env.pop_and_get env set ~global_clear:false Env.Middle in + b.bstmts <- b.bstmts @ [ return_void ]; + b.bscoping <- true; + b, env + else + generate_return_block ~loc env ret_vi e + +let generate_body ~loc kf env ret_ty ret_vi = function + | LBnone | LBreads _ -> + Options.abort + "logic function or predicate without explicit definition are not part of \ + E-ACSL" + | LBterm t -> term_to_block ~loc kf env ret_ty ret_vi t + | LBpred p -> pred_to_block ~loc kf env ret_vi p + | LBinductive _ -> Error.not_yet "inductive definition" -(* Creates a new [kf] with an empty body. Its body is to be filled - through [fill_kf] afterwards. These two operations are purposefully - made distinct in order to avoid non-termination in case of recursive - definitions. *) -let empty_kf lfs typ = - let li = lfs.lfs_li in - let fname = - Functions.RTL.mk_gen_name - (Env.Varname.get ~scope:Env.Global li.l_var_info.lv_name) +(* Generate a kernel function from a given logic info [li] *) +let generate_kf ~loc fname env ret_ty params_ty li = + (* build the formal parameters *) + let params, params_ty = + List.fold_right2 + (fun lvi pty (params, params_ty) -> + let ty = match pty with + | Typing.Gmp -> + (* GMP's integer are arrays: consider them as pointers in function's + parameters *) + Gmpz.t_ptr () + | Typing.C_type ik -> TInt(ik, []) + | Typing.Other -> Typing.typ_of_lty lvi.lv_type + in + (* build the formals: cannot use [Cil.makeFormal] since the function + does not yet exist *) + let vi = Cil.makeVarinfo false true lvi.lv_name ty in + vi :: params, (lvi.lv_name, ty, []) :: params_ty) + li.l_profile + params_ty + ([], []) + in + (* build the varinfo storing the result *) + let ret_vi, ret_ty, params_with_ret, params_ty_with_ret = + let vname = "__retres" in + if result_as_extra_argument ret_ty then + let ret_ty_ptr = TPtr(ret_ty, []) (* call by reference *) in + let vname = vname ^ "_arg" in + let vi = Cil.makeVarinfo false true vname ret_ty_ptr in + vi, Cil.voidType, vi :: params, (vname, ret_ty_ptr, []) :: params_ty + else + Cil.makeVarinfo false false vname ret_ty, ret_ty, params, params_ty in - let is_not_returnable = Cil.isArrayType typ in - let ty_f = if is_not_returnable then Cil.voidType else typ in - let vi_f = Cil.makeGlobalVar - fname - (TFun - (ty_f, - None, (* Typs of the arguments. Will be updated in the following - through [Cil.makeFormalVar] *) - false, - li.l_var_info.lv_attr)) + (* build the function's varinfo *) + let vi = + Cil.makeGlobalVar + fname + (TFun + (ret_ty, + Some params_ty_with_ret, + false, + li.l_var_info.lv_attr)) in + vi.vdefined <- true; + (* create the fundec *) let fundec = - { svar = vi_f; - sformals = []; (* Will be updated in the following - through [Cil.makeFormalVar] *) - slocals = []; (* Will be updated by [fill_kf] *) + { svar = vi; + sformals = params_with_ret; + slocals = []; (* filled later to break mutual dependencies between + creating this list and creating the kf *) smaxid = 0; - sbody = Cil.mkBlock []; (* Will be updated by [fill_kf] *) + sbody = Cil.mkBlock []; (* filled later; same as above *) smaxstmtid = None; sallstmts = []; - sspec = Cil.empty_funspec () } + sspec = Cil.empty_funspec () } in - (* Now updating information on arguments *) - List.iter2 - (fun lv lty -> - let name = Functions.RTL.mk_gen_name lv.lv_name ^ "_arg" in - let typ = arg_typ_from_lty lty in - ignore (Cil.makeFormalVar fundec ~where:"$" name typ)) - li.l_profile - lfs.lfs_args_lty; - if is_not_returnable then - (* If the result of the function cannot be returned, - then define it as being the (additional) first argument *) - ignore (Cil.makeFormalVar - fundec - ~where:"^" - "__retres_arg" - (arg_typ_from_lty (Extlib.the li.l_type))); - (* Creating and returning the kf *) - { fundec = Definition(fundec, Cil_datatype.Location.unknown); - spec = Cil.empty_funspec () } - -(* Bind arguments to the intervals corresponding to their logic type. *) -let add_interv_bindings lfs = - List.iter2 - (fun lv lty -> - match lty with - | Linteger -> - let i = Ival.inject_range None None in - Interval.Env.add lv i - | Ctype (TFloat _) -> (* TODO: handle in MR !226 *) - () - | Lreal -> - Error.not_yet "real numbers" - | Ctype (TInt(ik, _)) -> - let i = Interval.interv_of_typ (TInt(ik, [])) in - Interval.Env.add lv i - | Ctype _ -> - () - | Ltype _ | Lvar _ | Larrow _ -> - Options.fatal "unexpected logic type") - lfs.lfs_li.l_profile - lfs.lfs_args_lty - -let remove_interv_bindings lfs = - List.iter - (fun lv -> Interval.Env.remove lv) - lfs.lfs_li.l_profile - -let retype lfs = match lfs.lfs_li.l_body with - | LBpred p -> - Typing.clear_all_pred_or_term (Misc.PoT_pred p); - Typing.type_named_predicate ~must_clear:false p - | LBterm t -> - Typing.clear_all_pred_or_term (Misc.PoT_term t); - Typing.type_term ~use_gmp_opt:true t - | LBnone -> - Error.not_yet "logic functions with no definition nor reads clause" - | LBreads _ -> - Error.not_yet "logic functions performing read accesses" - | LBinductive _ -> - Error.not_yet "logic functions inductively defined" - -(* Bind lv to C variables. - Case A: lv can be directly binded to the formal arg fo the C function. - Example: the typ corresponding to lv is [int] - Case B: lv CANNOT be directly binded to the formal arg. - This is notably the case for GMP since if they were directly binded, - then the function would free them before returning. Thus copies are - required. *) -let add_varinfo_bindings ~loc kf env lfs = - (* Handle typs that cannot be returned *) - let vi_args = - let fundec = get_fundec kf in - let vi_ty = match fundec.svar.vtype with - | TFun(ty, _, _, _) -> ty - | _ -> assert false + Cil.setMaxId fundec; + let spec = Cil.empty_funspec () in + Queue.add + (fun () -> Globals.Functions.replace_by_definition spec fundec loc) + (Env.get_visitor env)#get_filling_actions; + (* create the kernel function itself *) + let kf = { fundec = Definition(fundec, loc); spec } in + (* closure generating the function's body. + Delay its generation after filling the memoisation table (for termination + of recursive function calls) *) + let gen_body () = + let env = Env.push env in + let old_kf = Extlib.the (Env.current_kf env) in + Env.set_current_kf env kf; + (* fill the typing environment with the function's parameters + before generating the code (code generation invokes typing) *) + let env = + let add env lvi vi = + (match vi.vtype with + | TInt _ as ty -> Interval.Env.add lvi (Interval.interv_of_typ ty) + | ty -> + if Gmpz.is_t ty then + Interval.Env.add lvi (Ival.inject_range None None)); + Env.Logic_binding.add_binding env lvi vi + in + List.fold_left2 add env li.l_profile params in - if Cil_datatype.Typ.equal Cil.voidType vi_ty then - match fundec.sformals with - | [] -> assert false - | _ :: vi_args -> vi_args (* First arg is the result *) - else - fundec.sformals - in - let env = - let lvs_and_ltys = - List.map2 (fun lv lty -> lv, lty) lfs.lfs_li.l_profile lfs.lfs_args_lty + let b, env = generate_body ~loc kf env ret_ty ret_vi li.l_body in + fundec.sbody <- b; + (* add the generated variables in the necessary lists *) + (* TODO: factorized the code below that add the generated vars with method + [add_generated_variables_in_function] in the main visitor *) + let vars = + let l = Env.get_generated_variables env in + if ret_vi.vdefined then (ret_vi, Env.LFunction kf) :: l else l in - List.fold_left2 - (fun env (lv, lty) vi_arg -> - match Typing.ty_of_logic_ty lty with - | Typing.C_type _ | Typing.Other -> - (* Case A *) - Env.Logic_binding.add_binding env lv vi_arg - | Typing.Gmp -> - (* Case B *) - let ty = Typing.typ_of_lty lv.lv_type in - let vi, _, env = Env.Logic_binding.add ~ty env lv in - vi_arg.vtype <- Gmpz.t (); - let stmt = Gmpz.init_set - ~loc (Cil.var vi) (Cil.evar ~loc vi) (Cil.evar ~loc vi_arg) - in - vi_arg.vtype <- Gmpz.t_ptr (); - let env = Env.add_stmt env stmt in - env) - env - lvs_and_ltys - vi_args - in - env - -(* Generate the function's body. For predicates. *) -let pred_to_block ~loc kf env p = - (* Translate *) - let named_predicate_to_exp = !predicate_to_exp_ref in - let e, env = named_predicate_to_exp kf env p in - (* Create the variable [retres] to be returned, - the stmt [set_retres] setting it, - and the stmt [return_retres] returning it. *) - let fundec = get_fundec kf in - let retres = Cil.makeLocalVar fundec "__retres" Cil.intType in - let set_retres = - Cil.mkStmtOneInstr ~valid_sid:true (Set (Cil.var retres, e, loc)) - in - let return_retres = Cil.mkStmt - ~valid_sid:true (Return (Some (Cil.evar ~loc retres), loc)) - in - (* The whole block *) - let b, env = - Env.pop_and_get env set_retres ~global_clear:false Env.Middle - in - b.blocals <- retres :: b.blocals; - b.bstmts <- b.bstmts @ [ return_retres ]; - b.bscoping <- true; (* Kernel details *) - b, env - -(* Generate the function's body. For terms. *) -let term_to_block ~loc kf env t lty (* the return type *) = - let term_to_exp = !term_to_exp_ref in - let e, env = term_to_exp kf env t in - (* Functions that are of primitive types are not retyped - ==> cast needed in case the type system inferred a different type *) - let ctx = Typing.typ_of_lty lty in - let add_cast = !add_cast_ref in - let e, env = add_cast loc env (Some ctx) false e in - (* The body itself *) - let fundec = get_fundec kf in - begin match Typing.ty_of_logic_ty lty with - | Typing.C_type _ | Typing.Other -> - let typ = Typing.get_typ t in - assert (not (Cil_datatype.Typ.equal Cil.voidType typ)); - (* Create the variable [retres] to be returned, - the stmt [set_retres] setting it, - and the stmt [return_retres] returning it. *) - let retres = Cil.makeLocalVar fundec "__retres" typ in - let set_retres = - Cil.mkStmtOneInstr ~valid_sid:true (Set (Cil.var retres, e, loc)) - in - let return_retres = Cil.mkStmt - ~valid_sid:true (Return (Some (Cil.evar ~loc retres), loc)) - in - (* The whole block *) - let b, env = - Env.pop_and_get env set_retres ~global_clear:false Env.Middle + let locals, blocks = + List.fold_left + (fun (local_vars, block_vars as acc) (v, scope) -> match scope with + | Env.LFunction kf' when Kernel_function.equal kf kf' -> + v :: local_vars, block_vars + | Env.LLocal_block kf' when Kernel_function.equal kf kf' -> + v :: local_vars, block_vars + | _ -> acc) + (fundec.slocals, fundec.sbody.blocals) + vars in - b.blocals <- retres :: b.blocals; - b.bstmts <- b.bstmts @ [ return_retres ]; - b.bscoping <- true; (* Kernel details *) - b, env - | Typing.Gmp -> - (* GMPs are not returned but given as (additional) first argument - to the function. *) - let set_first_arg = - let first_arg = List.hd fundec.sformals in - Misc.mk_call - (* We cannot call [Gmpz.set] since it will only make an alias *) - ~loc "__gmpz_init_set" [ Cil.evar ~loc first_arg; e ] - in - let return_void = Cil.mkStmt ~valid_sid:true (Return (None, loc)) in - (* The whole block *) - let b, env = - Env.pop_and_get env set_first_arg ~global_clear:false Env.Middle - in - b.bstmts <- b.bstmts @ [ return_void ]; - b.bscoping <- true; (* Kernel details *) - b, env - end - -(* Fill [kf]'s body based on [lfs]. See also: [empty_kf]. *) -let fill_kf lfs kf = - (* Init env *) - let env = Env.push Env.dummy in - Env.set_current_kf env kf; - let loc = Cil_datatype.Location.unknown in - let env = add_varinfo_bindings ~loc kf env lfs in - (* Create kf's body (the fundec's block) *) - let b, env = match lfs.lfs_li.l_body with - | LBpred p -> - pred_to_block ~loc kf env p - | LBterm t -> - term_to_block ~loc kf env t lfs.lfs_lty - | LBnone -> - Error.not_yet "logic functions with no definition nor reads clause" - | LBreads _ -> - Error.not_yet "logic functions performing read accesses" - | LBinductive _ -> - Error.not_yet "logic functions inductively defined" - in - (* Fill the fundec *) - let fundec = get_fundec kf in - fundec.sbody <- b; - let new_vars = - List.map (fun (vi, _) -> vi) (Env.get_generated_variables env) + fundec.slocals <- locals; + fundec.sbody.blocals <- blocks; + List.iter + (fun lvi -> + Interval.Env.remove lvi; + ignore (Env.Logic_binding.remove env lvi)) + li.l_profile; + Env.set_current_kf + env + (Cil.get_original_kernel_function (Env.get_behavior env) old_kf) in - fundec.slocals <- fundec.slocals @ new_vars + vi, kf, gen_body (**************************************************************************) (***************************** Memoization ********************************) (**************************************************************************) -module Memo = Hashtbl.Make(struct - type t = lfsig_info - let equal lfs1 lfs2 = - Cil_datatype.Logic_info.equal lfs1.lfs_li lfs2.lfs_li - && Cil_datatype.Logic_type.equal lfs1.lfs_lty lfs2.lfs_lty - && List.for_all2 - Cil_datatype.Logic_type.equal - lfs1.lfs_args_lty - lfs2.lfs_args_lty - let hash lfs = - Cil_datatype.Logic_info.hash lfs.lfs_li - + 257 * let module L = Datatype.List(Cil_datatype.Logic_type) in - L.hash (lfs.lfs_lty :: lfs.lfs_args_lty) -end) - -let tbl = Memo.create 7 - -let memo lfs typ = - try Memo.find tbl lfs - with Not_found -> - (* We need to create a new [kf]. It is done as follows: - Step 1: Create a [kf] with an empty body - Step 2: Memoize it - Step 3: Fill it - In particular, its body CANNOT be filled during its creation: it would - lead to non-termination for recursive definitions. *) - (* Step 1 *) - let kf = empty_kf lfs typ in - (* Step 2 *) - Memo.add tbl lfs kf; - (* Step 3 *) - fill_kf lfs kf; - (* Kernel details *) - let fundec = get_fundec kf in - fundec.svar.vdefined <- true; - Globals.Functions.register kf; - (* Return *) - kf - -(* Returns all the [kf] that have been constructed and memoized - so far for the given [logic_info]. *) -let find_kfs li = - Memo.fold - (fun lfs kf l -> - if Cil_datatype.Logic_info.equal lfs.lfs_li li then kf :: l - else l) - tbl - [] +module Params_ty = + Datatype.List_with_collections + (Typing.Datatype) + (struct let module_name = "E_ACSL.Logic_functions.Params_ty" end) -let reset () = Memo.reset tbl +(* for each logic_info, associate its possible profiles, i.e. the types of its + parameters + the generated varinfo for the function *) +let memo_tbl: + kernel_function Params_ty.Hashtbl.t Logic_info.Hashtbl.t + = Logic_info.Hashtbl.create 7 -(*****************************************************************************) -(****************** Generation of function calls *****************************) -(*****************************************************************************) +let reset () = Logic_info.Hashtbl.clear memo_tbl -let generate ~loc env t li args args_lty = - let name = li.l_var_info.lv_name ^ "_tapp" in - let mk_call vi = - (* Building the arguments 1/3: If the result is an array (e.g. gmp), then it - cannot be returned. Thus we let it be the (additional) first - argument. *) - let vi_f_typ = Typing.get_typ t in - let args, lvl_opt = - if Cil.isArrayType vi_f_typ then Cil.evar ~loc vi :: args, None - else args, Some (Cil.var vi) - in - (* Building the arguments 2/3: AST sanity: arrays that are given as - arguments of functions must be explicitely indicated as being pointers *) - let args = - List.map - (fun arg -> - if Cil_datatype.Typ.equal (Cil.typeOf arg) (Gmpz.t ()) then - (* TODO: real numbers *) - Cil.mkCast ~force:true ~e:arg ~newt:(Gmpz.t_ptr ()) - else - arg) - args - in - (* Building the arguments 3/3: E-ACSL typing: short and other integer types - less than int are casted into int *) - let args = - List.map - (fun arg -> - match Cil.typeOf arg with - | TInt(kind, _) -> - if Cil.intTypeIncluded kind IInt then - Cil.mkCast ~force:false ~e:arg ~newt:Cil.intType - else - arg - | TVoid _ | TFloat _ | TPtr _ | TArray _ | TFun _ | TNamed _ - | TComp _ |TEnum _ | TBuiltin_va_list _ -> - arg) - args - in - let lty = match Typing.get_integer_ty t with - | Typing.Gmp -> Linteger - | Typing.C_type ik -> Ctype (TInt (ik, [])) - | Typing.Other -> t.term_type - in - let lfs = { lfs_li = li; lfs_lty = lty; lfs_args_lty = args_lty } in - (* Memoization. We MUST guarantee that interval and type bindings - for logic vars, terms and predicates from the logic definition of - the function are restored after memoization. *) - add_interv_bindings lfs; - retype lfs; - let kf = memo lfs vi_f_typ in - remove_interv_bindings lfs; - retype lfs; - (* The call stmt *) - let fundec = get_fundec kf in - let vi_f = fundec.svar in - Cil.mkStmtOneInstr (Call (lvl_opt, Cil.evar vi_f, args, loc)) +let add_generated_functions globals = + let rec aux acc = function + | [] -> + acc + | GAnnot(Dfun_or_pred(li, loc), _) as g :: l -> + let acc = g :: acc in + (try + (* add the declarations close to its corresponding logic function or + predicate *) + let params = Logic_info.Hashtbl.find memo_tbl li in + let add_fundecl kf acc = + GFunDecl(Cil.empty_funspec (), Kernel_function.get_vi kf, loc) + :: acc + in + aux (Params_ty.Hashtbl.fold (fun _ -> add_fundecl) params acc) l + with Not_found -> + aux acc l) + | g :: l -> + aux (g :: acc) l in - match Typing.get_integer_ty t with - | Typing.C_type _ | Typing.Other -> - let res = Env.new_var - ~loc - ~name - env - (Some t) - (Typing.get_typ t) - (fun vi_app _ -> [ mk_call vi_app ]) + let rev_globals = aux [] globals in + (* add the definitions at the end of [globals] *) + let add_fundec kf globals = + let fundec = + try Kernel_function.get_definition kf + with Kernel_function.No_Definition -> assert false in - res - | Typing.Gmp -> - Env.new_var_and_mpz_init - ~loc - ~name - env - (Some t) - (fun vi_app _ -> [ mk_call vi_app ]) - -(**************************************************************************) -(******************************** Visitor *********************************) -(**************************************************************************) - -(* TODO: Or is it better to directly use E-ACSL's main visitor in [Visit]? - The decision should take into account the fact that [Visit] is already - very big. *) - -let lfunctions_visitor = object (self) - inherit Visitor.frama_c_inplace - val mutable new_definitions: global list = [] - method private insert_lfunctions l = l @ new_definitions - method !vglob_aux = function - | GAnnot(ga, _) as g -> - Cil.DoChildrenPost - (fun _ -> match ga with - | Dfun_or_pred(li, _) -> - begin match li.l_labels with - | [] -> - (* Case of logic definitions WITHOUT labels. *) - let kfs = find_kfs li in - let loc = Cil_datatype.Location.unknown in - let new_decls = List.map - (fun kf -> - let fundec = get_fundec kf in - let new_g = GFun(fundec, loc) in - new_definitions <- new_g :: new_definitions; - GFunDecl(Cil.empty_funspec (), fundec.svar, loc)) - kfs - in - g :: new_decls - | _ :: _ -> - (* Case of logic definitions WITH labels. Not yet supported for - the time being. Just let it go here: an exception will be raised - in [Translate]. *) - [g] - end - | Dvolatile _ | Daxiomatic _ | Dtype _ | Dlemma _ | Dinvariant _ - | Dtype_annot _ | Dmodel_annot _ | Dcustom_annot _ | Dextended _ -> - [g]) - | GType _ | GCompTag _ | GCompTagDecl _ | GEnumTag _ | GEnumTagDecl _ - | GVarDecl _ | GFunDecl _ | GVar _ | GFun _ | GAsm _ | GPragma _ - | GText _ -> - Cil.DoChildren - method !vfile _ = - Cil.DoChildrenPost - (fun file -> - file.globals <- self#insert_lfunctions file.globals; - file) -end + GFun(fundec, Location.unknown) :: globals + in + let rev_globals = + Logic_info.Hashtbl.fold + (fun _ -> Params_ty.Hashtbl.fold (fun _ -> add_fundec)) + memo_tbl + rev_globals + in + List.rev rev_globals -let do_visit f = Visitor.visitFramacFile lfunctions_visitor f +let tapp_to_exp ~loc fname env t li params_ty args = + let ret_ty = Typing.get_typ t in + let gen tbl = + let vi, kf, gen_body = generate_kf fname ~loc env ret_ty params_ty li in + Params_ty.Hashtbl.add tbl params_ty kf; + vi, gen_body + in + (* memoise the function's varinfo *) + let fvi, gen_body = + try + let h = Logic_info.Hashtbl.find memo_tbl li in + try + let kf = Params_ty.Hashtbl.find h params_ty in + Kernel_function.get_vi kf, + (fun () -> ()) (* body generation already planified *) + with Not_found -> gen h + with Not_found -> + let h = Params_ty.Hashtbl.create 7 in + Logic_info.Hashtbl.add memo_tbl li h; + gen h + in + (* the generation of the function body must be performed after memoizing the + kernel function in order to handle recursive calls in finite time :-) *) + gen_body (); + (* create the function call for the tapp *) + let mkcall vi = + let mk_args types args = + match types (* generated by E-ACSL: no need to unroll *) with + | TFun(_, Some params, _, _) -> + (* additional casts are necessary whenever the argument is GMP and the + parameter is a (small) integralType: after handling the context in + [Translate] through [add_cast], the GMP has been translated into a + [long] (that is what provided the GMP API). This [long] must now be + translated to the parameter's type. It cannot be done before since + the exact type of the parameter is only computed when the function is + generated *) + List.map2 + (fun (_, newt, _) e -> Cil.mkCast ~force:false ~newt ~e) + params + args + | _ -> assert false + in + if result_as_extra_argument ret_ty then + let args = mk_args fvi.vtype (Cil.mkAddrOf ~loc (Cil.var vi) :: args) in + Call(None, Cil.evar fvi, args, loc) + else + let args = mk_args fvi.vtype args in + Call(Some (Cil.var vi), Cil.evar fvi, args, loc) + in + (* generate the varinfo storing the result of the call *) + Env.new_var + ~loc + ~name:li.l_var_info.lv_name + env + (Some t) + ret_ty + (fun vi _ -> [ Cil.mkStmtOneInstr ~valid_sid:true (mkcall vi) ]) diff --git a/src/plugins/e-acsl/logic_functions.mli b/src/plugins/e-acsl/logic_functions.mli index e8a25ecf350..3e2c0d25c90 100644 --- a/src/plugins/e-acsl/logic_functions.mli +++ b/src/plugins/e-acsl/logic_functions.mli @@ -34,25 +34,23 @@ open Cil_types (************** Logic functions without labels ****************************) (**************************************************************************) -val generate: loc:location -> Env.t -> term -> logic_info -> - exp list -> logic_type list -> varinfo * exp * Env.t -(** [generate ~loc env t_app li args_exp args_lty] generates the C function - corresponding to [t_app] and returns the associated call. *) +val reset: unit -> unit -val do_visit: Cil_types.file -> unit -(** Put declarations and definitions of the generated functions in the AST. *) +val tapp_to_exp: + loc:location -> + string -> Env.t -> term -> logic_info -> Typing.integer_ty list -> exp list -> + varinfo * exp * Env.t -val reset: unit -> unit +val add_generated_functions: global list -> global list +(* @return the input list of globals in which the generated functions have been + inserted at the right places (both their declaration and their definition) *) (**************************************************************************) (********************** Forward references ********************************) (**************************************************************************) -val predicate_to_exp_ref: +val named_predicate_to_exp_ref: (kernel_function -> Env.t -> predicate -> exp * Env.t) ref val term_to_exp_ref: (kernel_function -> Env.t -> term -> exp * Env.t) ref - -val add_cast_ref: - (location -> Env.t -> typ option -> bool -> exp -> exp * Env.t) ref diff --git a/src/plugins/e-acsl/loops.ml b/src/plugins/e-acsl/loops.ml index ea01ce00c63..a6da567257a 100644 --- a/src/plugins/e-acsl/loops.ml +++ b/src/plugins/e-acsl/loops.ml @@ -297,7 +297,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = Some break_stmt)) in (* remove logic binding before returning *) - let env = Env.Logic_binding.remove env logic_x in + Env.Logic_binding.remove env logic_x; [ start ; stmt ], env | Lscope.Lvs_let(lv, t) :: lscope_vars' -> let ty = Typing.get_typ t in @@ -308,7 +308,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = mk_nested_loops ~loc mk_innermost_block kf env lscope_vars' in (* remove logic binding now that the block is constructed *) - let env = Env.Logic_binding.remove env lv in + Env.Logic_binding.remove env lv; (* return *) let_stmt :: stmts, env | Lscope.Lvs_formal _ :: _ -> diff --git a/src/plugins/e-acsl/tests/gmp/functions_rec.c b/src/plugins/e-acsl/tests/gmp/functions_rec.c index c6d10713c13..3619ab7c793 100644 --- a/src/plugins/e-acsl/tests/gmp/functions_rec.c +++ b/src/plugins/e-acsl/tests/gmp/functions_rec.c @@ -18,13 +18,13 @@ 6; */ int main (void) { - /*@ assert f1(0) == 0; */ ; - /*@ assert f1(1) == 1; */ ; - /*@ assert f1(100) == 5050; */ ; + // /*@ assert f1(0) == 0; */ ; + // /*@ assert f1(1) == 1; */ ; + // /*@ assert f1(100) == 5050; */ ; - /*@ assert f2(7) == 1; */ ; + /*@ assert f2(7) == 1; */ ; /*@ assert f3(6) == -5; */ ; - /*@assert f4(9) > 0; */ ; + /*@ assert f4(9) > 0; */ ; } diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle index d4d91c76d03..b922d39b016 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle +++ b/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle @@ -14,7 +14,6 @@ [eva] using specification for function __e_acsl_memory_init [eva] using specification for function __e_acsl_assert [eva] using specification for function __gmpz_init_set_str -[eva] using specification for function __gmpz_init_set [eva] using specification for function __gmpz_init_set_si [eva] using specification for function __gmpz_init [eva] using specification for function __gmpz_add @@ -24,9 +23,9 @@ function __e_acsl_assert: precondition got status unknown. [eva:alarm] tests/gmp/functions.c:47: Warning: function __e_acsl_assert: precondition got status unknown. +[eva] using specification for function __gmpz_init_set [eva:alarm] tests/gmp/functions.c:48: Warning: - accessing uninitialized left-value. - assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3); -[eva:alarm] :0: Warning: - function __gmpz_init_set: precondition ¬\initialized(z) got status invalid. + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:49: Warning: + function __e_acsl_assert: precondition got status unknown. [eva] done for function main diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle index 50251e30668..6a88f942fbc 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle +++ b/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle @@ -23,12 +23,28 @@ [eva:alarm] tests/gmp/functions.c:43: Warning: function __e_acsl_assert: precondition got status unknown. [eva] using specification for function __gmpz_init_set_str -[eva] using specification for function __gmpz_init_set [eva:alarm] tests/gmp/functions.c:44: Warning: function __e_acsl_assert: precondition got status unknown. +[eva] using specification for function __gmpz_init_set [eva:alarm] tests/gmp/functions.c:46: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:47: Warning: accessing uninitialized left-value. - assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp); -[eva:alarm] :0: Warning: - function __gmpz_init_set: precondition ¬\initialized(z) got status invalid. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_4); +[eva:alarm] tests/gmp/functions.c:47: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:48: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:49: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:53: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:56: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:58: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:63: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions.c:25: Warning: + function __e_acsl_assert: precondition got status unknown. [eva] done for function main diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle index e3a0950b8f7..c7a7f721fbe 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle +++ b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle @@ -10,16 +10,78 @@ __e_acsl_math_HUGE_VALF ∈ [-3.40282346639e+38 .. 3.40282346639e+38] __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308] [eva] using specification for function __e_acsl_memory_init -[eva] tests/gmp/functions_rec.c:21: - cannot evaluate ACSL term, unsupported ACSL construct: logic function f1 -[eva:alarm] tests/gmp/functions_rec.c:21: Warning: assertion got status unknown. -[eva] using specification for function __gmpz_init -[eva:alarm] tests/gmp/functions_rec.c:21: Warning: - accessing uninitialized left-value. - assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp); -[eva] using specification for function __gmpz_init_set_si -[eva] using specification for function __gmpz_init_set -[eva] using specification for function __gmpz_clear -[eva:alarm] :0: Warning: - function __gmpz_init_set: precondition ¬\initialized(z) got status invalid. +[eva] tests/gmp/functions_rec.c:25: + cannot evaluate ACSL term, unsupported ACSL construct: logic function f2 +[eva:alarm] tests/gmp/functions_rec.c:25: Warning: assertion got status unknown. +[eva] tests/gmp/functions_rec.c:9: Warning: + recursive call during value analysis + of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <- + __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva] using specification for function __gen_e_acsl_f2_2 +[eva] tests/gmp/functions_rec.c:9: Warning: + recursive call during value analysis + of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <- + __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva] tests/gmp/functions_rec.c:9: Warning: + recursive call during value analysis + of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <- + __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva] using specification for function __e_acsl_assert +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + division by zero. assert __gen_e_acsl_f2_8 ≢ 0; +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + signed overflow. + assert -2147483648 ≤ __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6; +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + signed overflow. assert __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6 ≤ 2147483647; +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + signed overflow. + assert + (int)(__gen_e_acsl_f2_4 * __gen_e_acsl_f2_6) / __gen_e_acsl_f2_8 ≤ + 2147483647; +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + division by zero. assert __gen_e_acsl_f2_13 ≢ 0; +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + signed overflow. + assert -2147483648 ≤ __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11; +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + signed overflow. + assert __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11 ≤ 2147483647; +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + signed overflow. + assert + (int)(__gen_e_acsl_f2_9 * __gen_e_acsl_f2_11) / __gen_e_acsl_f2_13 ≤ + 2147483647; +[eva:alarm] tests/gmp/functions_rec.c:25: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva] tests/gmp/functions_rec.c:27: + cannot evaluate ACSL term, unsupported ACSL construct: logic function f3 +[eva:alarm] tests/gmp/functions_rec.c:27: Warning: assertion got status unknown. +[eva] tests/gmp/functions_rec.c:13: Warning: + recursive call during value analysis + of __gen_e_acsl_f3_2 (__gen_e_acsl_f3_2 <- __gen_e_acsl_f3_2 :: tests/gmp/functions_rec.c:13 <- + __gen_e_acsl_f3 :: tests/gmp/functions_rec.c:27 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva] using specification for function __gen_e_acsl_f3_2 +[eva] tests/gmp/functions_rec.c:29: + cannot evaluate ACSL term, unsupported ACSL construct: logic function f4 +[eva:alarm] tests/gmp/functions_rec.c:29: Warning: assertion got status unknown. +[eva] tests/gmp/functions_rec.c:16: Warning: + recursive call during value analysis + of __gen_e_acsl_f4_2 (__gen_e_acsl_f4_2 <- __gen_e_acsl_f4_2 :: tests/gmp/functions_rec.c:16 <- + __gen_e_acsl_f4 :: tests/gmp/functions_rec.c:29 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva] using specification for function __gen_e_acsl_f4_2 +[eva:alarm] tests/gmp/functions_rec.c:29: Warning: + function __e_acsl_assert: precondition got status unknown. [eva] done for function main diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle index 899afbf364f..723a7954d81 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle +++ b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle @@ -10,38 +10,107 @@ __e_acsl_math_HUGE_VALF ∈ [-3.40282346639e+38 .. 3.40282346639e+38] __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308] [eva] using specification for function __e_acsl_memory_init -[eva] tests/gmp/functions_rec.c:21: - cannot evaluate ACSL term, unsupported ACSL construct: logic function f1 -[eva:alarm] tests/gmp/functions_rec.c:21: Warning: assertion got status unknown. -[eva] using specification for function __gmpz_init -[eva:alarm] tests/gmp/functions_rec.c:21: Warning: - accessing uninitialized left-value. - assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp); +[eva] tests/gmp/functions_rec.c:25: + cannot evaluate ACSL term, unsupported ACSL construct: logic function f2 +[eva:alarm] tests/gmp/functions_rec.c:25: Warning: assertion got status unknown. [eva] using specification for function __gmpz_init_set_si [eva] using specification for function __gmpz_cmp [eva] using specification for function __gmpz_init_set [eva] using specification for function __gmpz_clear +[eva] using specification for function __gmpz_init [eva] using specification for function __gmpz_sub -[eva:alarm] tests/gmp/functions_rec.c:6: Warning: +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: accessing uninitialized left-value. assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub); -[eva:alarm] tests/gmp/functions_rec.c:6: Warning: - accessing uninitialized left-value. - assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2); -[eva] tests/gmp/functions_rec.c:6: Warning: +[eva] tests/gmp/functions_rec.c:9: Warning: recursive call during value analysis - of __gen_e_acsl_f1_2 (__gen_e_acsl_f1_2 <- __gen_e_acsl_f1_2 :: tests/gmp/functions_rec.c:6 <- - __gen_e_acsl_f1 :: tests/gmp/functions_rec.c:21 <- + of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <- + __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <- main). Assuming the call has no effect. The analysis will be unsound. -[eva:alarm] tests/gmp/functions_rec.c:6: Warning: +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: accessing uninitialized left-value. assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_2); -[eva:alarm] tests/gmp/functions_rec.c:6: Warning: +[eva] using specification for function __gen_e_acsl_f2_2 +[eva] tests/gmp/functions_rec.c:9: Warning: + recursive call during value analysis + of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <- + __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_3); +[eva] using specification for function __gmpz_mul +[eva] tests/gmp/functions_rec.c:9: Warning: + recursive call during value analysis + of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <- + __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_4); +[eva] :0: + cannot evaluate ACSL term, unsupported ACSL construct: logic function f2 +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + assertion 'E_ACSL' got status unknown. +[eva] using specification for function __e_acsl_assert +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva] using specification for function __gmpz_tdiv_q +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_5); +[eva:alarm] tests/gmp/functions_rec.c:9: Warning: accessing uninitialized left-value. - assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3); -[eva] using specification for function __gen_e_acsl_f1_2 + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_6); +[eva:alarm] tests/gmp/functions_rec.c:25: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva] tests/gmp/functions_rec.c:27: + cannot evaluate ACSL term, unsupported ACSL construct: logic function f3 +[eva:alarm] tests/gmp/functions_rec.c:27: Warning: assertion got status unknown. +[eva:alarm] tests/gmp/functions_rec.c:13: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_7); +[eva] using specification for function __gmpz_get_si +[eva] tests/gmp/functions_rec.c:13: Warning: + recursive call during value analysis + of __gen_e_acsl_f3_2 (__gen_e_acsl_f3_2 <- __gen_e_acsl_f3_2 :: tests/gmp/functions_rec.c:13 <- + __gen_e_acsl_f3 :: tests/gmp/functions_rec.c:27 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva:alarm] tests/gmp/functions_rec.c:13: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_8); +[eva] using specification for function __gen_e_acsl_f3_2 [eva] using specification for function __gmpz_add -[eva:alarm] :0: Warning: - function __gmpz_init_set: precondition ¬\initialized(z) got status invalid. +[eva:alarm] tests/gmp/functions_rec.c:13: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add); +[eva:alarm] tests/gmp/functions_rec.c:13: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_2); +[eva] using specification for function __gmpz_neg +[eva:alarm] tests/gmp/functions_rec.c:27: Warning: + function __e_acsl_assert: precondition got status unknown. +[eva] tests/gmp/functions_rec.c:29: + cannot evaluate ACSL term, unsupported ACSL construct: logic function f4 +[eva:alarm] tests/gmp/functions_rec.c:29: Warning: assertion got status unknown. +[eva:alarm] tests/gmp/functions_rec.c:16: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_3); +[eva] tests/gmp/functions_rec.c:16: Warning: + recursive call during value analysis + of __gen_e_acsl_f4_2 (__gen_e_acsl_f4_2 <- __gen_e_acsl_f4_2 :: tests/gmp/functions_rec.c:16 <- + __gen_e_acsl_f4 :: tests/gmp/functions_rec.c:29 <- + main). + Assuming the call has no effect. The analysis will be unsound. +[eva:alarm] tests/gmp/functions_rec.c:16: Warning: + accessing uninitialized left-value. + assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_4); +[eva] using specification for function __gen_e_acsl_f4_2 +[eva] using specification for function __gmpz_init_set_ui +[eva:alarm] tests/gmp/functions_rec.c:29: Warning: + function __e_acsl_assert: precondition got status unknown. [eva] done for function main diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c index fa452142c65..9dba1dbedad 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c @@ -10,59 +10,56 @@ struct mystruct { typedef struct mystruct mystruct; /*@ predicate p1(int x, int y) = x + y > 0; */ -int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg); +int __gen_e_acsl_p1(int x, int y); /*@ predicate p2(ℤ x, ℤ y) = x + y > 0; */ -int __gen_e_acsl_p2_3(int __gen_e_acsl_x_arg, long __gen_e_acsl_y_arg); +int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y); -int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg); +int __gen_e_acsl_p2_5(int x, long y); -int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg); +int __gen_e_acsl_p2(int x, int y); /*@ logic ℤ f1(ℤ x, ℤ y) = x + y; */ -long __gen_e_acsl_f1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg); +void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x, + __e_acsl_mpz_struct * y); -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg); +void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x, + __e_acsl_mpz_struct * y); -void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg); +long __gen_e_acsl_f1(int x, int y); /*@ logic char h_char(char c) = c; */ -char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg); +char __gen_e_acsl_h_char(int c); /*@ logic short h_short(short s) = s; */ -short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg); +short __gen_e_acsl_h_short(int s); /*@ logic int g_hidden(int x) = x; */ -int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg); +int __gen_e_acsl_g_hidden(int x); /*@ logic int g(int x) = g_hidden(x); */ -int __gen_e_acsl_g(int __gen_e_acsl_x_arg); +int __gen_e_acsl_g(int x); /*@ logic mystruct t1(mystruct m) = m; */ -mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg); +mystruct __gen_e_acsl_t1(mystruct m); /*@ logic ℤ t2(mystruct m) = m.k + m.l; */ -long __gen_e_acsl_t2(mystruct __gen_e_acsl_m_arg); +long __gen_e_acsl_t2(mystruct m); /*@ predicate k_pred(ℤ x) = x > 0; */ -int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg); +int __gen_e_acsl_k_pred(int x); /*@ requires k_pred(x); */ void __gen_e_acsl_k(int x); @@ -91,67 +88,61 @@ int main(void) int y = 2; /*@ assert p1(x, y); */ { - int __gen_e_acsl_p1_tapp; - __gen_e_acsl_p1_tapp = __gen_e_acsl_p1(x,y); - __e_acsl_assert(__gen_e_acsl_p1_tapp,(char *)"Assertion",(char *)"main", + int __gen_e_acsl_p1_2; + __gen_e_acsl_p1_2 = __gen_e_acsl_p1(x,y); + __e_acsl_assert(__gen_e_acsl_p1_2,(char *)"Assertion",(char *)"main", (char *)"p1(x, y)",42); } /*@ assert p2(3, 4); */ { - int __gen_e_acsl_p2_tapp; - __gen_e_acsl_p2_tapp = __gen_e_acsl_p2(3,4); - __e_acsl_assert(__gen_e_acsl_p2_tapp,(char *)"Assertion",(char *)"main", + int __gen_e_acsl_p2_2; + __gen_e_acsl_p2_2 = __gen_e_acsl_p2(3,4); + __e_acsl_assert(__gen_e_acsl_p2_2,(char *)"Assertion",(char *)"main", (char *)"p2(3, 4)",43); } /*@ assert p2(5, 99999999999999999999999999999); */ { __e_acsl_mpz_t __gen_e_acsl_; - int __gen_e_acsl_p2_tapp_2; + int __gen_e_acsl_p2_4; __gmpz_init_set_str(__gen_e_acsl_,"99999999999999999999999999999",10); - __gen_e_acsl_p2_tapp_2 = __gen_e_acsl_p2_2(5, - (__e_acsl_mpz_struct *)__gen_e_acsl_); - __e_acsl_assert(__gen_e_acsl_p2_tapp_2,(char *)"Assertion", - (char *)"main", + __gen_e_acsl_p2_4 = __gen_e_acsl_p2_3(5, + (__e_acsl_mpz_struct *)__gen_e_acsl_); + __e_acsl_assert(__gen_e_acsl_p2_4,(char *)"Assertion",(char *)"main", (char *)"p2(5, 99999999999999999999999999999)",44); __gmpz_clear(__gen_e_acsl_); } /*@ assert f1(x, y) ≡ 3; */ { - long __gen_e_acsl_f1_tapp; - __gen_e_acsl_f1_tapp = __gen_e_acsl_f1(x,y); - __e_acsl_assert(__gen_e_acsl_f1_tapp == 3L,(char *)"Assertion", + long __gen_e_acsl_f1_2; + __gen_e_acsl_f1_2 = __gen_e_acsl_f1(x,y); + __e_acsl_assert(__gen_e_acsl_f1_2 == 3L,(char *)"Assertion", (char *)"main",(char *)"f1(x, y) == 3",46); } /*@ assert p2(x, f1(3, 4)); */ { - long __gen_e_acsl_f1_tapp_2; - int __gen_e_acsl_p2_tapp_3; - __gen_e_acsl_f1_tapp_2 = __gen_e_acsl_f1(3,4); - __gen_e_acsl_p2_tapp_3 = __gen_e_acsl_p2_3(x,__gen_e_acsl_f1_tapp_2); - __e_acsl_assert(__gen_e_acsl_p2_tapp_3,(char *)"Assertion", - (char *)"main",(char *)"p2(x, f1(3, 4))",47); + long __gen_e_acsl_f1_4; + int __gen_e_acsl_p2_6; + __gen_e_acsl_f1_4 = __gen_e_acsl_f1(3,4); + __gen_e_acsl_p2_6 = __gen_e_acsl_p2_5(x,__gen_e_acsl_f1_4); + __e_acsl_assert(__gen_e_acsl_p2_6,(char *)"Assertion",(char *)"main", + (char *)"p2(x, f1(3, 4))",47); } /*@ assert f1(9, 99999999999999999999999999999) > 0; */ { __e_acsl_mpz_t __gen_e_acsl__4; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3; + __e_acsl_mpz_t __gen_e_acsl_f1_6; __e_acsl_mpz_t __gen_e_acsl__5; int __gen_e_acsl_gt_3; __gmpz_init_set_str(__gen_e_acsl__4,"99999999999999999999999999999",10); - __gmpz_init(__gen_e_acsl_f1_tapp_3); - /*@ assert - Eva: initialization: - \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3); - */ - __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3,9, + __gen_e_acsl_f1_5(& __gen_e_acsl_f1_6,9, (__e_acsl_mpz_struct *)__gen_e_acsl__4); __gmpz_init_set_si(__gen_e_acsl__5,0L); - __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3), + __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6), (__e_acsl_mpz_struct const *)(__gen_e_acsl__5)); __e_acsl_assert(__gen_e_acsl_gt_3 > 0,(char *)"Assertion",(char *)"main", (char *)"f1(9, 99999999999999999999999999999) > 0",48); __gmpz_clear(__gen_e_acsl__4); - __gmpz_clear(__gen_e_acsl_f1_tapp_3); + __gmpz_clear(__gen_e_acsl_f1_6); __gmpz_clear(__gen_e_acsl__5); } /*@ assert @@ -160,46 +151,44 @@ int main(void) */ { __e_acsl_mpz_t __gen_e_acsl__6; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4; + __e_acsl_mpz_t __gen_e_acsl_f1_8; __e_acsl_mpz_t __gen_e_acsl__7; int __gen_e_acsl_eq; __gmpz_init_set_str(__gen_e_acsl__6,"99999999999999999999999999999",10); - __gmpz_init(__gen_e_acsl_f1_tapp_4); - __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4, + __gen_e_acsl_f1_7(& __gen_e_acsl_f1_8, (__e_acsl_mpz_struct *)__gen_e_acsl__6, (__e_acsl_mpz_struct *)__gen_e_acsl__6); __gmpz_init_set_str(__gen_e_acsl__7,"199999999999999999999999999998",10); - __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4), + __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8), (__e_acsl_mpz_struct const *)(__gen_e_acsl__7)); __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main", (char *)"f1(99999999999999999999999999999, 99999999999999999999999999999) ==\n199999999999999999999999999998", 49); __gmpz_clear(__gen_e_acsl__6); - __gmpz_clear(__gen_e_acsl_f1_tapp_4); + __gmpz_clear(__gen_e_acsl_f1_8); __gmpz_clear(__gen_e_acsl__7); } /*@ assert g(x) ≡ x; */ { - int __gen_e_acsl_g_tapp; - __gen_e_acsl_g_tapp = __gen_e_acsl_g(x); - __e_acsl_assert(__gen_e_acsl_g_tapp == x,(char *)"Assertion", - (char *)"main",(char *)"g(x) == x",53); + int __gen_e_acsl_g_2; + __gen_e_acsl_g_2 = __gen_e_acsl_g(x); + __e_acsl_assert(__gen_e_acsl_g_2 == x,(char *)"Assertion",(char *)"main", + (char *)"g(x) == x",53); } char c = (char)'c'; /*@ assert h_char(c) ≡ c; */ { - char __gen_e_acsl_h_char_tapp; - __gen_e_acsl_h_char_tapp = __gen_e_acsl_h_char((int)c); - __e_acsl_assert((int)__gen_e_acsl_h_char_tapp == (int)c, - (char *)"Assertion",(char *)"main", - (char *)"h_char(c) == c",56); + char __gen_e_acsl_h_char_2; + __gen_e_acsl_h_char_2 = __gen_e_acsl_h_char((int)c); + __e_acsl_assert((int)__gen_e_acsl_h_char_2 == (int)c,(char *)"Assertion", + (char *)"main",(char *)"h_char(c) == c",56); } short s = (short)1; /*@ assert h_short(s) ≡ s; */ { - short __gen_e_acsl_h_short_tapp; - __gen_e_acsl_h_short_tapp = __gen_e_acsl_h_short((int)s); - __e_acsl_assert((int)__gen_e_acsl_h_short_tapp == (int)s, + short __gen_e_acsl_h_short_2; + __gen_e_acsl_h_short_2 = __gen_e_acsl_h_short((int)s); + __e_acsl_assert((int)__gen_e_acsl_h_short_2 == (int)s, (char *)"Assertion",(char *)"main", (char *)"h_short(s) == s",58); } @@ -207,11 +196,11 @@ int main(void) m.l = 9; /*@ assert t2(t1(m)) ≡ 17; */ { - mystruct __gen_e_acsl_t1_tapp; - long __gen_e_acsl_t2_tapp; - __gen_e_acsl_t1_tapp = __gen_e_acsl_t1(m); - __gen_e_acsl_t2_tapp = __gen_e_acsl_t2(__gen_e_acsl_t1_tapp); - __e_acsl_assert(__gen_e_acsl_t2_tapp == 17L,(char *)"Assertion", + mystruct __gen_e_acsl_t1_2; + long __gen_e_acsl_t2_2; + __gen_e_acsl_t1_2 = __gen_e_acsl_t1(m); + __gen_e_acsl_t2_2 = __gen_e_acsl_t2(__gen_e_acsl_t1_2); + __e_acsl_assert(__gen_e_acsl_t2_2 == 17L,(char *)"Assertion", (char *)"main",(char *)"t2(t1(m)) == 17",63); } __gen_e_acsl_k(9); @@ -223,180 +212,145 @@ int main(void) void __gen_e_acsl_k(int x) { { - int __gen_e_acsl_k_pred_tapp; - __gen_e_acsl_k_pred_tapp = __gen_e_acsl_k_pred(x); - __e_acsl_assert(__gen_e_acsl_k_pred_tapp,(char *)"Precondition", - (char *)"k",(char *)"k_pred(x)",25); + int __gen_e_acsl_k_pred_2; + __gen_e_acsl_k_pred_2 = __gen_e_acsl_k_pred(x); + __e_acsl_assert(__gen_e_acsl_k_pred_2,(char *)"Precondition",(char *)"k", + (char *)"k_pred(x)",25); } k(x); return; } -int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg) +short __gen_e_acsl_h_short(int s) { - int __retres; - __retres = __gen_e_acsl_x_arg > 0; + short __retres = (short)s; return __retres; } -long __gen_e_acsl_t2(mystruct __gen_e_acsl_m_arg) +int __gen_e_acsl_g_hidden(int x) { - long __retres; - __retres = __gen_e_acsl_m_arg.k + (long)__gen_e_acsl_m_arg.l; - return __retres; + return x; } -mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg) +int __gen_e_acsl_g(int x) { - mystruct __retres; - __retres = __gen_e_acsl_m_arg; - return __retres; + int __gen_e_acsl_g_hidden_2; + __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x); + return __gen_e_acsl_g_hidden_2; } -int __gen_e_acsl_g(int __gen_e_acsl_x_arg) +mystruct __gen_e_acsl_t1(mystruct m) { - int __retres; - int __gen_e_acsl_g_hidden_tapp; - __gen_e_acsl_g_hidden_tapp = __gen_e_acsl_g_hidden(__gen_e_acsl_x_arg); - __retres = __gen_e_acsl_g_hidden_tapp; - return __retres; + return m; } -int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg) +int __gen_e_acsl_p1(int x, int y) { - int __retres; - __retres = __gen_e_acsl_x_arg; + int __retres = x + (long)y > 0L; return __retres; } -short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg) -{ - int __retres; - __retres = (short)__gen_e_acsl_s_arg; - return __retres; -} - -char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg) -{ - int __retres; - __retres = (char)__gen_e_acsl_c_arg; - return __retres; -} - -void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_x_4; - __e_acsl_mpz_t __gen_e_acsl_y_4; - __e_acsl_mpz_t __gen_e_acsl_add_4; - __gmpz_init_set(__gen_e_acsl_x_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_arg)); - __gmpz_init_set(__gen_e_acsl_y_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg)); - __gmpz_init(__gen_e_acsl_add_4); - __gmpz_add(__gen_e_acsl_add_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_4)); - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4)); - __gmpz_clear(__gen_e_acsl_x_4); - __gmpz_clear(__gen_e_acsl_y_4); - __gmpz_clear(__gen_e_acsl_add_4); - return; -} - -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg) +long __gen_e_acsl_t2(mystruct m) { - __e_acsl_mpz_t __gen_e_acsl_y_3; - __e_acsl_mpz_t __gen_e_acsl_x_3; - __e_acsl_mpz_t __gen_e_acsl_add_3; - __gmpz_init_set(__gen_e_acsl_y_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg)); - __gmpz_init_set_si(__gen_e_acsl_x_3,(long)__gen_e_acsl_x_arg); - __gmpz_init(__gen_e_acsl_add_3); - __gmpz_add(__gen_e_acsl_add_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_3)); - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3)); - __gmpz_clear(__gen_e_acsl_y_3); - __gmpz_clear(__gen_e_acsl_x_3); - __gmpz_clear(__gen_e_acsl_add_3); - return; -} - -long __gen_e_acsl_f1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) -{ - long __retres; - __retres = __gen_e_acsl_x_arg + (long)__gen_e_acsl_y_arg; + long __retres = m.k + (long)m.l; return __retres; } -int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg) +int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y) { - int __retres; - __e_acsl_mpz_t __gen_e_acsl_y; __e_acsl_mpz_t __gen_e_acsl_x; __e_acsl_mpz_t __gen_e_acsl_add; __e_acsl_mpz_t __gen_e_acsl__2; int __gen_e_acsl_gt; - __gmpz_init_set(__gen_e_acsl_y, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg)); - __gmpz_init_set_si(__gen_e_acsl_x,(long)__gen_e_acsl_x_arg); + __gmpz_init_set_si(__gen_e_acsl_x,(long)x); __gmpz_init(__gen_e_acsl_add); __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y)); + (__e_acsl_mpz_struct const *)(y)); __gmpz_init_set_si(__gen_e_acsl__2,0L); __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add), (__e_acsl_mpz_struct const *)(__gen_e_acsl__2)); - __retres = __gen_e_acsl_gt > 0; - __gmpz_clear(__gen_e_acsl_y); + int __retres = __gen_e_acsl_gt > 0; __gmpz_clear(__gen_e_acsl_x); __gmpz_clear(__gen_e_acsl_add); __gmpz_clear(__gen_e_acsl__2); return __retres; } -int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) +int __gen_e_acsl_p2_5(int x, long y) { - int __retres; - __retres = __gen_e_acsl_x_arg + (long)__gen_e_acsl_y_arg > 0L; - return __retres; -} - -int __gen_e_acsl_p2_3(int __gen_e_acsl_x_arg, long __gen_e_acsl_y_arg) -{ - int __retres; __e_acsl_mpz_t __gen_e_acsl_x_2; - __e_acsl_mpz_t __gen_e_acsl_y_2; + __e_acsl_mpz_t __gen_e_acsl_y; __e_acsl_mpz_t __gen_e_acsl_add_2; __e_acsl_mpz_t __gen_e_acsl__3; int __gen_e_acsl_gt_2; - __gmpz_init_set_si(__gen_e_acsl_x_2,(long)__gen_e_acsl_x_arg); - __gmpz_init_set_si(__gen_e_acsl_y_2,__gen_e_acsl_y_arg); + __gmpz_init_set_si(__gen_e_acsl_x_2,(long)x); + __gmpz_init_set_si(__gen_e_acsl_y,y); __gmpz_init(__gen_e_acsl_add_2); __gmpz_add(__gen_e_acsl_add_2, (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_2)); + (__e_acsl_mpz_struct const *)(__gen_e_acsl_y)); __gmpz_init_set_si(__gen_e_acsl__3,0L); __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2), (__e_acsl_mpz_struct const *)(__gen_e_acsl__3)); - __retres = __gen_e_acsl_gt_2 > 0; + int __retres = __gen_e_acsl_gt_2 > 0; __gmpz_clear(__gen_e_acsl_x_2); - __gmpz_clear(__gen_e_acsl_y_2); + __gmpz_clear(__gen_e_acsl_y); __gmpz_clear(__gen_e_acsl_add_2); __gmpz_clear(__gen_e_acsl__3); return __retres; } -int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) +int __gen_e_acsl_p2(int x, int y) { - int __retres; - __retres = __gen_e_acsl_x_arg + (long)__gen_e_acsl_y_arg > 0L; + int __retres = x + (long)y > 0L; + return __retres; +} + +int __gen_e_acsl_k_pred(int x) +{ + int __retres = x > 0; + return __retres; +} + +void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x, + __e_acsl_mpz_struct * y) +{ + __e_acsl_mpz_t __gen_e_acsl_add_4; + __gmpz_init(__gen_e_acsl_add_4); + __gmpz_add(__gen_e_acsl_add_4,(__e_acsl_mpz_struct const *)(x), + (__e_acsl_mpz_struct const *)(y)); + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4)); + __gmpz_clear(__gen_e_acsl_add_4); + return; +} + +void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x, + __e_acsl_mpz_struct * y) +{ + __e_acsl_mpz_t __gen_e_acsl_x_3; + __e_acsl_mpz_t __gen_e_acsl_add_3; + __gmpz_init_set_si(__gen_e_acsl_x_3,(long)x); + __gmpz_init(__gen_e_acsl_add_3); + __gmpz_add(__gen_e_acsl_add_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3), + (__e_acsl_mpz_struct const *)(y)); + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3)); + __gmpz_clear(__gen_e_acsl_x_3); + __gmpz_clear(__gen_e_acsl_add_3); + return; +} + +long __gen_e_acsl_f1(int x, int y) +{ + long __retres = x + (long)y; + return __retres; +} + +char __gen_e_acsl_h_char(int c) +{ + char __retres = (char)c; return __retres; } diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c index f742b5af9b1..bdacabaaf9c 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c @@ -10,60 +10,54 @@ struct mystruct { typedef struct mystruct mystruct; /*@ predicate p1(int x, int y) = x + y > 0; */ -int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg); +int __gen_e_acsl_p1(int x, int y); /*@ predicate p2(ℤ x, ℤ y) = x + y > 0; */ -int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg); +int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y); -int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg); +int __gen_e_acsl_p2(int x, int y); /*@ logic ℤ f1(ℤ x, ℤ y) = x + y; */ -void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg); +void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x, + __e_acsl_mpz_struct * y); -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg); +void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x, + __e_acsl_mpz_struct * y); -void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg); +void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int x, int y); /*@ logic char h_char(char c) = c; */ -char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg); +char __gen_e_acsl_h_char(int c); /*@ logic short h_short(short s) = s; */ -short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg); +short __gen_e_acsl_h_short(int s); /*@ logic int g_hidden(int x) = x; */ -int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg); +int __gen_e_acsl_g_hidden(int x); /*@ logic int g(int x) = g_hidden(x); */ -int __gen_e_acsl_g(int __gen_e_acsl_x_arg); +int __gen_e_acsl_g(int x); /*@ logic mystruct t1(mystruct m) = m; */ -mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg); +mystruct __gen_e_acsl_t1(mystruct m); /*@ logic ℤ t2(mystruct m) = m.k + m.l; - -*/ -void __gen_e_acsl_t2(__e_acsl_mpz_struct * __retres_arg, - mystruct __gen_e_acsl_m_arg); + */ +void __gen_e_acsl_t2(__e_acsl_mpz_t *__retres_arg, mystruct m); /*@ predicate k_pred(ℤ x) = x > 0; */ -int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg); +int __gen_e_acsl_k_pred(int x); /*@ requires k_pred(x); */ void __gen_e_acsl_k(int x); @@ -92,78 +86,74 @@ int main(void) int y = 2; /*@ assert p1(x, y); */ { - int __gen_e_acsl_p1_tapp; - __gen_e_acsl_p1_tapp = __gen_e_acsl_p1(x,y); - __e_acsl_assert(__gen_e_acsl_p1_tapp,(char *)"Assertion",(char *)"main", + int __gen_e_acsl_p1_2; + __gen_e_acsl_p1_2 = __gen_e_acsl_p1(x,y); + __e_acsl_assert(__gen_e_acsl_p1_2,(char *)"Assertion",(char *)"main", (char *)"p1(x, y)",42); } /*@ assert p2(3, 4); */ { - int __gen_e_acsl_p2_tapp; - __gen_e_acsl_p2_tapp = __gen_e_acsl_p2(3,4); - __e_acsl_assert(__gen_e_acsl_p2_tapp,(char *)"Assertion",(char *)"main", + int __gen_e_acsl_p2_2; + __gen_e_acsl_p2_2 = __gen_e_acsl_p2(3,4); + __e_acsl_assert(__gen_e_acsl_p2_2,(char *)"Assertion",(char *)"main", (char *)"p2(3, 4)",43); } /*@ assert p2(5, 99999999999999999999999999999); */ { __e_acsl_mpz_t __gen_e_acsl__3; - int __gen_e_acsl_p2_tapp_2; + int __gen_e_acsl_p2_4; __gmpz_init_set_str(__gen_e_acsl__3,"99999999999999999999999999999",10); - __gen_e_acsl_p2_tapp_2 = __gen_e_acsl_p2_2(5, - (__e_acsl_mpz_struct *)__gen_e_acsl__3); - __e_acsl_assert(__gen_e_acsl_p2_tapp_2,(char *)"Assertion", - (char *)"main", + __gen_e_acsl_p2_4 = __gen_e_acsl_p2_3(5, + (__e_acsl_mpz_struct *)__gen_e_acsl__3); + __e_acsl_assert(__gen_e_acsl_p2_4,(char *)"Assertion",(char *)"main", (char *)"p2(5, 99999999999999999999999999999)",44); __gmpz_clear(__gen_e_acsl__3); } /*@ assert f1(x, y) ≡ 3; */ { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp; + __e_acsl_mpz_t __gen_e_acsl_f1_2; __e_acsl_mpz_t __gen_e_acsl__5; int __gen_e_acsl_eq; - __gmpz_init(__gen_e_acsl_f1_tapp); - /*@ assert - Eva: initialization: - \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp); - */ - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp,x,y); + __gen_e_acsl_f1(& __gen_e_acsl_f1_2,x,y); __gmpz_init_set_si(__gen_e_acsl__5,3L); - __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp), + __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_2), (__e_acsl_mpz_struct const *)(__gen_e_acsl__5)); __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main", (char *)"f1(x, y) == 3",46); - __gmpz_clear(__gen_e_acsl_f1_tapp); + __gmpz_clear(__gen_e_acsl_f1_2); __gmpz_clear(__gen_e_acsl__5); } /*@ assert p2(x, f1(3, 4)); */ { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_2; - int __gen_e_acsl_p2_tapp_3; - __gmpz_init(__gen_e_acsl_f1_tapp_2); - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2,3,4); - __gen_e_acsl_p2_tapp_3 = __gen_e_acsl_p2_2(x, - (__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2); - __e_acsl_assert(__gen_e_acsl_p2_tapp_3,(char *)"Assertion", - (char *)"main",(char *)"p2(x, f1(3, 4))",47); - __gmpz_clear(__gen_e_acsl_f1_tapp_2); + __e_acsl_mpz_t __gen_e_acsl_f1_4; + int __gen_e_acsl_p2_6; + __gen_e_acsl_f1(& __gen_e_acsl_f1_4,3,4); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_4); + */ + __gen_e_acsl_p2_6 = __gen_e_acsl_p2_3(x, + (__e_acsl_mpz_struct *)__gen_e_acsl_f1_4); + __e_acsl_assert(__gen_e_acsl_p2_6,(char *)"Assertion",(char *)"main", + (char *)"p2(x, f1(3, 4))",47); + __gmpz_clear(__gen_e_acsl_f1_4); } /*@ assert f1(9, 99999999999999999999999999999) > 0; */ { __e_acsl_mpz_t __gen_e_acsl__6; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3; + __e_acsl_mpz_t __gen_e_acsl_f1_6; __e_acsl_mpz_t __gen_e_acsl__7; int __gen_e_acsl_gt_4; __gmpz_init_set_str(__gen_e_acsl__6,"99999999999999999999999999999",10); - __gmpz_init(__gen_e_acsl_f1_tapp_3); - __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3,9, + __gen_e_acsl_f1_5(& __gen_e_acsl_f1_6,9, (__e_acsl_mpz_struct *)__gen_e_acsl__6); __gmpz_init_set_si(__gen_e_acsl__7,0L); - __gen_e_acsl_gt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3), + __gen_e_acsl_gt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6), (__e_acsl_mpz_struct const *)(__gen_e_acsl__7)); __e_acsl_assert(__gen_e_acsl_gt_4 > 0,(char *)"Assertion",(char *)"main", (char *)"f1(9, 99999999999999999999999999999) > 0",48); __gmpz_clear(__gen_e_acsl__6); - __gmpz_clear(__gen_e_acsl_f1_tapp_3); + __gmpz_clear(__gen_e_acsl_f1_6); __gmpz_clear(__gen_e_acsl__7); } /*@ assert @@ -172,50 +162,49 @@ int main(void) */ { __e_acsl_mpz_t __gen_e_acsl__8; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4; + __e_acsl_mpz_t __gen_e_acsl_f1_8; __e_acsl_mpz_t __gen_e_acsl__9; int __gen_e_acsl_eq_2; __gmpz_init_set_str(__gen_e_acsl__8,"99999999999999999999999999999",10); - __gmpz_init(__gen_e_acsl_f1_tapp_4); - __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4, + __gen_e_acsl_f1_7(& __gen_e_acsl_f1_8, (__e_acsl_mpz_struct *)__gen_e_acsl__8, (__e_acsl_mpz_struct *)__gen_e_acsl__8); __gmpz_init_set_str(__gen_e_acsl__9,"199999999999999999999999999998",10); - __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4), + __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8), (__e_acsl_mpz_struct const *)(__gen_e_acsl__9)); __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion", (char *)"main", (char *)"f1(99999999999999999999999999999, 99999999999999999999999999999) ==\n199999999999999999999999999998", 49); __gmpz_clear(__gen_e_acsl__8); - __gmpz_clear(__gen_e_acsl_f1_tapp_4); + __gmpz_clear(__gen_e_acsl_f1_8); __gmpz_clear(__gen_e_acsl__9); } /*@ assert g(x) ≡ x; */ { - int __gen_e_acsl_g_tapp; + int __gen_e_acsl_g_2; __e_acsl_mpz_t __gen_e_acsl_app; - __e_acsl_mpz_t __gen_e_acsl_x_7; + __e_acsl_mpz_t __gen_e_acsl_x_6; int __gen_e_acsl_eq_3; - __gen_e_acsl_g_tapp = __gen_e_acsl_g(x); - __gmpz_init_set_si(__gen_e_acsl_app,(long)__gen_e_acsl_g_tapp); - __gmpz_init_set_si(__gen_e_acsl_x_7,(long)x); + __gen_e_acsl_g_2 = __gen_e_acsl_g(x); + __gmpz_init_set_si(__gen_e_acsl_app,(long)__gen_e_acsl_g_2); + __gmpz_init_set_si(__gen_e_acsl_x_6,(long)x); __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_app), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_7)); + (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_6)); __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion", (char *)"main",(char *)"g(x) == x",53); __gmpz_clear(__gen_e_acsl_app); - __gmpz_clear(__gen_e_acsl_x_7); + __gmpz_clear(__gen_e_acsl_x_6); } char c = (char)'c'; /*@ assert h_char(c) ≡ c; */ { - char __gen_e_acsl_h_char_tapp; + char __gen_e_acsl_h_char_2; __e_acsl_mpz_t __gen_e_acsl_app_2; __e_acsl_mpz_t __gen_e_acsl_c; int __gen_e_acsl_eq_4; - __gen_e_acsl_h_char_tapp = __gen_e_acsl_h_char((int)c); - __gmpz_init_set_si(__gen_e_acsl_app_2,(long)__gen_e_acsl_h_char_tapp); + __gen_e_acsl_h_char_2 = __gen_e_acsl_h_char((int)c); + __gmpz_init_set_si(__gen_e_acsl_app_2,(long)__gen_e_acsl_h_char_2); __gmpz_init_set_si(__gen_e_acsl_c,(long)c); __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_app_2), (__e_acsl_mpz_struct const *)(__gen_e_acsl_c)); @@ -227,12 +216,12 @@ int main(void) short s = (short)1; /*@ assert h_short(s) ≡ s; */ { - short __gen_e_acsl_h_short_tapp; + short __gen_e_acsl_h_short_2; __e_acsl_mpz_t __gen_e_acsl_app_3; __e_acsl_mpz_t __gen_e_acsl_s; int __gen_e_acsl_eq_5; - __gen_e_acsl_h_short_tapp = __gen_e_acsl_h_short((int)s); - __gmpz_init_set_si(__gen_e_acsl_app_3,(long)__gen_e_acsl_h_short_tapp); + __gen_e_acsl_h_short_2 = __gen_e_acsl_h_short((int)s); + __gmpz_init_set_si(__gen_e_acsl_app_3,(long)__gen_e_acsl_h_short_2); __gmpz_init_set_si(__gen_e_acsl_s,(long)s); __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_app_3), (__e_acsl_mpz_struct const *)(__gen_e_acsl_s)); @@ -245,20 +234,18 @@ int main(void) m.l = 9; /*@ assert t2(t1(m)) ≡ 17; */ { - mystruct __gen_e_acsl_t1_tapp; - __e_acsl_mpz_t __gen_e_acsl_t2_tapp; + mystruct __gen_e_acsl_t1_2; + __e_acsl_mpz_t __gen_e_acsl_t2_2; __e_acsl_mpz_t __gen_e_acsl__12; int __gen_e_acsl_eq_6; - __gen_e_acsl_t1_tapp = __gen_e_acsl_t1(m); - __gmpz_init(__gen_e_acsl_t2_tapp); - __gen_e_acsl_t2((__e_acsl_mpz_struct *)__gen_e_acsl_t2_tapp, - __gen_e_acsl_t1_tapp); + __gen_e_acsl_t1_2 = __gen_e_acsl_t1(m); + __gen_e_acsl_t2(& __gen_e_acsl_t2_2,__gen_e_acsl_t1_2); __gmpz_init_set_si(__gen_e_acsl__12,17L); - __gen_e_acsl_eq_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_t2_tapp), + __gen_e_acsl_eq_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_t2_2), (__e_acsl_mpz_struct const *)(__gen_e_acsl__12)); __e_acsl_assert(__gen_e_acsl_eq_6 == 0,(char *)"Assertion", (char *)"main",(char *)"t2(t1(m)) == 17",63); - __gmpz_clear(__gen_e_acsl_t2_tapp); + __gmpz_clear(__gen_e_acsl_t2_2); __gmpz_clear(__gen_e_acsl__12); } __gen_e_acsl_k(9); @@ -270,44 +257,73 @@ int main(void) void __gen_e_acsl_k(int x) { { - int __gen_e_acsl_k_pred_tapp; - __gen_e_acsl_k_pred_tapp = __gen_e_acsl_k_pred(x); - __e_acsl_assert(__gen_e_acsl_k_pred_tapp,(char *)"Precondition", - (char *)"k",(char *)"k_pred(x)",25); + int __gen_e_acsl_k_pred_2; + __gen_e_acsl_k_pred_2 = __gen_e_acsl_k_pred(x); + __e_acsl_assert(__gen_e_acsl_k_pred_2,(char *)"Precondition",(char *)"k", + (char *)"k_pred(x)",25); } k(x); return; } -int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg) +short __gen_e_acsl_h_short(int s) +{ + short __retres = (short)s; + return __retres; +} + +int __gen_e_acsl_g_hidden(int x) +{ + return x; +} + +int __gen_e_acsl_g(int x) +{ + int __gen_e_acsl_g_hidden_2; + __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x); + return __gen_e_acsl_g_hidden_2; +} + +mystruct __gen_e_acsl_t1(mystruct m) +{ + return m; +} + +int __gen_e_acsl_p1(int x, int y) { - int __retres; __e_acsl_mpz_t __gen_e_acsl_x; + __e_acsl_mpz_t __gen_e_acsl_y; + __e_acsl_mpz_t __gen_e_acsl_add; __e_acsl_mpz_t __gen_e_acsl_; int __gen_e_acsl_gt; - __gmpz_init_set_si(__gen_e_acsl_x,(long)__gen_e_acsl_x_arg); + __gmpz_init_set_si(__gen_e_acsl_x,(long)x); + __gmpz_init_set_si(__gen_e_acsl_y,(long)y); + __gmpz_init(__gen_e_acsl_add); + __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_y)); __gmpz_init_set_si(__gen_e_acsl_,0L); - __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_x), + __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add), (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); - __retres = __gen_e_acsl_gt > 0; + int __retres = __gen_e_acsl_gt > 0; __gmpz_clear(__gen_e_acsl_x); + __gmpz_clear(__gen_e_acsl_y); + __gmpz_clear(__gen_e_acsl_add); __gmpz_clear(__gen_e_acsl_); return __retres; } -void __gen_e_acsl_t2(__e_acsl_mpz_struct * __retres_arg, - mystruct __gen_e_acsl_m_arg) +void __gen_e_acsl_t2(__e_acsl_mpz_t *__retres_arg, mystruct m) { __e_acsl_mpz_t __gen_e_acsl__10; __e_acsl_mpz_t __gen_e_acsl__11; __e_acsl_mpz_t __gen_e_acsl_add_7; - __gmpz_init_set_si(__gen_e_acsl__10,(long)__gen_e_acsl_m_arg.k); - __gmpz_init_set_si(__gen_e_acsl__11,(long)__gen_e_acsl_m_arg.l); + __gmpz_init_set_si(__gen_e_acsl__10,(long)m.k); + __gmpz_init_set_si(__gen_e_acsl__11,(long)m.l); __gmpz_init(__gen_e_acsl_add_7); __gmpz_add(__gen_e_acsl_add_7, (__e_acsl_mpz_struct const *)(__gen_e_acsl__10), (__e_acsl_mpz_struct const *)(__gen_e_acsl__11)); - __gmpz_init_set(__retres_arg, + __gmpz_init_set(*__retres_arg, (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_7)); __gmpz_clear(__gen_e_acsl__10); __gmpz_clear(__gen_e_acsl__11); @@ -315,145 +331,36 @@ void __gen_e_acsl_t2(__e_acsl_mpz_struct * __retres_arg, return; } -mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg) -{ - mystruct __retres; - __retres = __gen_e_acsl_m_arg; - return __retres; -} - -int __gen_e_acsl_g(int __gen_e_acsl_x_arg) -{ - int __retres; - int __gen_e_acsl_g_hidden_tapp; - __gen_e_acsl_g_hidden_tapp = __gen_e_acsl_g_hidden(__gen_e_acsl_x_arg); - __retres = __gen_e_acsl_g_hidden_tapp; - return __retres; -} - -int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg) -{ - int __retres; - __retres = __gen_e_acsl_x_arg; - return __retres; -} - -short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg) -{ - int __retres; - __retres = (short)__gen_e_acsl_s_arg; - return __retres; -} - -char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg) -{ - int __retres; - __retres = (char)__gen_e_acsl_c_arg; - return __retres; -} - -void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_x_6; - __e_acsl_mpz_t __gen_e_acsl_y_6; - __e_acsl_mpz_t __gen_e_acsl_add_6; - __gmpz_init_set(__gen_e_acsl_x_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_arg)); - __gmpz_init_set(__gen_e_acsl_y_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg)); - __gmpz_init(__gen_e_acsl_add_6); - __gmpz_add(__gen_e_acsl_add_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_6), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_6)); - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_6)); - __gmpz_clear(__gen_e_acsl_x_6); - __gmpz_clear(__gen_e_acsl_y_6); - __gmpz_clear(__gen_e_acsl_add_6); - return; -} - -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg) +int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y) { - __e_acsl_mpz_t __gen_e_acsl_y_5; - __e_acsl_mpz_t __gen_e_acsl_x_5; - __e_acsl_mpz_t __gen_e_acsl_add_5; - __gmpz_init_set(__gen_e_acsl_y_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg)); - __gmpz_init_set_si(__gen_e_acsl_x_5,(long)__gen_e_acsl_x_arg); - __gmpz_init(__gen_e_acsl_add_5); - __gmpz_add(__gen_e_acsl_add_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_5)); - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_5)); - __gmpz_clear(__gen_e_acsl_y_5); - __gmpz_clear(__gen_e_acsl_x_5); - __gmpz_clear(__gen_e_acsl_add_5); - return; -} - -void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_x_4; - __e_acsl_mpz_t __gen_e_acsl_y_4; - __e_acsl_mpz_t __gen_e_acsl_add_4; - __gmpz_init_set_si(__gen_e_acsl_x_4,(long)__gen_e_acsl_x_arg); - __gmpz_init_set_si(__gen_e_acsl_y_4,(long)__gen_e_acsl_y_arg); - __gmpz_init(__gen_e_acsl_add_4); - __gmpz_add(__gen_e_acsl_add_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_4)); - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4)); - __gmpz_clear(__gen_e_acsl_x_4); - __gmpz_clear(__gen_e_acsl_y_4); - __gmpz_clear(__gen_e_acsl_add_4); - return; -} - -int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg, - __e_acsl_mpz_struct * __gen_e_acsl_y_arg) -{ - int __retres; - __e_acsl_mpz_t __gen_e_acsl_y_3; __e_acsl_mpz_t __gen_e_acsl_x_3; __e_acsl_mpz_t __gen_e_acsl_add_3; __e_acsl_mpz_t __gen_e_acsl__4; int __gen_e_acsl_gt_3; - __gmpz_init_set(__gen_e_acsl_y_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg)); - __gmpz_init_set_si(__gen_e_acsl_x_3,(long)__gen_e_acsl_x_arg); + __gmpz_init_set_si(__gen_e_acsl_x_3,(long)x); __gmpz_init(__gen_e_acsl_add_3); __gmpz_add(__gen_e_acsl_add_3, (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_3)); + (__e_acsl_mpz_struct const *)(y)); __gmpz_init_set_si(__gen_e_acsl__4,0L); __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3), (__e_acsl_mpz_struct const *)(__gen_e_acsl__4)); - __retres = __gen_e_acsl_gt_3 > 0; - __gmpz_clear(__gen_e_acsl_y_3); + int __retres = __gen_e_acsl_gt_3 > 0; __gmpz_clear(__gen_e_acsl_x_3); __gmpz_clear(__gen_e_acsl_add_3); __gmpz_clear(__gen_e_acsl__4); return __retres; } -int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) +int __gen_e_acsl_p2(int x, int y) { - int __retres; __e_acsl_mpz_t __gen_e_acsl_x_2; __e_acsl_mpz_t __gen_e_acsl_y_2; __e_acsl_mpz_t __gen_e_acsl_add_2; __e_acsl_mpz_t __gen_e_acsl__2; int __gen_e_acsl_gt_2; - __gmpz_init_set_si(__gen_e_acsl_x_2,(long)__gen_e_acsl_x_arg); - __gmpz_init_set_si(__gen_e_acsl_y_2,(long)__gen_e_acsl_y_arg); + __gmpz_init_set_si(__gen_e_acsl_x_2,(long)x); + __gmpz_init_set_si(__gen_e_acsl_y_2,(long)y); __gmpz_init(__gen_e_acsl_add_2); __gmpz_add(__gen_e_acsl_add_2, (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_2), @@ -461,7 +368,7 @@ int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) __gmpz_init_set_si(__gen_e_acsl__2,0L); __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2), (__e_acsl_mpz_struct const *)(__gen_e_acsl__2)); - __retres = __gen_e_acsl_gt_2 > 0; + int __retres = __gen_e_acsl_gt_2 > 0; __gmpz_clear(__gen_e_acsl_x_2); __gmpz_clear(__gen_e_acsl_y_2); __gmpz_clear(__gen_e_acsl_add_2); @@ -469,28 +376,74 @@ int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) return __retres; } -int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg) +int __gen_e_acsl_k_pred(int x) { - int __retres; __e_acsl_mpz_t __gen_e_acsl_x; - __e_acsl_mpz_t __gen_e_acsl_y; - __e_acsl_mpz_t __gen_e_acsl_add; __e_acsl_mpz_t __gen_e_acsl_; int __gen_e_acsl_gt; - __gmpz_init_set_si(__gen_e_acsl_x,(long)__gen_e_acsl_x_arg); - __gmpz_init_set_si(__gen_e_acsl_y,(long)__gen_e_acsl_y_arg); - __gmpz_init(__gen_e_acsl_add); - __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y)); + __gmpz_init_set_si(__gen_e_acsl_x,(long)x); __gmpz_init_set_si(__gen_e_acsl_,0L); - __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add), + __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_x), (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); - __retres = __gen_e_acsl_gt > 0; + int __retres = __gen_e_acsl_gt > 0; __gmpz_clear(__gen_e_acsl_x); - __gmpz_clear(__gen_e_acsl_y); - __gmpz_clear(__gen_e_acsl_add); __gmpz_clear(__gen_e_acsl_); return __retres; } +void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x, + __e_acsl_mpz_struct * y) +{ + __e_acsl_mpz_t __gen_e_acsl_add_6; + __gmpz_init(__gen_e_acsl_add_6); + __gmpz_add(__gen_e_acsl_add_6,(__e_acsl_mpz_struct const *)(x), + (__e_acsl_mpz_struct const *)(y)); + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_6)); + __gmpz_clear(__gen_e_acsl_add_6); + return; +} + +void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x, + __e_acsl_mpz_struct * y) +{ + __e_acsl_mpz_t __gen_e_acsl_x_5; + __e_acsl_mpz_t __gen_e_acsl_add_5; + __gmpz_init_set_si(__gen_e_acsl_x_5,(long)x); + __gmpz_init(__gen_e_acsl_add_5); + __gmpz_add(__gen_e_acsl_add_5, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_5), + (__e_acsl_mpz_struct const *)(y)); + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_5)); + __gmpz_clear(__gen_e_acsl_x_5); + __gmpz_clear(__gen_e_acsl_add_5); + return; +} + +void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int x, int y) +{ + __e_acsl_mpz_t __gen_e_acsl_x_4; + __e_acsl_mpz_t __gen_e_acsl_y_3; + __e_acsl_mpz_t __gen_e_acsl_add_4; + __gmpz_init_set_si(__gen_e_acsl_x_4,(long)x); + __gmpz_init_set_si(__gen_e_acsl_y_3,(long)y); + __gmpz_init(__gen_e_acsl_add_4); + __gmpz_add(__gen_e_acsl_add_4, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_3)); + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4)); + __gmpz_clear(__gen_e_acsl_x_4); + __gmpz_clear(__gen_e_acsl_y_3); + __gmpz_clear(__gen_e_acsl_add_4); + return; +} + +char __gen_e_acsl_h_char(int c) +{ + char __retres = (char)c; + return __retres; +} + diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c index 57ff6cf6273..5c263c6479e 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c @@ -2,622 +2,207 @@ #include "stdio.h" #include "stdlib.h" /*@ logic ℤ f1(ℤ n) = n ≤ 0? 0: f1(n - 1) + n; - -*/ -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - long __gen_e_acsl_n_arg); - -void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg); - -void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg); - + */ /*@ logic ℤ f2(ℤ n) = n < 0? 1: (f2(n - 1) * f2(n - 2)) / f2(n - 3); + */ +int __gen_e_acsl_f2_2(long n); -*/ -int __gen_e_acsl_f2_2(long __gen_e_acsl_n_arg); - -int __gen_e_acsl_f2(int __gen_e_acsl_n_arg); - -int __gen_e_acsl_f2_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg); +int __gen_e_acsl_f2(int n); /*@ logic ℤ g(ℤ n) = 0; + */ +int __gen_e_acsl_g_5(long n); -*/ -int __gen_e_acsl_g_2(long __gen_e_acsl_n_arg); - -int __gen_e_acsl_g(int __gen_e_acsl_n_arg); - -int __gen_e_acsl_g_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg); +int __gen_e_acsl_g(int n); /*@ logic ℤ f3(ℤ n) = n > 0? g(n) * f3(n - 1) - 5: g(n + 1); + */ +int __gen_e_acsl_f3_2(long n); -*/ -int __gen_e_acsl_f3_2(long __gen_e_acsl_n_arg); - -int __gen_e_acsl_f3(int __gen_e_acsl_n_arg); - -int __gen_e_acsl_f3_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg); +int __gen_e_acsl_f3(int n); /*@ logic ℤ f4(ℤ n) = n < 100? f4(n + 1): (n < 0x7fffffffffffffffL? 0x7fffffffffffffffL: 6); */ -unsigned long __gen_e_acsl_f4_2(long __gen_e_acsl_n_arg); - -unsigned long __gen_e_acsl_f4(int __gen_e_acsl_n_arg); +unsigned long __gen_e_acsl_f4_2(long n); -unsigned long __gen_e_acsl_f4_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg); +unsigned long __gen_e_acsl_f4(int n); int main(void) { int __retres; __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); - /*@ assert f1(0) ≡ 0; */ - { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp; - __e_acsl_mpz_t __gen_e_acsl__7; - int __gen_e_acsl_eq; - __gmpz_init(__gen_e_acsl_f1_tapp); - /*@ assert - Eva: initialization: - \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp); - */ - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp,0); - __gmpz_init_set_si(__gen_e_acsl__7,0L); - __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__7)); - __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main", - (char *)"f1(0) == 0",21); - __gmpz_clear(__gen_e_acsl_f1_tapp); - __gmpz_clear(__gen_e_acsl__7); - } - /*@ assert f1(1) ≡ 1; */ - { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_5; - __e_acsl_mpz_t __gen_e_acsl__8; - int __gen_e_acsl_eq_2; - __gmpz_init(__gen_e_acsl_f1_tapp_5); - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_5,1); - __gmpz_init_set_si(__gen_e_acsl__8,1L); - __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__8)); - __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion", - (char *)"main",(char *)"f1(1) == 1",22); - __gmpz_clear(__gen_e_acsl_f1_tapp_5); - __gmpz_clear(__gen_e_acsl__8); - } - /*@ assert f1(100) ≡ 5050; */ - { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_6; - __e_acsl_mpz_t __gen_e_acsl__9; - int __gen_e_acsl_eq_3; - __gmpz_init(__gen_e_acsl_f1_tapp_6); - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_6,100); - __gmpz_init_set_si(__gen_e_acsl__9,5050L); - __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_6), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__9)); - __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion", - (char *)"main",(char *)"f1(100) == 5050",23); - __gmpz_clear(__gen_e_acsl_f1_tapp_6); - __gmpz_clear(__gen_e_acsl__9); - } /*@ assert f2(7) ≡ 1; */ { - int __gen_e_acsl_f2_tapp; - __gen_e_acsl_f2_tapp = __gen_e_acsl_f2(7); - __e_acsl_assert(__gen_e_acsl_f2_tapp == 1,(char *)"Assertion", + int __gen_e_acsl_f2_14; + __gen_e_acsl_f2_14 = __gen_e_acsl_f2(7); + __e_acsl_assert(__gen_e_acsl_f2_14 == 1,(char *)"Assertion", (char *)"main",(char *)"f2(7) == 1",25); } /*@ assert f3(6) ≡ -5; */ { - int __gen_e_acsl_f3_tapp; - __gen_e_acsl_f3_tapp = __gen_e_acsl_f3(6); - __e_acsl_assert(__gen_e_acsl_f3_tapp == -5,(char *)"Assertion", + int __gen_e_acsl_f3_6; + __gen_e_acsl_f3_6 = __gen_e_acsl_f3(6); + __e_acsl_assert(__gen_e_acsl_f3_6 == -5,(char *)"Assertion", (char *)"main",(char *)"f3(6) == -5",27); } /*@ assert f4(9) > 0; */ { - unsigned long __gen_e_acsl_f4_tapp; - __gen_e_acsl_f4_tapp = __gen_e_acsl_f4(9); - __e_acsl_assert(__gen_e_acsl_f4_tapp > 0UL,(char *)"Assertion", + unsigned long __gen_e_acsl_f4_6; + __gen_e_acsl_f4_6 = __gen_e_acsl_f4(9); + __e_acsl_assert(__gen_e_acsl_f4_6 > 0UL,(char *)"Assertion", (char *)"main",(char *)"f4(9) > 0",29); } __retres = 0; return __retres; } -unsigned long __gen_e_acsl_f4_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg) +int __gen_e_acsl_f2_2(long n) { - unsigned long __retres; - __e_acsl_mpz_t __gen_e_acsl_n_11; - __e_acsl_mpz_t __gen_e_acsl__23; - int __gen_e_acsl_lt_2; - unsigned long __gen_e_acsl_if_11; - __gmpz_init_set(__gen_e_acsl_n_11, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__23,100L); - __gen_e_acsl_lt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__23)); - if (__gen_e_acsl_lt_2 < 0) { - __e_acsl_mpz_t __gen_e_acsl__24; - __e_acsl_mpz_t __gen_e_acsl_add_7; - unsigned long __gen_e_acsl_f4_tapp_4; - __gmpz_init_set_si(__gen_e_acsl__24,1L); - __gmpz_init(__gen_e_acsl_add_7); - __gmpz_add(__gen_e_acsl_add_7, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__24)); - __gen_e_acsl_f4_tapp_4 = __gen_e_acsl_f4_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_7); - __gen_e_acsl_if_11 = __gen_e_acsl_f4_tapp_4; - __gmpz_clear(__gen_e_acsl__24); - __gmpz_clear(__gen_e_acsl_add_7); - } + int __gen_e_acsl_if; + if (n < 0L) __gen_e_acsl_if = 1; else { - __e_acsl_mpz_t __gen_e_acsl__25; - int __gen_e_acsl_lt_3; - unsigned long __gen_e_acsl_if_10; - __gmpz_init_set_ui(__gen_e_acsl__25,9223372036854775807UL); - __gen_e_acsl_lt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__25)); - if (__gen_e_acsl_lt_3 < 0) __gen_e_acsl_if_10 = 9223372036854775807UL; - else __gen_e_acsl_if_10 = 6UL; - __gen_e_acsl_if_11 = __gen_e_acsl_if_10; - __gmpz_clear(__gen_e_acsl__25); + int __gen_e_acsl_f2_4; + int __gen_e_acsl_f2_6; + int __gen_e_acsl_f2_8; + __gen_e_acsl_f2_4 = __gen_e_acsl_f2_2(n - 1L); + __gen_e_acsl_f2_6 = __gen_e_acsl_f2_2(n - 2L); + __gen_e_acsl_f2_8 = __gen_e_acsl_f2_2(n - 3L); + __e_acsl_assert(__gen_e_acsl_f2_8 != 0,(char *)"RTE",(char *)"f2_2", + (char *)"division_by_zero: __gen_e_acsl_f2_8 != 0",9); + /*@ assert Eva: division_by_zero: __gen_e_acsl_f2_8 ≢ 0; */ + /*@ assert + Eva: signed_overflow: + -2147483648 ≤ __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6; + */ + /*@ assert + Eva: signed_overflow: + __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6 ≤ 2147483647; + */ + /*@ assert + Eva: signed_overflow: + (int)(__gen_e_acsl_f2_4 * __gen_e_acsl_f2_6) / __gen_e_acsl_f2_8 + ≤ 2147483647; + */ + __gen_e_acsl_if = (__gen_e_acsl_f2_4 * __gen_e_acsl_f2_6) / __gen_e_acsl_f2_8; } - __retres = __gen_e_acsl_if_11; - __gmpz_clear(__gen_e_acsl_n_11); - __gmpz_clear(__gen_e_acsl__23); - return __retres; + return __gen_e_acsl_if; } -unsigned long __gen_e_acsl_f4(int __gen_e_acsl_n_arg) +int __gen_e_acsl_f2(int n) { - unsigned long __retres; - unsigned long __gen_e_acsl_if_15; - if (__gen_e_acsl_n_arg < 100) { - unsigned long __gen_e_acsl_f4_tapp_2; - __gen_e_acsl_f4_tapp_2 = __gen_e_acsl_f4_2(__gen_e_acsl_n_arg + 1L); - __gen_e_acsl_if_15 = __gen_e_acsl_f4_tapp_2; - } + int __gen_e_acsl_if_2; + if (n < 0) __gen_e_acsl_if_2 = 1; else { - unsigned long __gen_e_acsl_if_14; - if ((long)__gen_e_acsl_n_arg < 9223372036854775807L) __gen_e_acsl_if_14 = 9223372036854775807UL; - else __gen_e_acsl_if_14 = 6UL; - __gen_e_acsl_if_15 = __gen_e_acsl_if_14; + int __gen_e_acsl_f2_9; + int __gen_e_acsl_f2_11; + int __gen_e_acsl_f2_13; + __gen_e_acsl_f2_9 = __gen_e_acsl_f2_2(n - 1L); + __gen_e_acsl_f2_11 = __gen_e_acsl_f2_2(n - 2L); + __gen_e_acsl_f2_13 = __gen_e_acsl_f2_2(n - 3L); + __e_acsl_assert(__gen_e_acsl_f2_13 != 0,(char *)"RTE",(char *)"f2", + (char *)"division_by_zero: __gen_e_acsl_f2_13 != 0",9); + /*@ assert Eva: division_by_zero: __gen_e_acsl_f2_13 ≢ 0; */ + /*@ assert + Eva: signed_overflow: + -2147483648 ≤ __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11; + */ + /*@ assert + Eva: signed_overflow: + __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11 ≤ 2147483647; + */ + /*@ assert + Eva: signed_overflow: + (int)(__gen_e_acsl_f2_9 * __gen_e_acsl_f2_11) / __gen_e_acsl_f2_13 + ≤ 2147483647; + */ + __gen_e_acsl_if_2 = (__gen_e_acsl_f2_9 * __gen_e_acsl_f2_11) / __gen_e_acsl_f2_13; } - __retres = __gen_e_acsl_if_15; - return __retres; + return __gen_e_acsl_if_2; } -unsigned long __gen_e_acsl_f4_2(long __gen_e_acsl_n_arg) +int __gen_e_acsl_g_5(long n) { - unsigned long __retres; - unsigned long __gen_e_acsl_if_13; - if (__gen_e_acsl_n_arg < 100L) { - __e_acsl_mpz_t __gen_e_acsl_n_10; - __e_acsl_mpz_t __gen_e_acsl__22; - __e_acsl_mpz_t __gen_e_acsl_add_6; - unsigned long __gen_e_acsl_f4_tapp_3; - __gmpz_init_set_si(__gen_e_acsl_n_10,__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__22,1L); - __gmpz_init(__gen_e_acsl_add_6); - __gmpz_add(__gen_e_acsl_add_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_10), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__22)); - __gen_e_acsl_f4_tapp_3 = __gen_e_acsl_f4_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_6); - __gen_e_acsl_if_13 = __gen_e_acsl_f4_tapp_3; - __gmpz_clear(__gen_e_acsl_n_10); - __gmpz_clear(__gen_e_acsl__22); - __gmpz_clear(__gen_e_acsl_add_6); - } - else { - unsigned long __gen_e_acsl_if_12; - if (__gen_e_acsl_n_arg < 9223372036854775807L) __gen_e_acsl_if_12 = 9223372036854775807UL; - else __gen_e_acsl_if_12 = 6UL; - __gen_e_acsl_if_13 = __gen_e_acsl_if_12; - } - __retres = __gen_e_acsl_if_13; + int __retres = 0; return __retres; } -int __gen_e_acsl_f3_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg) +int __gen_e_acsl_g(int n) { - int __retres; - __e_acsl_mpz_t __gen_e_acsl_n_7; - __e_acsl_mpz_t __gen_e_acsl__18; - int __gen_e_acsl_gt; - int __gen_e_acsl_if_7; - __gmpz_init_set(__gen_e_acsl_n_7, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__18,0L); - __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__18)); - if (__gen_e_acsl_gt > 0) { - int __gen_e_acsl_g_tapp_3; - __e_acsl_mpz_t __gen_e_acsl__19; - __e_acsl_mpz_t __gen_e_acsl_sub_10; - int __gen_e_acsl_f3_tapp_4; - __gen_e_acsl_g_tapp_3 = __gen_e_acsl_g_3((__e_acsl_mpz_struct *)__gen_e_acsl_n_7); - __gmpz_init_set_si(__gen_e_acsl__19,1L); - __gmpz_init(__gen_e_acsl_sub_10); - __gmpz_sub(__gen_e_acsl_sub_10, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__19)); - __gen_e_acsl_f3_tapp_4 = __gen_e_acsl_f3_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_10); - __gen_e_acsl_if_7 = __gen_e_acsl_g_tapp_3 * __gen_e_acsl_f3_tapp_4 - 5; - __gmpz_clear(__gen_e_acsl__19); - __gmpz_clear(__gen_e_acsl_sub_10); - } - else { - __e_acsl_mpz_t __gen_e_acsl__20; - __e_acsl_mpz_t __gen_e_acsl_add_4; - int __gen_e_acsl_g_tapp_4; - __gmpz_init_set_si(__gen_e_acsl__20,1L); - __gmpz_init(__gen_e_acsl_add_4); - __gmpz_add(__gen_e_acsl_add_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__20)); - __gen_e_acsl_g_tapp_4 = __gen_e_acsl_g_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_4); - __gen_e_acsl_if_7 = __gen_e_acsl_g_tapp_4; - __gmpz_clear(__gen_e_acsl__20); - __gmpz_clear(__gen_e_acsl_add_4); - } - __retres = __gen_e_acsl_if_7; - __gmpz_clear(__gen_e_acsl_n_7); - __gmpz_clear(__gen_e_acsl__18); + int __retres = 0; return __retres; } -int __gen_e_acsl_f3(int __gen_e_acsl_n_arg) +int __gen_e_acsl_f3_2(long n) { - int __retres; - int __gen_e_acsl_if_9; - if (__gen_e_acsl_n_arg > 0) { - int __gen_e_acsl_g_tapp; - int __gen_e_acsl_f3_tapp_2; - __gen_e_acsl_g_tapp = __gen_e_acsl_g(__gen_e_acsl_n_arg); - __gen_e_acsl_f3_tapp_2 = __gen_e_acsl_f3_2(__gen_e_acsl_n_arg - 1L); - __gen_e_acsl_if_9 = __gen_e_acsl_g_tapp * __gen_e_acsl_f3_tapp_2 - 5; + int __gen_e_acsl_if_3; + if (n > 0L) { + int __gen_e_acsl_g_4; + int __gen_e_acsl_f3_4; + __gen_e_acsl_g_4 = __gen_e_acsl_g((int)n); + __gen_e_acsl_f3_4 = __gen_e_acsl_f3_2(n - 1L); + __gen_e_acsl_if_3 = __gen_e_acsl_g_4 * __gen_e_acsl_f3_4 - 5; } else { - int __gen_e_acsl_g_tapp_6; - __gen_e_acsl_g_tapp_6 = __gen_e_acsl_g_2(__gen_e_acsl_n_arg + 1L); - __gen_e_acsl_if_9 = __gen_e_acsl_g_tapp_6; + int __gen_e_acsl_g_6; + __gen_e_acsl_g_6 = __gen_e_acsl_g_5(n + 1L); + __gen_e_acsl_if_3 = __gen_e_acsl_g_6; } - __retres = __gen_e_acsl_if_9; - return __retres; + return __gen_e_acsl_if_3; } -int __gen_e_acsl_f3_2(long __gen_e_acsl_n_arg) +int __gen_e_acsl_f3(int n) { - int __retres; - int __gen_e_acsl_if_8; - if (__gen_e_acsl_n_arg > 0L) { - int __gen_e_acsl_g_tapp_2; - __e_acsl_mpz_t __gen_e_acsl_n_6; - __e_acsl_mpz_t __gen_e_acsl__17; - __e_acsl_mpz_t __gen_e_acsl_sub_9; - int __gen_e_acsl_f3_tapp_3; - __gen_e_acsl_g_tapp_2 = __gen_e_acsl_g_2(__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl_n_6,__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__17,1L); - __gmpz_init(__gen_e_acsl_sub_9); - __gmpz_sub(__gen_e_acsl_sub_9, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__17)); - __gen_e_acsl_f3_tapp_3 = __gen_e_acsl_f3_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_9); - __gen_e_acsl_if_8 = __gen_e_acsl_g_tapp_2 * __gen_e_acsl_f3_tapp_3 - 5; - __gmpz_clear(__gen_e_acsl_n_6); - __gmpz_clear(__gen_e_acsl__17); - __gmpz_clear(__gen_e_acsl_sub_9); - } - else { - __e_acsl_mpz_t __gen_e_acsl_n_9; - __e_acsl_mpz_t __gen_e_acsl__21; - __e_acsl_mpz_t __gen_e_acsl_add_5; - int __gen_e_acsl_g_tapp_5; - __gmpz_init_set_si(__gen_e_acsl_n_9,__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__21,1L); - __gmpz_init(__gen_e_acsl_add_5); - __gmpz_add(__gen_e_acsl_add_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__21)); - __gen_e_acsl_g_tapp_5 = __gen_e_acsl_g_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_5); - __gen_e_acsl_if_8 = __gen_e_acsl_g_tapp_5; - __gmpz_clear(__gen_e_acsl_n_9); - __gmpz_clear(__gen_e_acsl__21); - __gmpz_clear(__gen_e_acsl_add_5); - } - __retres = __gen_e_acsl_if_8; - return __retres; -} - -int __gen_e_acsl_g_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - int __retres; - __e_acsl_mpz_t __gen_e_acsl_n_8; - __gmpz_init_set(__gen_e_acsl_n_8, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __retres = 0; - __gmpz_clear(__gen_e_acsl_n_8); - return __retres; -} - -int __gen_e_acsl_g(int __gen_e_acsl_n_arg) -{ - int __retres; - __retres = 0; - return __retres; -} - -int __gen_e_acsl_g_2(long __gen_e_acsl_n_arg) -{ - int __retres; - __retres = 0; - return __retres; -} - -int __gen_e_acsl_f2_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - int __retres; - __e_acsl_mpz_t __gen_e_acsl_n_5; - __e_acsl_mpz_t __gen_e_acsl__11; - int __gen_e_acsl_lt; int __gen_e_acsl_if_4; - __gmpz_init_set(__gen_e_acsl_n_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__11,0L); - __gen_e_acsl_lt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__11)); - if (__gen_e_acsl_lt < 0) __gen_e_acsl_if_4 = 1; - else { - __e_acsl_mpz_t __gen_e_acsl__12; - __e_acsl_mpz_t __gen_e_acsl_sub_4; - int __gen_e_acsl_f2_tapp_4; - __e_acsl_mpz_t __gen_e_acsl__13; - __e_acsl_mpz_t __gen_e_acsl_sub_5; - int __gen_e_acsl_f2_tapp_5; - __e_acsl_mpz_t __gen_e_acsl__14; - __e_acsl_mpz_t __gen_e_acsl_sub_6; - int __gen_e_acsl_f2_tapp_6; - __gmpz_init_set_si(__gen_e_acsl__12,1L); - __gmpz_init(__gen_e_acsl_sub_4); - __gmpz_sub(__gen_e_acsl_sub_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__12)); - __gen_e_acsl_f2_tapp_4 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_4); - __gmpz_init_set_si(__gen_e_acsl__13,2L); - __gmpz_init(__gen_e_acsl_sub_5); - __gmpz_sub(__gen_e_acsl_sub_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__13)); - __gen_e_acsl_f2_tapp_5 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_5); - __gmpz_init_set_si(__gen_e_acsl__14,3L); - __gmpz_init(__gen_e_acsl_sub_6); - __gmpz_sub(__gen_e_acsl_sub_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__14)); - __gen_e_acsl_f2_tapp_6 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_6); - __e_acsl_assert(__gen_e_acsl_f2_tapp_6 != 0,(char *)"RTE",(char *)"f2_3", - (char *)"division_by_zero: __gen_e_acsl_f2_tapp_6 != 0", - 9); - __gen_e_acsl_if_4 = (__gen_e_acsl_f2_tapp_4 * __gen_e_acsl_f2_tapp_5) / __gen_e_acsl_f2_tapp_6; - __gmpz_clear(__gen_e_acsl__12); - __gmpz_clear(__gen_e_acsl_sub_4); - __gmpz_clear(__gen_e_acsl__13); - __gmpz_clear(__gen_e_acsl_sub_5); - __gmpz_clear(__gen_e_acsl__14); - __gmpz_clear(__gen_e_acsl_sub_6); - } - __retres = __gen_e_acsl_if_4; - __gmpz_clear(__gen_e_acsl_n_5); - __gmpz_clear(__gen_e_acsl__11); - return __retres; -} - -int __gen_e_acsl_f2(int __gen_e_acsl_n_arg) -{ - int __retres; - int __gen_e_acsl_if_6; - if (__gen_e_acsl_n_arg < 0) __gen_e_acsl_if_6 = 1; - else { - int __gen_e_acsl_f2_tapp_2; - int __gen_e_acsl_f2_tapp_9; - int __gen_e_acsl_f2_tapp_10; - __gen_e_acsl_f2_tapp_2 = __gen_e_acsl_f2_2(__gen_e_acsl_n_arg - 1L); - __gen_e_acsl_f2_tapp_9 = __gen_e_acsl_f2_2(__gen_e_acsl_n_arg - 2L); - __gen_e_acsl_f2_tapp_10 = __gen_e_acsl_f2_2(__gen_e_acsl_n_arg - 3L); - __e_acsl_assert(__gen_e_acsl_f2_tapp_10 != 0,(char *)"RTE",(char *)"f2", - (char *)"division_by_zero: __gen_e_acsl_f2_tapp_10 != 0", - 9); - __gen_e_acsl_if_6 = (__gen_e_acsl_f2_tapp_2 * __gen_e_acsl_f2_tapp_9) / __gen_e_acsl_f2_tapp_10; - } - __retres = __gen_e_acsl_if_6; - return __retres; -} - -int __gen_e_acsl_f2_2(long __gen_e_acsl_n_arg) -{ - int __retres; - int __gen_e_acsl_if_5; - if (__gen_e_acsl_n_arg < 0L) __gen_e_acsl_if_5 = 1; - else { - __e_acsl_mpz_t __gen_e_acsl_n_4; - __e_acsl_mpz_t __gen_e_acsl__10; - __e_acsl_mpz_t __gen_e_acsl_sub_3; - int __gen_e_acsl_f2_tapp_3; - __e_acsl_mpz_t __gen_e_acsl__15; - __e_acsl_mpz_t __gen_e_acsl_sub_7; - int __gen_e_acsl_f2_tapp_7; - __e_acsl_mpz_t __gen_e_acsl__16; - __e_acsl_mpz_t __gen_e_acsl_sub_8; - int __gen_e_acsl_f2_tapp_8; - __gmpz_init_set_si(__gen_e_acsl_n_4,__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__10,1L); - __gmpz_init(__gen_e_acsl_sub_3); - __gmpz_sub(__gen_e_acsl_sub_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__10)); - __gen_e_acsl_f2_tapp_3 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_3); - __gmpz_init_set_si(__gen_e_acsl__15,2L); - __gmpz_init(__gen_e_acsl_sub_7); - __gmpz_sub(__gen_e_acsl_sub_7, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__15)); - __gen_e_acsl_f2_tapp_7 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_7); - __gmpz_init_set_si(__gen_e_acsl__16,3L); - __gmpz_init(__gen_e_acsl_sub_8); - __gmpz_sub(__gen_e_acsl_sub_8, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__16)); - __gen_e_acsl_f2_tapp_8 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_8); - __e_acsl_assert(__gen_e_acsl_f2_tapp_8 != 0,(char *)"RTE",(char *)"f2_2", - (char *)"division_by_zero: __gen_e_acsl_f2_tapp_8 != 0", - 9); - __gen_e_acsl_if_5 = (__gen_e_acsl_f2_tapp_3 * __gen_e_acsl_f2_tapp_7) / __gen_e_acsl_f2_tapp_8; - __gmpz_clear(__gen_e_acsl_n_4); - __gmpz_clear(__gen_e_acsl__10); - __gmpz_clear(__gen_e_acsl_sub_3); - __gmpz_clear(__gen_e_acsl__15); - __gmpz_clear(__gen_e_acsl_sub_7); - __gmpz_clear(__gen_e_acsl__16); - __gmpz_clear(__gen_e_acsl_sub_8); - } - __retres = __gen_e_acsl_if_5; - return __retres; -} - -void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_2; - __e_acsl_mpz_t __gen_e_acsl__4; - int __gen_e_acsl_le; - __e_acsl_mpz_t __gen_e_acsl_if; - __gmpz_init_set(__gen_e_acsl_n_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__4,0L); - __gen_e_acsl_le = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__4)); - if (__gen_e_acsl_le <= 0) { - __e_acsl_mpz_t __gen_e_acsl__5; - __gmpz_init_set_si(__gen_e_acsl__5,0L); - __gmpz_init_set(__gen_e_acsl_if, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__5)); - __gmpz_clear(__gen_e_acsl__5); + if (n > 0) { + int __gen_e_acsl_g_2; + int __gen_e_acsl_f3_5; + __gen_e_acsl_g_2 = __gen_e_acsl_g(n); + __gen_e_acsl_f3_5 = __gen_e_acsl_f3_2(n - 1L); + __gen_e_acsl_if_4 = __gen_e_acsl_g_2 * __gen_e_acsl_f3_5 - 5; } else { - __e_acsl_mpz_t __gen_e_acsl__6; - __e_acsl_mpz_t __gen_e_acsl_sub_2; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4; - __e_acsl_mpz_t __gen_e_acsl_add; - __gmpz_init_set_si(__gen_e_acsl__6,1L); - __gmpz_init(__gen_e_acsl_sub_2); - __gmpz_sub(__gen_e_acsl_sub_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__6)); - __gmpz_init(__gen_e_acsl_f1_tapp_4); - __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_2); - __gmpz_init(__gen_e_acsl_add); - __gmpz_add(__gen_e_acsl_add, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2)); - __gmpz_init_set(__gen_e_acsl_if, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add)); - __gmpz_clear(__gen_e_acsl__6); - __gmpz_clear(__gen_e_acsl_sub_2); - __gmpz_clear(__gen_e_acsl_f1_tapp_4); - __gmpz_clear(__gen_e_acsl_add); + int __gen_e_acsl_g_8; + __gen_e_acsl_g_8 = __gen_e_acsl_g_5(n + 1L); + __gen_e_acsl_if_4 = __gen_e_acsl_g_8; } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if)); - __gmpz_clear(__gen_e_acsl_n_2); - __gmpz_clear(__gen_e_acsl__4); - __gmpz_clear(__gen_e_acsl_if); - return; + return __gen_e_acsl_if_4; } -void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg) +unsigned long __gen_e_acsl_f4_2(long n) { - __e_acsl_mpz_t __gen_e_acsl_if_3; - if (__gen_e_acsl_n_arg <= 0) { - __e_acsl_mpz_t __gen_e_acsl_; - __gmpz_init_set_si(__gen_e_acsl_,0L); - __gmpz_init_set(__gen_e_acsl_if_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); - __gmpz_clear(__gen_e_acsl_); + unsigned long __gen_e_acsl_if_6; + if (n < 100L) { + unsigned long __gen_e_acsl_f4_4; + __gen_e_acsl_f4_4 = __gen_e_acsl_f4_2(n + 1L); + __gen_e_acsl_if_6 = __gen_e_acsl_f4_4; } else { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_2; - __e_acsl_mpz_t __gen_e_acsl_n_3; - __e_acsl_mpz_t __gen_e_acsl_add_3; - __gmpz_init(__gen_e_acsl_f1_tapp_2); - __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2, - __gen_e_acsl_n_arg - 1L); - __gmpz_init_set_si(__gen_e_acsl_n_3,(long)__gen_e_acsl_n_arg); - __gmpz_init(__gen_e_acsl_add_3); - __gmpz_add(__gen_e_acsl_add_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3)); - __gmpz_init_set(__gen_e_acsl_if_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3)); - __gmpz_clear(__gen_e_acsl_f1_tapp_2); - __gmpz_clear(__gen_e_acsl_n_3); - __gmpz_clear(__gen_e_acsl_add_3); + unsigned long __gen_e_acsl_if_5; + if (n < 9223372036854775807L) __gen_e_acsl_if_5 = 9223372036854775807UL; + else __gen_e_acsl_if_5 = 6UL; + __gen_e_acsl_if_6 = __gen_e_acsl_if_5; } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_3)); - __gmpz_clear(__gen_e_acsl_if_3); - return; + return __gen_e_acsl_if_6; } -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - long __gen_e_acsl_n_arg) +unsigned long __gen_e_acsl_f4(int n) { - __e_acsl_mpz_t __gen_e_acsl_if_2; - if (__gen_e_acsl_n_arg <= 0L) { - __e_acsl_mpz_t __gen_e_acsl__2; - __gmpz_init_set_si(__gen_e_acsl__2,0L); - __gmpz_init_set(__gen_e_acsl_if_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__2)); - __gmpz_clear(__gen_e_acsl__2); + unsigned long __gen_e_acsl_if_8; + if (n < 100) { + unsigned long __gen_e_acsl_f4_5; + __gen_e_acsl_f4_5 = __gen_e_acsl_f4_2(n + 1L); + __gen_e_acsl_if_8 = __gen_e_acsl_f4_5; } else { - __e_acsl_mpz_t __gen_e_acsl_n; - __e_acsl_mpz_t __gen_e_acsl__3; - __e_acsl_mpz_t __gen_e_acsl_sub; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3; - __e_acsl_mpz_t __gen_e_acsl_add_2; - __gmpz_init_set_si(__gen_e_acsl_n,__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__3,1L); - __gmpz_init(__gen_e_acsl_sub); - __gmpz_sub(__gen_e_acsl_sub, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__3)); - __gmpz_init(__gen_e_acsl_f1_tapp_3); - __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub); - __gmpz_init(__gen_e_acsl_add_2); - __gmpz_add(__gen_e_acsl_add_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n)); - __gmpz_init_set(__gen_e_acsl_if_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2)); - __gmpz_clear(__gen_e_acsl_n); - __gmpz_clear(__gen_e_acsl__3); - __gmpz_clear(__gen_e_acsl_sub); - __gmpz_clear(__gen_e_acsl_f1_tapp_3); - __gmpz_clear(__gen_e_acsl_add_2); + unsigned long __gen_e_acsl_if_7; + if ((long)n < 9223372036854775807L) __gen_e_acsl_if_7 = 9223372036854775807UL; + else __gen_e_acsl_if_7 = 6UL; + __gen_e_acsl_if_8 = __gen_e_acsl_if_7; } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_2)); - __gmpz_clear(__gen_e_acsl_if_2); - return; + return __gen_e_acsl_if_8; } diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c index 114902cf4bc..b7ac1c6bd4b 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c @@ -2,678 +2,103 @@ #include "stdio.h" #include "stdlib.h" /*@ logic ℤ f1(ℤ n) = n ≤ 0? 0: f1(n - 1) + n; - -*/ -void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg); - -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg); - + */ /*@ logic ℤ f2(ℤ n) = n < 0? 1: (f2(n - 1) * f2(n - 2)) / f2(n - 3); */ -void __gen_e_acsl_f2(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg); +void __gen_e_acsl_f2_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n); -void __gen_e_acsl_f2_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg); +void __gen_e_acsl_f2(__e_acsl_mpz_t *__retres_arg, int n); /*@ logic ℤ g(ℤ n) = 0; */ -void __gen_e_acsl_g(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg); +void __gen_e_acsl_g_5(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n); -void __gen_e_acsl_g_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg); +void __gen_e_acsl_g(__e_acsl_mpz_t *__retres_arg, int n); /*@ logic ℤ f3(ℤ n) = n > 0? g(n) * f3(n - 1) - 5: g(n + 1); */ -void __gen_e_acsl_f3(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg); +void __gen_e_acsl_f3_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n); -void __gen_e_acsl_f3_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg); +void __gen_e_acsl_f3(__e_acsl_mpz_t *__retres_arg, int n); /*@ logic ℤ f4(ℤ n) = n < 100? f4(n + 1): (n < 0x7fffffffffffffffL? 0x7fffffffffffffffL: 6); */ -void __gen_e_acsl_f4(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg); +void __gen_e_acsl_f4_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n); -void __gen_e_acsl_f4_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg); +void __gen_e_acsl_f4(__e_acsl_mpz_t *__retres_arg, int n); int main(void) { int __retres; __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); - /*@ assert f1(0) ≡ 0; */ + /*@ assert f2(7) ≡ 1; */ { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp; - __e_acsl_mpz_t __gen_e_acsl__7; + __e_acsl_mpz_t __gen_e_acsl_f2_14; + __e_acsl_mpz_t __gen_e_acsl__13; int __gen_e_acsl_eq; - __gmpz_init(__gen_e_acsl_f1_tapp); - /*@ assert - Eva: initialization: - \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp); - */ - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp,0); - __gmpz_init_set_si(__gen_e_acsl__7,0L); - __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__7)); + __gen_e_acsl_f2(& __gen_e_acsl_f2_14,7); + __gmpz_init_set_si(__gen_e_acsl__13,1L); + __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_14), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__13)); __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main", - (char *)"f1(0) == 0",21); - __gmpz_clear(__gen_e_acsl_f1_tapp); - __gmpz_clear(__gen_e_acsl__7); - } - /*@ assert f1(1) ≡ 1; */ - { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4; - __e_acsl_mpz_t __gen_e_acsl__8; - int __gen_e_acsl_eq_2; - __gmpz_init(__gen_e_acsl_f1_tapp_4); - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4,1); - __gmpz_init_set_si(__gen_e_acsl__8,1L); - __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__8)); - __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion", - (char *)"main",(char *)"f1(1) == 1",22); - __gmpz_clear(__gen_e_acsl_f1_tapp_4); - __gmpz_clear(__gen_e_acsl__8); - } - /*@ assert f1(100) ≡ 5050; */ - { - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_5; - __e_acsl_mpz_t __gen_e_acsl__9; - int __gen_e_acsl_eq_3; - __gmpz_init(__gen_e_acsl_f1_tapp_5); - __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_5,100); - __gmpz_init_set_si(__gen_e_acsl__9,5050L); - __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__9)); - __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion", - (char *)"main",(char *)"f1(100) == 5050",23); - __gmpz_clear(__gen_e_acsl_f1_tapp_5); - __gmpz_clear(__gen_e_acsl__9); - } - /*@ assert f2(7) ≡ 1; */ - { - __e_acsl_mpz_t __gen_e_acsl_f2_tapp; - __e_acsl_mpz_t __gen_e_acsl__22; - int __gen_e_acsl_eq_4; - __gmpz_init(__gen_e_acsl_f2_tapp); - __gen_e_acsl_f2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp,7); - __gmpz_init_set_si(__gen_e_acsl__22,1L); - __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__22)); - __e_acsl_assert(__gen_e_acsl_eq_4 == 0,(char *)"Assertion", - (char *)"main",(char *)"f2(7) == 1",25); - __gmpz_clear(__gen_e_acsl_f2_tapp); - __gmpz_clear(__gen_e_acsl__22); + (char *)"f2(7) == 1",25); + __gmpz_clear(__gen_e_acsl_f2_14); + __gmpz_clear(__gen_e_acsl__13); } /*@ assert f3(6) ≡ -5; */ { - __e_acsl_mpz_t __gen_e_acsl_f3_tapp; - __e_acsl_mpz_t __gen_e_acsl__33; + __e_acsl_mpz_t __gen_e_acsl_f3_6; + __e_acsl_mpz_t __gen_e_acsl__23; __e_acsl_mpz_t __gen_e_acsl_neg; - int __gen_e_acsl_eq_5; - __gmpz_init(__gen_e_acsl_f3_tapp); - __gen_e_acsl_f3((__e_acsl_mpz_struct *)__gen_e_acsl_f3_tapp,6); - __gmpz_init_set_si(__gen_e_acsl__33,5L); + int __gen_e_acsl_eq_2; + __gen_e_acsl_f3(& __gen_e_acsl_f3_6,6); + __gmpz_init_set_si(__gen_e_acsl__23,5L); __gmpz_init(__gen_e_acsl_neg); __gmpz_neg(__gen_e_acsl_neg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__33)); - __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_tapp), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__23)); + __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_6), (__e_acsl_mpz_struct const *)(__gen_e_acsl_neg)); - __e_acsl_assert(__gen_e_acsl_eq_5 == 0,(char *)"Assertion", + __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion", (char *)"main",(char *)"f3(6) == -5",27); - __gmpz_clear(__gen_e_acsl_f3_tapp); - __gmpz_clear(__gen_e_acsl__33); + __gmpz_clear(__gen_e_acsl_f3_6); + __gmpz_clear(__gen_e_acsl__23); __gmpz_clear(__gen_e_acsl_neg); } /*@ assert f4(9) > 0; */ { - __e_acsl_mpz_t __gen_e_acsl_f4_tapp; - __e_acsl_mpz_t __gen_e_acsl__44; + __e_acsl_mpz_t __gen_e_acsl_f4_6; + __e_acsl_mpz_t __gen_e_acsl__34; int __gen_e_acsl_gt_3; - __gmpz_init(__gen_e_acsl_f4_tapp); - __gen_e_acsl_f4((__e_acsl_mpz_struct *)__gen_e_acsl_f4_tapp,9); - __gmpz_init_set_si(__gen_e_acsl__44,0L); - __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_tapp), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__44)); + __gen_e_acsl_f4(& __gen_e_acsl_f4_6,9); + __gmpz_init_set_si(__gen_e_acsl__34,0L); + __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_6), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__34)); __e_acsl_assert(__gen_e_acsl_gt_3 > 0,(char *)"Assertion",(char *)"main", (char *)"f4(9) > 0",29); - __gmpz_clear(__gen_e_acsl_f4_tapp); - __gmpz_clear(__gen_e_acsl__44); + __gmpz_clear(__gen_e_acsl_f4_6); + __gmpz_clear(__gen_e_acsl__34); } __retres = 0; return __retres; } -void __gen_e_acsl_f4_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_14; - __e_acsl_mpz_t __gen_e_acsl__36; - int __gen_e_acsl_lt_4; - __e_acsl_mpz_t __gen_e_acsl_if_8; - __gmpz_init_set(__gen_e_acsl_n_14, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__36,100L); - __gen_e_acsl_lt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_14), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__36)); - if (__gen_e_acsl_lt_4 < 0) { - __e_acsl_mpz_t __gen_e_acsl__37; - __e_acsl_mpz_t __gen_e_acsl_add_6; - __e_acsl_mpz_t __gen_e_acsl_f4_tapp_3; - __gmpz_init_set_si(__gen_e_acsl__37,1L); - __gmpz_init(__gen_e_acsl_add_6); - __gmpz_add(__gen_e_acsl_add_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_14), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__37)); - __gmpz_init(__gen_e_acsl_f4_tapp_3); - __gen_e_acsl_f4_2((__e_acsl_mpz_struct *)__gen_e_acsl_f4_tapp_3, - (__e_acsl_mpz_struct *)__gen_e_acsl_add_6); - __gmpz_init_set(__gen_e_acsl_if_8, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_tapp_3)); - __gmpz_clear(__gen_e_acsl__37); - __gmpz_clear(__gen_e_acsl_add_6); - __gmpz_clear(__gen_e_acsl_f4_tapp_3); - } - else { - __e_acsl_mpz_t __gen_e_acsl__38; - int __gen_e_acsl_lt_5; - __e_acsl_mpz_t __gen_e_acsl_if_7; - __gmpz_init_set_ui(__gen_e_acsl__38,9223372036854775807UL); - __gen_e_acsl_lt_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_14), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__38)); - if (__gen_e_acsl_lt_5 < 0) { - __e_acsl_mpz_t __gen_e_acsl__39; - __gmpz_init_set_ui(__gen_e_acsl__39,9223372036854775807UL); - __gmpz_init_set(__gen_e_acsl_if_7, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__39)); - __gmpz_clear(__gen_e_acsl__39); - } - else { - __e_acsl_mpz_t __gen_e_acsl__40; - __gmpz_init_set_si(__gen_e_acsl__40,6L); - __gmpz_init_set(__gen_e_acsl_if_7, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__40)); - __gmpz_clear(__gen_e_acsl__40); - } - __gmpz_init_set(__gen_e_acsl_if_8, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_7)); - __gmpz_clear(__gen_e_acsl__38); - __gmpz_clear(__gen_e_acsl_if_7); - } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_8)); - __gmpz_clear(__gen_e_acsl_n_14); - __gmpz_clear(__gen_e_acsl__36); - __gmpz_clear(__gen_e_acsl_if_8); - return; -} - -void __gen_e_acsl_f4(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_12; - __e_acsl_mpz_t __gen_e_acsl__34; - int __gen_e_acsl_lt_3; - __e_acsl_mpz_t __gen_e_acsl_if_10; - __gmpz_init_set_si(__gen_e_acsl_n_12,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__34,100L); - __gen_e_acsl_lt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_12), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__34)); - if (__gen_e_acsl_lt_3 < 0) { - __e_acsl_mpz_t __gen_e_acsl_n_13; - __e_acsl_mpz_t __gen_e_acsl__35; - __e_acsl_mpz_t __gen_e_acsl_add_5; - __e_acsl_mpz_t __gen_e_acsl_f4_tapp_2; - __gmpz_init_set_si(__gen_e_acsl_n_13,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__35,1L); - __gmpz_init(__gen_e_acsl_add_5); - __gmpz_add(__gen_e_acsl_add_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_13), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__35)); - __gmpz_init(__gen_e_acsl_f4_tapp_2); - __gen_e_acsl_f4_2((__e_acsl_mpz_struct *)__gen_e_acsl_f4_tapp_2, - (__e_acsl_mpz_struct *)__gen_e_acsl_add_5); - __gmpz_init_set(__gen_e_acsl_if_10, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_tapp_2)); - __gmpz_clear(__gen_e_acsl_n_13); - __gmpz_clear(__gen_e_acsl__35); - __gmpz_clear(__gen_e_acsl_add_5); - __gmpz_clear(__gen_e_acsl_f4_tapp_2); - } - else { - __e_acsl_mpz_t __gen_e_acsl_n_15; - __e_acsl_mpz_t __gen_e_acsl__41; - int __gen_e_acsl_lt_6; - __e_acsl_mpz_t __gen_e_acsl_if_9; - __gmpz_init_set_si(__gen_e_acsl_n_15,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_ui(__gen_e_acsl__41,9223372036854775807UL); - __gen_e_acsl_lt_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_15), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__41)); - if (__gen_e_acsl_lt_6 < 0) { - __e_acsl_mpz_t __gen_e_acsl__42; - __gmpz_init_set_ui(__gen_e_acsl__42,9223372036854775807UL); - __gmpz_init_set(__gen_e_acsl_if_9, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__42)); - __gmpz_clear(__gen_e_acsl__42); - } - else { - __e_acsl_mpz_t __gen_e_acsl__43; - __gmpz_init_set_si(__gen_e_acsl__43,6L); - __gmpz_init_set(__gen_e_acsl_if_9, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__43)); - __gmpz_clear(__gen_e_acsl__43); - } - __gmpz_init_set(__gen_e_acsl_if_10, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_9)); - __gmpz_clear(__gen_e_acsl_n_15); - __gmpz_clear(__gen_e_acsl__41); - __gmpz_clear(__gen_e_acsl_if_9); - } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_10)); - __gmpz_clear(__gen_e_acsl_n_12); - __gmpz_clear(__gen_e_acsl__34); - __gmpz_clear(__gen_e_acsl_if_10); - return; -} - -void __gen_e_acsl_f3_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_9; - __e_acsl_mpz_t __gen_e_acsl__26; - int __gen_e_acsl_gt_2; - __e_acsl_mpz_t __gen_e_acsl_if_5; - __gmpz_init_set(__gen_e_acsl_n_9, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__26,0L); - __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__26)); - if (__gen_e_acsl_gt_2 > 0) { - __e_acsl_mpz_t __gen_e_acsl_g_tapp_2; - __e_acsl_mpz_t __gen_e_acsl__28; - __e_acsl_mpz_t __gen_e_acsl_sub_10; - __e_acsl_mpz_t __gen_e_acsl_f3_tapp_3; - __e_acsl_mpz_t __gen_e_acsl_mul_3; - __e_acsl_mpz_t __gen_e_acsl__29; - __e_acsl_mpz_t __gen_e_acsl_sub_11; - __gmpz_init(__gen_e_acsl_g_tapp_2); - __gen_e_acsl_g_2((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp_2, - (__e_acsl_mpz_struct *)__gen_e_acsl_n_9); - __gmpz_init_set_si(__gen_e_acsl__28,1L); - __gmpz_init(__gen_e_acsl_sub_10); - __gmpz_sub(__gen_e_acsl_sub_10, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__28)); - __gmpz_init(__gen_e_acsl_f3_tapp_3); - __gen_e_acsl_f3_2((__e_acsl_mpz_struct *)__gen_e_acsl_f3_tapp_3, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_10); - __gmpz_init(__gen_e_acsl_mul_3); - __gmpz_mul(__gen_e_acsl_mul_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_tapp_3)); - __gmpz_init_set_si(__gen_e_acsl__29,5L); - __gmpz_init(__gen_e_acsl_sub_11); - __gmpz_sub(__gen_e_acsl_sub_11, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__29)); - __gmpz_init_set(__gen_e_acsl_if_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_11)); - __gmpz_clear(__gen_e_acsl_g_tapp_2); - __gmpz_clear(__gen_e_acsl__28); - __gmpz_clear(__gen_e_acsl_sub_10); - __gmpz_clear(__gen_e_acsl_f3_tapp_3); - __gmpz_clear(__gen_e_acsl_mul_3); - __gmpz_clear(__gen_e_acsl__29); - __gmpz_clear(__gen_e_acsl_sub_11); - } - else { - __e_acsl_mpz_t __gen_e_acsl__30; - __e_acsl_mpz_t __gen_e_acsl_add_3; - __e_acsl_mpz_t __gen_e_acsl_g_tapp_3; - __gmpz_init_set_si(__gen_e_acsl__30,1L); - __gmpz_init(__gen_e_acsl_add_3); - __gmpz_add(__gen_e_acsl_add_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__30)); - __gmpz_init(__gen_e_acsl_g_tapp_3); - __gen_e_acsl_g_2((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp_3, - (__e_acsl_mpz_struct *)__gen_e_acsl_add_3); - __gmpz_init_set(__gen_e_acsl_if_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp_3)); - __gmpz_clear(__gen_e_acsl__30); - __gmpz_clear(__gen_e_acsl_add_3); - __gmpz_clear(__gen_e_acsl_g_tapp_3); - } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_5)); - __gmpz_clear(__gen_e_acsl_n_9); - __gmpz_clear(__gen_e_acsl__26); - __gmpz_clear(__gen_e_acsl_if_5); - return; -} - -void __gen_e_acsl_f3(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_7; - __e_acsl_mpz_t __gen_e_acsl__23; - int __gen_e_acsl_gt; - __e_acsl_mpz_t __gen_e_acsl_if_6; - __gmpz_init_set_si(__gen_e_acsl_n_7,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__23,0L); - __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__23)); - if (__gen_e_acsl_gt > 0) { - __e_acsl_mpz_t __gen_e_acsl_g_tapp; - __e_acsl_mpz_t __gen_e_acsl_n_8; - __e_acsl_mpz_t __gen_e_acsl__25; - __e_acsl_mpz_t __gen_e_acsl_sub_9; - __e_acsl_mpz_t __gen_e_acsl_f3_tapp_2; - __e_acsl_mpz_t __gen_e_acsl_mul_4; - __e_acsl_mpz_t __gen_e_acsl__31; - __e_acsl_mpz_t __gen_e_acsl_sub_12; - __gmpz_init(__gen_e_acsl_g_tapp); - __gen_e_acsl_g((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp, - __gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl_n_8,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__25,1L); - __gmpz_init(__gen_e_acsl_sub_9); - __gmpz_sub(__gen_e_acsl_sub_9, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_8), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__25)); - __gmpz_init(__gen_e_acsl_f3_tapp_2); - __gen_e_acsl_f3_2((__e_acsl_mpz_struct *)__gen_e_acsl_f3_tapp_2, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_9); - __gmpz_init(__gen_e_acsl_mul_4); - __gmpz_mul(__gen_e_acsl_mul_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_tapp_2)); - __gmpz_init_set_si(__gen_e_acsl__31,5L); - __gmpz_init(__gen_e_acsl_sub_12); - __gmpz_sub(__gen_e_acsl_sub_12, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__31)); - __gmpz_init_set(__gen_e_acsl_if_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_12)); - __gmpz_clear(__gen_e_acsl_g_tapp); - __gmpz_clear(__gen_e_acsl_n_8); - __gmpz_clear(__gen_e_acsl__25); - __gmpz_clear(__gen_e_acsl_sub_9); - __gmpz_clear(__gen_e_acsl_f3_tapp_2); - __gmpz_clear(__gen_e_acsl_mul_4); - __gmpz_clear(__gen_e_acsl__31); - __gmpz_clear(__gen_e_acsl_sub_12); - } - else { - __e_acsl_mpz_t __gen_e_acsl_n_11; - __e_acsl_mpz_t __gen_e_acsl__32; - __e_acsl_mpz_t __gen_e_acsl_add_4; - __e_acsl_mpz_t __gen_e_acsl_g_tapp_4; - __gmpz_init_set_si(__gen_e_acsl_n_11,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__32,1L); - __gmpz_init(__gen_e_acsl_add_4); - __gmpz_add(__gen_e_acsl_add_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__32)); - __gmpz_init(__gen_e_acsl_g_tapp_4); - __gen_e_acsl_g_2((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp_4, - (__e_acsl_mpz_struct *)__gen_e_acsl_add_4); - __gmpz_init_set(__gen_e_acsl_if_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp_4)); - __gmpz_clear(__gen_e_acsl_n_11); - __gmpz_clear(__gen_e_acsl__32); - __gmpz_clear(__gen_e_acsl_add_4); - __gmpz_clear(__gen_e_acsl_g_tapp_4); - } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_6)); - __gmpz_clear(__gen_e_acsl_n_7); - __gmpz_clear(__gen_e_acsl__23); - __gmpz_clear(__gen_e_acsl_if_6); - return; -} - -void __gen_e_acsl_g_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_10; - __e_acsl_mpz_t __gen_e_acsl__27; - __gmpz_init_set(__gen_e_acsl_n_10, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__27,0L); - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__27)); - __gmpz_clear(__gen_e_acsl_n_10); - __gmpz_clear(__gen_e_acsl__27); - return; -} - -void __gen_e_acsl_g(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl__24; - __gmpz_init_set_si(__gen_e_acsl__24,0L); - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__24)); - __gmpz_clear(__gen_e_acsl__24); - return; -} - -void __gen_e_acsl_f2_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_6; - __e_acsl_mpz_t __gen_e_acsl__13; - int __gen_e_acsl_lt_2; - __e_acsl_mpz_t __gen_e_acsl_if_3; - __gmpz_init_set(__gen_e_acsl_n_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); - __gmpz_init_set_si(__gen_e_acsl__13,0L); - __gen_e_acsl_lt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__13)); - if (__gen_e_acsl_lt_2 < 0) { - __e_acsl_mpz_t __gen_e_acsl__14; - __gmpz_init_set_si(__gen_e_acsl__14,1L); - __gmpz_init_set(__gen_e_acsl_if_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__14)); - __gmpz_clear(__gen_e_acsl__14); - } - else { - __e_acsl_mpz_t __gen_e_acsl__15; - __e_acsl_mpz_t __gen_e_acsl_sub_4; - __e_acsl_mpz_t __gen_e_acsl_f2_tapp_3; - __e_acsl_mpz_t __gen_e_acsl__16; - __e_acsl_mpz_t __gen_e_acsl_sub_5; - __e_acsl_mpz_t __gen_e_acsl_f2_tapp_4; - __e_acsl_mpz_t __gen_e_acsl_mul; - __e_acsl_mpz_t __gen_e_acsl__17; - __e_acsl_mpz_t __gen_e_acsl_sub_6; - __e_acsl_mpz_t __gen_e_acsl_f2_tapp_5; - __e_acsl_mpz_t __gen_e_acsl__18; - int __gen_e_acsl_div_guard; - __e_acsl_mpz_t __gen_e_acsl_div; - __gmpz_init_set_si(__gen_e_acsl__15,1L); - __gmpz_init(__gen_e_acsl_sub_4); - __gmpz_sub(__gen_e_acsl_sub_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__15)); - __gmpz_init(__gen_e_acsl_f2_tapp_3); - __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_3, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_4); - __gmpz_init_set_si(__gen_e_acsl__16,2L); - __gmpz_init(__gen_e_acsl_sub_5); - __gmpz_sub(__gen_e_acsl_sub_5, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__16)); - __gmpz_init(__gen_e_acsl_f2_tapp_4); - __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_4, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_5); - __gmpz_init(__gen_e_acsl_mul); - __gmpz_mul(__gen_e_acsl_mul, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_4)); - __gmpz_init_set_si(__gen_e_acsl__17,3L); - __gmpz_init(__gen_e_acsl_sub_6); - __gmpz_sub(__gen_e_acsl_sub_6, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__17)); - __gmpz_init(__gen_e_acsl_f2_tapp_5); - __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_5, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_6); - __gmpz_init_set_si(__gen_e_acsl__18,0L); - __gen_e_acsl_div_guard = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__18)); - __gmpz_init(__gen_e_acsl_div); - __e_acsl_assert(! (__gen_e_acsl_div_guard == 0),(char *)"Assertion", - (char *)"f2_2",(char *)"f2(n - 3) == 0",9); - __gmpz_tdiv_q(__gen_e_acsl_div, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_5)); - __gmpz_init_set(__gen_e_acsl_if_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_div)); - __gmpz_clear(__gen_e_acsl__15); - __gmpz_clear(__gen_e_acsl_sub_4); - __gmpz_clear(__gen_e_acsl_f2_tapp_3); - __gmpz_clear(__gen_e_acsl__16); - __gmpz_clear(__gen_e_acsl_sub_5); - __gmpz_clear(__gen_e_acsl_f2_tapp_4); - __gmpz_clear(__gen_e_acsl_mul); - __gmpz_clear(__gen_e_acsl__17); - __gmpz_clear(__gen_e_acsl_sub_6); - __gmpz_clear(__gen_e_acsl_f2_tapp_5); - __gmpz_clear(__gen_e_acsl__18); - __gmpz_clear(__gen_e_acsl_div); - } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_3)); - __gmpz_clear(__gen_e_acsl_n_6); - __gmpz_clear(__gen_e_acsl__13); - __gmpz_clear(__gen_e_acsl_if_3); - return; -} - -void __gen_e_acsl_f2(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg) +void __gen_e_acsl_f2_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n) { - __e_acsl_mpz_t __gen_e_acsl_n_4; - __e_acsl_mpz_t __gen_e_acsl__10; - int __gen_e_acsl_lt; - __e_acsl_mpz_t __gen_e_acsl_if_4; - __gmpz_init_set_si(__gen_e_acsl_n_4,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__10,0L); - __gen_e_acsl_lt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__10)); - if (__gen_e_acsl_lt < 0) { - __e_acsl_mpz_t __gen_e_acsl__11; - __gmpz_init_set_si(__gen_e_acsl__11,1L); - __gmpz_init_set(__gen_e_acsl_if_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__11)); - __gmpz_clear(__gen_e_acsl__11); - } - else { - __e_acsl_mpz_t __gen_e_acsl_n_5; - __e_acsl_mpz_t __gen_e_acsl__12; - __e_acsl_mpz_t __gen_e_acsl_sub_3; - __e_acsl_mpz_t __gen_e_acsl_f2_tapp_2; - __e_acsl_mpz_t __gen_e_acsl__19; - __e_acsl_mpz_t __gen_e_acsl_sub_7; - __e_acsl_mpz_t __gen_e_acsl_f2_tapp_6; - __e_acsl_mpz_t __gen_e_acsl_mul_2; - __e_acsl_mpz_t __gen_e_acsl__20; - __e_acsl_mpz_t __gen_e_acsl_sub_8; - __e_acsl_mpz_t __gen_e_acsl_f2_tapp_7; - __e_acsl_mpz_t __gen_e_acsl__21; - int __gen_e_acsl_div_guard_2; - __e_acsl_mpz_t __gen_e_acsl_div_2; - __gmpz_init_set_si(__gen_e_acsl_n_5,(long)__gen_e_acsl_n_arg); - __gmpz_init_set_si(__gen_e_acsl__12,1L); - __gmpz_init(__gen_e_acsl_sub_3); - __gmpz_sub(__gen_e_acsl_sub_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__12)); - __gmpz_init(__gen_e_acsl_f2_tapp_2); - __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_2, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_3); - __gmpz_init_set_si(__gen_e_acsl__19,2L); - __gmpz_init(__gen_e_acsl_sub_7); - __gmpz_sub(__gen_e_acsl_sub_7, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__19)); - __gmpz_init(__gen_e_acsl_f2_tapp_6); - __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_6, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_7); - __gmpz_init(__gen_e_acsl_mul_2); - __gmpz_mul(__gen_e_acsl_mul_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_6)); - __gmpz_init_set_si(__gen_e_acsl__20,3L); - __gmpz_init(__gen_e_acsl_sub_8); - __gmpz_sub(__gen_e_acsl_sub_8, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__20)); - __gmpz_init(__gen_e_acsl_f2_tapp_7); - __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_7, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_8); - __gmpz_init_set_si(__gen_e_acsl__21,0L); - __gen_e_acsl_div_guard_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_7), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__21)); - __gmpz_init(__gen_e_acsl_div_2); - __e_acsl_assert(! (__gen_e_acsl_div_guard_2 == 0),(char *)"Assertion", - (char *)"f2_2",(char *)"f2(n - 3) == 0",9); - __gmpz_tdiv_q(__gen_e_acsl_div_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_7)); - __gmpz_init_set(__gen_e_acsl_if_4, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_div_2)); - __gmpz_clear(__gen_e_acsl_n_5); - __gmpz_clear(__gen_e_acsl__12); - __gmpz_clear(__gen_e_acsl_sub_3); - __gmpz_clear(__gen_e_acsl_f2_tapp_2); - __gmpz_clear(__gen_e_acsl__19); - __gmpz_clear(__gen_e_acsl_sub_7); - __gmpz_clear(__gen_e_acsl_f2_tapp_6); - __gmpz_clear(__gen_e_acsl_mul_2); - __gmpz_clear(__gen_e_acsl__20); - __gmpz_clear(__gen_e_acsl_sub_8); - __gmpz_clear(__gen_e_acsl_f2_tapp_7); - __gmpz_clear(__gen_e_acsl__21); - __gmpz_clear(__gen_e_acsl_div_2); - } - __gmpz_init_set(__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_4)); - __gmpz_clear(__gen_e_acsl_n_4); - __gmpz_clear(__gen_e_acsl__10); - __gmpz_clear(__gen_e_acsl_if_4); - return; -} - -void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, - __e_acsl_mpz_struct * __gen_e_acsl_n_arg) -{ - __e_acsl_mpz_t __gen_e_acsl_n_3; __e_acsl_mpz_t __gen_e_acsl__4; - int __gen_e_acsl_le_2; + int __gen_e_acsl_lt_2; __e_acsl_mpz_t __gen_e_acsl_if; - __gmpz_init_set(__gen_e_acsl_n_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg)); __gmpz_init_set_si(__gen_e_acsl__4,0L); - __gen_e_acsl_le_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3), + __gen_e_acsl_lt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n), (__e_acsl_mpz_struct const *)(__gen_e_acsl__4)); - if (__gen_e_acsl_le_2 <= 0) { + if (__gen_e_acsl_lt_2 < 0) { __e_acsl_mpz_t __gen_e_acsl__5; - __gmpz_init_set_si(__gen_e_acsl__5,0L); + __gmpz_init_set_si(__gen_e_acsl__5,1L); __gmpz_init_set(__gen_e_acsl_if, (__e_acsl_mpz_struct const *)(__gen_e_acsl__5)); __gmpz_clear(__gen_e_acsl__5); @@ -681,57 +106,96 @@ void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg, else { __e_acsl_mpz_t __gen_e_acsl__6; __e_acsl_mpz_t __gen_e_acsl_sub_2; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3; - __e_acsl_mpz_t __gen_e_acsl_add; + __e_acsl_mpz_t __gen_e_acsl_f2_4; + __e_acsl_mpz_t __gen_e_acsl__7; + __e_acsl_mpz_t __gen_e_acsl_sub_3; + __e_acsl_mpz_t __gen_e_acsl_f2_6; + __e_acsl_mpz_t __gen_e_acsl_mul; + __e_acsl_mpz_t __gen_e_acsl__8; + __e_acsl_mpz_t __gen_e_acsl_sub_4; + __e_acsl_mpz_t __gen_e_acsl_f2_8; + __e_acsl_mpz_t __gen_e_acsl__9; + int __gen_e_acsl_div_guard; + __e_acsl_mpz_t __gen_e_acsl_div; __gmpz_init_set_si(__gen_e_acsl__6,1L); __gmpz_init(__gen_e_acsl_sub_2); - __gmpz_sub(__gen_e_acsl_sub_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3), + __gmpz_sub(__gen_e_acsl_sub_2,(__e_acsl_mpz_struct const *)(n), (__e_acsl_mpz_struct const *)(__gen_e_acsl__6)); - __gmpz_init(__gen_e_acsl_f1_tapp_3); /*@ assert Eva: initialization: \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_2); */ + __gen_e_acsl_f2_2(& __gen_e_acsl_f2_4, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub_2); + __gmpz_init_set_si(__gen_e_acsl__7,2L); + __gmpz_init(__gen_e_acsl_sub_3); + __gmpz_sub(__gen_e_acsl_sub_3,(__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__7)); /*@ assert Eva: initialization: - \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3); + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_3); */ - __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub_2); - __gmpz_init(__gen_e_acsl_add); - __gmpz_add(__gen_e_acsl_add, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3)); + __gen_e_acsl_f2_2(& __gen_e_acsl_f2_6, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub_3); + __gmpz_init(__gen_e_acsl_mul); + __gmpz_mul(__gen_e_acsl_mul, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_4), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_6)); + __gmpz_init_set_si(__gen_e_acsl__8,3L); + __gmpz_init(__gen_e_acsl_sub_4); + __gmpz_sub(__gen_e_acsl_sub_4,(__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__8)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_4); + */ + __gen_e_acsl_f2_2(& __gen_e_acsl_f2_8, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub_4); + __gmpz_init_set_si(__gen_e_acsl__9,0L); + __gen_e_acsl_div_guard = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__9)); + __gmpz_init(__gen_e_acsl_div); + /*@ assert E_ACSL: f2(n - 3) ≢ 0; */ + __e_acsl_assert(! (__gen_e_acsl_div_guard == 0),(char *)"Assertion", + (char *)"f2_2",(char *)"f2(n - 3) == 0",9); + __gmpz_tdiv_q(__gen_e_acsl_div, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8)); __gmpz_init_set(__gen_e_acsl_if, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add)); + (__e_acsl_mpz_struct const *)(__gen_e_acsl_div)); __gmpz_clear(__gen_e_acsl__6); __gmpz_clear(__gen_e_acsl_sub_2); - __gmpz_clear(__gen_e_acsl_f1_tapp_3); - __gmpz_clear(__gen_e_acsl_add); + __gmpz_clear(__gen_e_acsl_f2_4); + __gmpz_clear(__gen_e_acsl__7); + __gmpz_clear(__gen_e_acsl_sub_3); + __gmpz_clear(__gen_e_acsl_f2_6); + __gmpz_clear(__gen_e_acsl_mul); + __gmpz_clear(__gen_e_acsl__8); + __gmpz_clear(__gen_e_acsl_sub_4); + __gmpz_clear(__gen_e_acsl_f2_8); + __gmpz_clear(__gen_e_acsl__9); + __gmpz_clear(__gen_e_acsl_div); } - __gmpz_init_set(__retres_arg, + __gmpz_init_set(*__retres_arg, (__e_acsl_mpz_struct const *)(__gen_e_acsl_if)); - __gmpz_clear(__gen_e_acsl_n_3); __gmpz_clear(__gen_e_acsl__4); __gmpz_clear(__gen_e_acsl_if); return; } -void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, - int __gen_e_acsl_n_arg) +void __gen_e_acsl_f2(__e_acsl_mpz_t *__retres_arg, int n) { __e_acsl_mpz_t __gen_e_acsl_n; __e_acsl_mpz_t __gen_e_acsl_; - int __gen_e_acsl_le; + int __gen_e_acsl_lt; __e_acsl_mpz_t __gen_e_acsl_if_2; - __gmpz_init_set_si(__gen_e_acsl_n,(long)__gen_e_acsl_n_arg); + __gmpz_init_set_si(__gen_e_acsl_n,(long)n); __gmpz_init_set_si(__gen_e_acsl_,0L); - __gen_e_acsl_le = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n), + __gen_e_acsl_lt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n), (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); - if (__gen_e_acsl_le <= 0) { + if (__gen_e_acsl_lt < 0) { __e_acsl_mpz_t __gen_e_acsl__2; - __gmpz_init_set_si(__gen_e_acsl__2,0L); + __gmpz_init_set_si(__gen_e_acsl__2,1L); __gmpz_init_set(__gen_e_acsl_if_2, (__e_acsl_mpz_struct const *)(__gen_e_acsl__2)); __gmpz_clear(__gen_e_acsl__2); @@ -740,38 +204,82 @@ void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, __e_acsl_mpz_t __gen_e_acsl_n_2; __e_acsl_mpz_t __gen_e_acsl__3; __e_acsl_mpz_t __gen_e_acsl_sub; - __e_acsl_mpz_t __gen_e_acsl_f1_tapp_2; - __e_acsl_mpz_t __gen_e_acsl_add_2; - __gmpz_init_set_si(__gen_e_acsl_n_2,(long)__gen_e_acsl_n_arg); + __e_acsl_mpz_t __gen_e_acsl_f2_9; + __e_acsl_mpz_t __gen_e_acsl__10; + __e_acsl_mpz_t __gen_e_acsl_sub_5; + __e_acsl_mpz_t __gen_e_acsl_f2_11; + __e_acsl_mpz_t __gen_e_acsl_mul_2; + __e_acsl_mpz_t __gen_e_acsl__11; + __e_acsl_mpz_t __gen_e_acsl_sub_6; + __e_acsl_mpz_t __gen_e_acsl_f2_13; + __e_acsl_mpz_t __gen_e_acsl__12; + int __gen_e_acsl_div_guard_2; + __e_acsl_mpz_t __gen_e_acsl_div_2; + __gmpz_init_set_si(__gen_e_acsl_n_2,(long)n); __gmpz_init_set_si(__gen_e_acsl__3,1L); __gmpz_init(__gen_e_acsl_sub); __gmpz_sub(__gen_e_acsl_sub, (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2), (__e_acsl_mpz_struct const *)(__gen_e_acsl__3)); - __gmpz_init(__gen_e_acsl_f1_tapp_2); /*@ assert Eva: initialization: \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub); */ + __gen_e_acsl_f2_2(& __gen_e_acsl_f2_9, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub); + __gmpz_init_set_si(__gen_e_acsl__10,2L); + __gmpz_init(__gen_e_acsl_sub_5); + __gmpz_sub(__gen_e_acsl_sub_5, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__10)); /*@ assert Eva: initialization: - \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2); + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_5); */ - __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2, - (__e_acsl_mpz_struct *)__gen_e_acsl_sub); - __gmpz_init(__gen_e_acsl_add_2); - __gmpz_add(__gen_e_acsl_add_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_2), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2)); + __gen_e_acsl_f2_2(& __gen_e_acsl_f2_11, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub_5); + __gmpz_init(__gen_e_acsl_mul_2); + __gmpz_mul(__gen_e_acsl_mul_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_9), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_11)); + __gmpz_init_set_si(__gen_e_acsl__11,3L); + __gmpz_init(__gen_e_acsl_sub_6); + __gmpz_sub(__gen_e_acsl_sub_6, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__11)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_6); + */ + __gen_e_acsl_f2_2(& __gen_e_acsl_f2_13, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub_6); + __gmpz_init_set_si(__gen_e_acsl__12,0L); + __gen_e_acsl_div_guard_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_13), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__12)); + __gmpz_init(__gen_e_acsl_div_2); + /*@ assert E_ACSL: f2(n - 3) ≢ 0; */ + __e_acsl_assert(! (__gen_e_acsl_div_guard_2 == 0),(char *)"Assertion", + (char *)"f2",(char *)"f2(n - 3) == 0",9); + __gmpz_tdiv_q(__gen_e_acsl_div_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_2), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_13)); __gmpz_init_set(__gen_e_acsl_if_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2)); + (__e_acsl_mpz_struct const *)(__gen_e_acsl_div_2)); __gmpz_clear(__gen_e_acsl_n_2); __gmpz_clear(__gen_e_acsl__3); __gmpz_clear(__gen_e_acsl_sub); - __gmpz_clear(__gen_e_acsl_f1_tapp_2); - __gmpz_clear(__gen_e_acsl_add_2); + __gmpz_clear(__gen_e_acsl_f2_9); + __gmpz_clear(__gen_e_acsl__10); + __gmpz_clear(__gen_e_acsl_sub_5); + __gmpz_clear(__gen_e_acsl_f2_11); + __gmpz_clear(__gen_e_acsl_mul_2); + __gmpz_clear(__gen_e_acsl__11); + __gmpz_clear(__gen_e_acsl_sub_6); + __gmpz_clear(__gen_e_acsl_f2_13); + __gmpz_clear(__gen_e_acsl__12); + __gmpz_clear(__gen_e_acsl_div_2); } - __gmpz_init_set(__retres_arg, + __gmpz_init_set(*__retres_arg, (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_2)); __gmpz_clear(__gen_e_acsl_n); __gmpz_clear(__gen_e_acsl_); @@ -779,4 +287,307 @@ void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg, return; } +void __gen_e_acsl_g_5(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n) +{ + __gmpz_init_set_si(*__retres_arg,0L); + return; +} + +void __gen_e_acsl_g(__e_acsl_mpz_t *__retres_arg, int n) +{ + __gmpz_init_set_si(*__retres_arg,0L); + return; +} + +void __gen_e_acsl_f3_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n) +{ + __e_acsl_mpz_t __gen_e_acsl__16; + int __gen_e_acsl_gt_2; + __e_acsl_mpz_t __gen_e_acsl_if_3; + __gmpz_init_set_si(__gen_e_acsl__16,0L); + __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__16)); + if (__gen_e_acsl_gt_2 > 0) { + long __gen_e_acsl__17; + __e_acsl_mpz_t __gen_e_acsl_g_4; + __e_acsl_mpz_t __gen_e_acsl__18; + __e_acsl_mpz_t __gen_e_acsl_sub_8; + __e_acsl_mpz_t __gen_e_acsl_f3_4; + __e_acsl_mpz_t __gen_e_acsl_mul_3; + __e_acsl_mpz_t __gen_e_acsl__19; + __e_acsl_mpz_t __gen_e_acsl_sub_9; + __gen_e_acsl__17 = __gmpz_get_si((__e_acsl_mpz_struct const *)(n)); + __gen_e_acsl_g(& __gen_e_acsl_g_4,(int)__gen_e_acsl__17); + __gmpz_init_set_si(__gen_e_acsl__18,1L); + __gmpz_init(__gen_e_acsl_sub_8); + __gmpz_sub(__gen_e_acsl_sub_8,(__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__18)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_8); + */ + __gen_e_acsl_f3_2(& __gen_e_acsl_f3_4, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub_8); + __gmpz_init(__gen_e_acsl_mul_3); + __gmpz_mul(__gen_e_acsl_mul_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_4), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_4)); + __gmpz_init_set_si(__gen_e_acsl__19,5L); + __gmpz_init(__gen_e_acsl_sub_9); + __gmpz_sub(__gen_e_acsl_sub_9, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_3), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__19)); + __gmpz_init_set(__gen_e_acsl_if_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_9)); + __gmpz_clear(__gen_e_acsl_g_4); + __gmpz_clear(__gen_e_acsl__18); + __gmpz_clear(__gen_e_acsl_sub_8); + __gmpz_clear(__gen_e_acsl_f3_4); + __gmpz_clear(__gen_e_acsl_mul_3); + __gmpz_clear(__gen_e_acsl__19); + __gmpz_clear(__gen_e_acsl_sub_9); + } + else { + __e_acsl_mpz_t __gen_e_acsl__20; + __e_acsl_mpz_t __gen_e_acsl_add; + __e_acsl_mpz_t __gen_e_acsl_g_6; + __gmpz_init_set_si(__gen_e_acsl__20,1L); + __gmpz_init(__gen_e_acsl_add); + __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__20)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add); + */ + __gen_e_acsl_g_5(& __gen_e_acsl_g_6, + (__e_acsl_mpz_struct *)__gen_e_acsl_add); + __gmpz_init_set(__gen_e_acsl_if_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_6)); + __gmpz_clear(__gen_e_acsl__20); + __gmpz_clear(__gen_e_acsl_add); + __gmpz_clear(__gen_e_acsl_g_6); + } + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_3)); + __gmpz_clear(__gen_e_acsl__16); + __gmpz_clear(__gen_e_acsl_if_3); + return; +} + +void __gen_e_acsl_f3(__e_acsl_mpz_t *__retres_arg, int n) +{ + __e_acsl_mpz_t __gen_e_acsl_n_3; + __e_acsl_mpz_t __gen_e_acsl__14; + int __gen_e_acsl_gt; + __e_acsl_mpz_t __gen_e_acsl_if_4; + __gmpz_init_set_si(__gen_e_acsl_n_3,(long)n); + __gmpz_init_set_si(__gen_e_acsl__14,0L); + __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__14)); + if (__gen_e_acsl_gt > 0) { + __e_acsl_mpz_t __gen_e_acsl_g_2; + __e_acsl_mpz_t __gen_e_acsl_n_4; + __e_acsl_mpz_t __gen_e_acsl__15; + __e_acsl_mpz_t __gen_e_acsl_sub_7; + __e_acsl_mpz_t __gen_e_acsl_f3_5; + __e_acsl_mpz_t __gen_e_acsl_mul_4; + __e_acsl_mpz_t __gen_e_acsl__21; + __e_acsl_mpz_t __gen_e_acsl_sub_10; + __gen_e_acsl_g(& __gen_e_acsl_g_2,n); + __gmpz_init_set_si(__gen_e_acsl_n_4,(long)n); + __gmpz_init_set_si(__gen_e_acsl__15,1L); + __gmpz_init(__gen_e_acsl_sub_7); + __gmpz_sub(__gen_e_acsl_sub_7, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__15)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_7); + */ + __gen_e_acsl_f3_2(& __gen_e_acsl_f3_5, + (__e_acsl_mpz_struct *)__gen_e_acsl_sub_7); + __gmpz_init(__gen_e_acsl_mul_4); + __gmpz_mul(__gen_e_acsl_mul_4, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_2), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_5)); + __gmpz_init_set_si(__gen_e_acsl__21,5L); + __gmpz_init(__gen_e_acsl_sub_10); + __gmpz_sub(__gen_e_acsl_sub_10, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_4), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__21)); + __gmpz_init_set(__gen_e_acsl_if_4, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_10)); + __gmpz_clear(__gen_e_acsl_g_2); + __gmpz_clear(__gen_e_acsl_n_4); + __gmpz_clear(__gen_e_acsl__15); + __gmpz_clear(__gen_e_acsl_sub_7); + __gmpz_clear(__gen_e_acsl_f3_5); + __gmpz_clear(__gen_e_acsl_mul_4); + __gmpz_clear(__gen_e_acsl__21); + __gmpz_clear(__gen_e_acsl_sub_10); + } + else { + __e_acsl_mpz_t __gen_e_acsl_n_5; + __e_acsl_mpz_t __gen_e_acsl__22; + __e_acsl_mpz_t __gen_e_acsl_add_2; + __e_acsl_mpz_t __gen_e_acsl_g_8; + __gmpz_init_set_si(__gen_e_acsl_n_5,(long)n); + __gmpz_init_set_si(__gen_e_acsl__22,1L); + __gmpz_init(__gen_e_acsl_add_2); + __gmpz_add(__gen_e_acsl_add_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__22)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_2); + */ + __gen_e_acsl_g_5(& __gen_e_acsl_g_8, + (__e_acsl_mpz_struct *)__gen_e_acsl_add_2); + __gmpz_init_set(__gen_e_acsl_if_4, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_8)); + __gmpz_clear(__gen_e_acsl_n_5); + __gmpz_clear(__gen_e_acsl__22); + __gmpz_clear(__gen_e_acsl_add_2); + __gmpz_clear(__gen_e_acsl_g_8); + } + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_4)); + __gmpz_clear(__gen_e_acsl_n_3); + __gmpz_clear(__gen_e_acsl__14); + __gmpz_clear(__gen_e_acsl_if_4); + return; +} + +void __gen_e_acsl_f4_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n) +{ + __e_acsl_mpz_t __gen_e_acsl__26; + int __gen_e_acsl_lt_4; + __e_acsl_mpz_t __gen_e_acsl_if_6; + __gmpz_init_set_si(__gen_e_acsl__26,100L); + __gen_e_acsl_lt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__26)); + if (__gen_e_acsl_lt_4 < 0) { + __e_acsl_mpz_t __gen_e_acsl__27; + __e_acsl_mpz_t __gen_e_acsl_add_4; + __e_acsl_mpz_t __gen_e_acsl_f4_4; + __gmpz_init_set_si(__gen_e_acsl__27,1L); + __gmpz_init(__gen_e_acsl_add_4); + __gmpz_add(__gen_e_acsl_add_4,(__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__27)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_4); + */ + __gen_e_acsl_f4_2(& __gen_e_acsl_f4_4, + (__e_acsl_mpz_struct *)__gen_e_acsl_add_4); + __gmpz_init_set(__gen_e_acsl_if_6, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_4)); + __gmpz_clear(__gen_e_acsl__27); + __gmpz_clear(__gen_e_acsl_add_4); + __gmpz_clear(__gen_e_acsl_f4_4); + } + else { + __e_acsl_mpz_t __gen_e_acsl__28; + int __gen_e_acsl_lt_5; + __e_acsl_mpz_t __gen_e_acsl_if_5; + __gmpz_init_set_ui(__gen_e_acsl__28,9223372036854775807UL); + __gen_e_acsl_lt_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__28)); + if (__gen_e_acsl_lt_5 < 0) { + __e_acsl_mpz_t __gen_e_acsl__29; + __gmpz_init_set_ui(__gen_e_acsl__29,9223372036854775807UL); + __gmpz_init_set(__gen_e_acsl_if_5, + (__e_acsl_mpz_struct const *)(__gen_e_acsl__29)); + __gmpz_clear(__gen_e_acsl__29); + } + else { + __e_acsl_mpz_t __gen_e_acsl__30; + __gmpz_init_set_si(__gen_e_acsl__30,6L); + __gmpz_init_set(__gen_e_acsl_if_5, + (__e_acsl_mpz_struct const *)(__gen_e_acsl__30)); + __gmpz_clear(__gen_e_acsl__30); + } + __gmpz_init_set(__gen_e_acsl_if_6, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_5)); + __gmpz_clear(__gen_e_acsl__28); + __gmpz_clear(__gen_e_acsl_if_5); + } + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_6)); + __gmpz_clear(__gen_e_acsl__26); + __gmpz_clear(__gen_e_acsl_if_6); + return; +} + +void __gen_e_acsl_f4(__e_acsl_mpz_t *__retres_arg, int n) +{ + __e_acsl_mpz_t __gen_e_acsl_n_6; + __e_acsl_mpz_t __gen_e_acsl__24; + int __gen_e_acsl_lt_3; + __e_acsl_mpz_t __gen_e_acsl_if_8; + __gmpz_init_set_si(__gen_e_acsl_n_6,(long)n); + __gmpz_init_set_si(__gen_e_acsl__24,100L); + __gen_e_acsl_lt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__24)); + if (__gen_e_acsl_lt_3 < 0) { + __e_acsl_mpz_t __gen_e_acsl_n_7; + __e_acsl_mpz_t __gen_e_acsl__25; + __e_acsl_mpz_t __gen_e_acsl_add_3; + __e_acsl_mpz_t __gen_e_acsl_f4_5; + __gmpz_init_set_si(__gen_e_acsl_n_7,(long)n); + __gmpz_init_set_si(__gen_e_acsl__25,1L); + __gmpz_init(__gen_e_acsl_add_3); + __gmpz_add(__gen_e_acsl_add_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__25)); + /*@ assert + Eva: initialization: + \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_3); + */ + __gen_e_acsl_f4_2(& __gen_e_acsl_f4_5, + (__e_acsl_mpz_struct *)__gen_e_acsl_add_3); + __gmpz_init_set(__gen_e_acsl_if_8, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_5)); + __gmpz_clear(__gen_e_acsl_n_7); + __gmpz_clear(__gen_e_acsl__25); + __gmpz_clear(__gen_e_acsl_add_3); + __gmpz_clear(__gen_e_acsl_f4_5); + } + else { + __e_acsl_mpz_t __gen_e_acsl_n_8; + __e_acsl_mpz_t __gen_e_acsl__31; + int __gen_e_acsl_lt_6; + __e_acsl_mpz_t __gen_e_acsl_if_7; + __gmpz_init_set_si(__gen_e_acsl_n_8,(long)n); + __gmpz_init_set_ui(__gen_e_acsl__31,9223372036854775807UL); + __gen_e_acsl_lt_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_8), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__31)); + if (__gen_e_acsl_lt_6 < 0) { + __e_acsl_mpz_t __gen_e_acsl__32; + __gmpz_init_set_ui(__gen_e_acsl__32,9223372036854775807UL); + __gmpz_init_set(__gen_e_acsl_if_7, + (__e_acsl_mpz_struct const *)(__gen_e_acsl__32)); + __gmpz_clear(__gen_e_acsl__32); + } + else { + __e_acsl_mpz_t __gen_e_acsl__33; + __gmpz_init_set_si(__gen_e_acsl__33,6L); + __gmpz_init_set(__gen_e_acsl_if_7, + (__e_acsl_mpz_struct const *)(__gen_e_acsl__33)); + __gmpz_clear(__gen_e_acsl__33); + } + __gmpz_init_set(__gen_e_acsl_if_8, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_7)); + __gmpz_clear(__gen_e_acsl_n_8); + __gmpz_clear(__gen_e_acsl__31); + __gmpz_clear(__gen_e_acsl_if_7); + } + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_8)); + __gmpz_clear(__gen_e_acsl_n_6); + __gmpz_clear(__gen_e_acsl__24); + __gmpz_clear(__gen_e_acsl_if_8); + return; +} + diff --git a/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle b/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle index 90bbf0ce762..da6d987808f 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle +++ b/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle @@ -2,7 +2,7 @@ [e-acsl] Warning: annotating undefined function `getenv': the generated program may miss memory instrumentation if there are memory-related annotations. -[e-acsl] FRAMAC_SHARE/libc/stdlib.h:419: Warning: +[e-acsl] FRAMAC_SHARE/libc/stdlib.h:482: Warning: E-ACSL construct `logic functions with labels' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/stdlib.h:482: Warning: diff --git a/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle b/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle index 52253f07981..66c2b5ac9dd 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle +++ b/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle @@ -14,8 +14,7 @@ E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/string.h:118: Warning: - E-ACSL construct `logic functions performing read accesses' - is not yet supported. + E-ACSL construct `user-defined logic type' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/string.h:92: Warning: E-ACSL construct `logic functions with labels' is not yet supported. diff --git a/src/plugins/e-acsl/translate.ml b/src/plugins/e-acsl/translate.ml index 8b3f53139d2..11a872659cb 100644 --- a/src/plugins/e-acsl/translate.ml +++ b/src/plugins/e-acsl/translate.ml @@ -450,40 +450,54 @@ and context_insensitive_term_to_exp kf env t = Cil.mkAddrOrStartOf ~loc lv, env, false, "startof" | Tapp(li, [], targs) -> let fname = li.l_var_info.lv_name in - let args, env = - try - List.fold_right - (fun targ (l, env) -> - let e, env = term_to_exp kf env targ in - e :: l, env) - targs - ([], env) - with Invalid_argument _ -> - Options.fatal "[Tapp] unexpected number of arguments when calling %s" - fname - in (* build the varinfo (as an expression) which stores the result of the function call. *) let _, e, env = if Builtins.mem li.l_var_info.lv_name then (* E-ACSL built-in function call *) + let args, env = + try + List.fold_right + (fun targ (l, env) -> + let e, env = term_to_exp kf env targ in + e :: l, env) + targs + ([], env) + with Invalid_argument _ -> + Options.fatal + "[Tapp] unexpected number of arguments when calling %s" + fname + in Env.new_var ~loc ~name:(fname ^ "_app") env (Some t) (Misc.cty (Extlib.the li.l_type)) - (fun vi _ -> [ Misc.mk_call ~loc ~result:(Cil.var vi) fname args ]) + (fun vi _ -> + [ Misc.mk_call ~loc ~result:(Cil.var vi) fname args ]) else - let args_lty = - List.map - (fun targ -> - match Typing.get_integer_ty targ with - | Typing.Gmp -> Linteger - | Typing.C_type _ | Typing.Other -> Ctype (Typing.get_typ targ)) + (* build the arguments and compute the integer_ty of the parameters *) + let params_ty, args, env = + List.fold_right + (fun targ (params_ty, args, env) -> + let e, env = term_to_exp kf env targ in + let param_ty = Typing.get_integer_ty targ in + let e, env = + try + let ty = Typing.typ_of_integer_ty param_ty in + add_cast loc env (Some ty) false (Some targ) e + with Typing.Not_an_integer -> + e, env + in + param_ty :: params_ty, e :: args, env) targs + ([], [], env) in - Logic_functions.generate ~loc env t li args args_lty + let gen_fname = + Env.Varname.get ~scope:Env.Global (Functions.RTL.mk_gen_name fname) + in + Logic_functions.tapp_to_exp ~loc gen_fname env t li params_ty args in e, env, false, "app" | Tapp(_, _ :: _, _) -> @@ -662,9 +676,7 @@ and named_predicate_content_to_exp ?name kf env p = (* Simply use the implementation of Tapp(li, labels, args). To achieve this, we create a clone of [li] for which the type is transformed from [None] (type of predicates) to - [Some int] (type as a term). - TODO: the approach seems dangerous. A better way would probably use a - version of [Lfunctions.generate] generalized to predicates. *) + [Some int] (type as a term). *) let prj = Project.current () in let o = object inherit Visitor.frama_c_copy prj end in let li = Visitor.visitFramacLogicInfo o li in @@ -862,9 +874,6 @@ and translate_named_predicate kf env p = let named_predicate_to_exp ?name kf env p = named_predicate_to_exp ?name kf env p (* forget optional argument ?rte *) -let add_cast_lfunctions loc env cty is_mpz e = - add_cast ~loc env cty is_mpz None e - let () = Loops.term_to_exp_ref := term_to_exp; Loops.translate_named_predicate_ref := translate_named_predicate; @@ -875,8 +884,7 @@ let () = Mmodel_translate.term_to_exp_ref := term_to_exp; Mmodel_translate.predicate_to_exp_ref := named_predicate_to_exp; Logic_functions.term_to_exp_ref := term_to_exp; - Logic_functions.predicate_to_exp_ref := named_predicate_to_exp; - Logic_functions.add_cast_ref := add_cast_lfunctions + Logic_functions.named_predicate_to_exp_ref := named_predicate_to_exp (* This function is used by Guillaume. However, it is correct to use it only in specific contexts. *) diff --git a/src/plugins/e-acsl/typing.ml b/src/plugins/e-acsl/typing.ml index c88dafb9106..5c0d16ac021 100644 --- a/src/plugins/e-acsl/typing.ml +++ b/src/plugins/e-acsl/typing.ml @@ -46,28 +46,34 @@ let c_int = C_type IInt let ikind ik = C_type ik let other = Other -include Datatype.Make -(struct - type t = integer_ty - let name = "E_ACSL.New_typing.t" - let reprs = [ Gmp; c_int ] - include Datatype.Undefined - - let compare ty1 ty2 = match ty1, ty2 with - | C_type i1, C_type i2 -> - if i1 = i2 then 0 - else if Cil.intTypeIncluded i1 i2 then -1 else 1 - | (Other | C_type _), Gmp | Other, C_type _ -> -1 - | Gmp, (C_type _ | Other) | C_type _, Other -> 1 - | Gmp, Gmp | Other, Other -> 0 - - let equal = Datatype.from_compare - - let pretty fmt = function - | Gmp -> Format.pp_print_string fmt "GMP" - | C_type k -> Printer.pp_ikind fmt k - | Other -> Format.pp_print_string fmt "OTHER" - end) +module D = + Datatype.Make_with_collections + (struct + type t = integer_ty + let name = "E_ACSL.New_typing.t" + let reprs = [ Gmp; c_int ] + include Datatype.Undefined + + let compare ty1 ty2 = match ty1, ty2 with + | C_type i1, C_type i2 -> + if i1 = i2 then 0 + else if Cil.intTypeIncluded i1 i2 then -1 else 1 + | (Other | C_type _), Gmp | Other, C_type _ -> -1 + | Gmp, (C_type _ | Other) | C_type _, Other -> 1 + | Gmp, Gmp | Other, Other -> 0 + + let equal = Datatype.from_compare + + let hash = function + | Gmp -> 787 + | Other -> 1011 + | C_type ik -> Hashtbl.hash ik + + let pretty fmt = function + | Gmp -> Format.pp_print_string fmt "GMP" + | C_type k -> Printer.pp_ikind fmt k + | Other -> Format.pp_print_string fmt "OTHER" + end) (******************************************************************************) (** Basic operations *) @@ -105,9 +111,9 @@ let typ_of_lty = function (******************************************************************************) type computed_info = - { ty: t; (* type required for the term *) - op: t; (* type required for the operation *) - cast: t option; (* if not [None], type of the context which the term + { ty: D.t; (* type required for the term *) + op: D.t; (* type required for the operation *) + cast: D.t option; (* if not [None], type of the context which the term must be casted to. If [None], no cast needed. *) } @@ -116,7 +122,6 @@ type computed_info = module Memo: sig val memo: (term -> computed_info) -> term -> computed_info val get: term -> computed_info - val remove_all: term -> unit val clear: unit -> unit end = struct @@ -155,30 +160,10 @@ end = struct H.add tbl t x; x - let rec remove_all t = - try - ignore (H.find tbl t); - H.remove tbl t; - remove_all t - with Not_found -> - () - let clear () = H.clear tbl end -let clear_all_pred_or_term pot = - let o = object inherit Visitor.frama_c_inplace - method !vterm t = - Memo.remove_all t; - Cil.DoChildren - end - in - begin match pot with - | Misc.PoT_term t -> ignore(Visitor.visitFramacTerm o t) - | Misc.PoT_pred p -> ignore(Visitor.visitFramacPredicate o p) - end - (******************************************************************************) (** {2 Coercion rules} *) (******************************************************************************) @@ -211,11 +196,11 @@ let ty_of_interv ?ctx i = (* compute a new {!computed_info} by coercing the given type [ty] to the given context [ctx]. [op] is the type for the operator. *) let coerce ~arith_operand ~ctx ~op ty = - if compare ty ctx = 1 then begin + if D.compare ty ctx = 1 then (* type larger than the expected context, so we must introduce an explicit cast *) { ty; op; cast = Some ctx } - end else + else (* only add an explicit cast if the context is [Gmp] and [ty] is not; or if the term corresponding to [ty] is an operand of an arithmetic operation which must be explicitly coerced in order to force the @@ -369,7 +354,7 @@ let rec type_term ~use_gmp_opt ?(arith_operand=false) ?ctx t = dup ctx_res | TBinOp ((Lt | Gt | Le | Ge | Eq | Ne), t1, t2) -> - assert (match ctx with None -> true | Some c -> compare c c_int >= 0); + assert (match ctx with None -> true | Some c -> D.compare c c_int >= 0); let ctx = try let i1 = Interval.infer t1 in @@ -491,9 +476,10 @@ let rec type_term ~use_gmp_opt ?(arith_operand=false) ?ctx t = type of the argument? For now, it is silently ignored (both statically and at runtime)... *) List.iter (fun arg -> ignore (type_term ~use_gmp_opt:true arg)) args; + (* TODO: recursive call in arguments of function call *) match li.l_body with | LBpred _ -> - (* We can have an [LBpred] here because we transformed + (* possible to have an [LBpred] here because we transformed [Papp] into [Tapp] *) dup c_int | LBterm _ -> @@ -701,7 +687,7 @@ let rec type_predicate p = let type_term ~use_gmp_opt ?ctx t = Options.feedback ~dkey ~level:4 "typing term '%a' in ctx '%a'." - Printer.pp_term t (Pretty_utils.pp_opt pretty) ctx; + Printer.pp_term t (Pretty_utils.pp_opt D.pretty) ctx; ignore (type_term ~use_gmp_opt ?ctx t) let type_named_predicate ?(must_clear=true) p = @@ -758,6 +744,8 @@ let get_cast_of_predicate p = let clear = Memo.clear +module Datatype = D + (* Local Variables: compile-command: "make" diff --git a/src/plugins/e-acsl/typing.mli b/src/plugins/e-acsl/typing.mli index 7f26c6e68d7..a6387e848d2 100644 --- a/src/plugins/e-acsl/typing.mli +++ b/src/plugins/e-acsl/typing.mli @@ -56,7 +56,7 @@ type integer_ty = private | C_type of ikind | Other (** Any non-integral type *) -val pretty: Format.formatter -> integer_ty -> unit +module Datatype: Datatype.S_with_collections with type t = integer_ty (** {3 Smart constructors} *) @@ -91,8 +91,8 @@ val join: integer_ty -> integer_ty -> integer_ty val type_term: use_gmp_opt:bool -> ?ctx:integer_ty -> term -> unit (** Compute the type of each subterm of the given term in the given context. If - [use_gmp_opt] is false, then the conversion to the given context is done even if - -e-acsl-gmp-only is set. *) + [use_gmp_opt] is false, then the conversion to the given context is done + even if -e-acsl-gmp-only is set. *) val type_named_predicate: ?must_clear:bool -> predicate -> unit (** Compute the type of each term of the given predicate. @@ -101,10 +101,6 @@ val type_named_predicate: ?must_clear:bool -> predicate -> unit val clear: unit -> unit (** Remove all the previously computed types. *) -val clear_all_pred_or_term: Misc.pred_or_term -> unit -(** Remove all the previously computed types for the given term or predicate - AND its subterms. *) - (** {3 Getters} Below, the functions assume that either {!type_term} or diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml index 866070e5737..077f9360eb9 100644 --- a/src/plugins/e-acsl/visit.ml +++ b/src/plugins/e-acsl/visit.ml @@ -369,8 +369,6 @@ class e_acsl_visitor prj generate = object (self) if generate then Project.copy ~selection ~src:cur prj; Cil.DoChildrenPost (fun f -> - (* generate the C functions that correspond to the logic ones *) - Logic_functions.do_visit f; (* extend [main] with forward initialization and put it at end *) if generate then begin if not (Global_observer.is_empty () && Literal_strings.is_empty ()) @@ -455,7 +453,12 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" in Extlib.may handle_main main_fct in - Project.on prj build_mmodel_initializer (); + Project.on + prj + (fun () -> + f.globals <- Logic_functions.add_generated_functions f.globals; + build_mmodel_initializer ()) + (); (* reset copied states at the end to be observationally equivalent to a standard visitor. *) Project.clear ~selection ~project:prj (); @@ -564,9 +567,10 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" let locals, blocks = List.fold_left (fun (local_vars, block_vars as acc) (v, scope) -> match scope with - | Env.Global -> acc - | Env.Function -> v :: local_vars, v :: block_vars - | Env.Local_block -> v :: local_vars, block_vars) + (* TODO: [kf] assumed to be consistent. Should be asserted. *) + | Env.LFunction _kf -> v :: local_vars, v :: block_vars + | Env.LLocal_block _kf -> v :: local_vars, block_vars + | _ -> acc) (f.slocals, f.sbody.blocals) vars in -- GitLab