diff --git a/src/plugins/aorai/aorai_utils.ml b/src/plugins/aorai/aorai_utils.ml index c192b4c348ec4da230f4942f290f2a3d8f78f25c..1a270032c6bd862f3f7e72a62e0f2f4573925039 100644 --- a/src/plugins/aorai/aorai_utils.ml +++ b/src/plugins/aorai/aorai_utils.ml @@ -835,12 +835,14 @@ let is_state_pred state = (Req,one_term(), Logic_const.tvar (Data_for_aorai.get_state_logic_var state)) -let is_state_stmt (state,copy) loc = - if Aorai_option.Deterministic.get () - then - mkStmtOneInstr - ~ghost:true (Set (Cil.var copy, int2enumstate_exp loc state.nums, loc)) - else mkStmtOneInstr ~ghost:true (Set (Cil.var copy, Cil.one loc, loc)) +let is_state_non_det_stmt (_,copy) loc = + mkStmtOneInstr ~ghost:true (Set (Cil.var copy, Cil.one loc, loc)) + +let is_state_det_stmt state loc = + let var = Data_for_aorai.get_varinfo curState in + mkStmtOneInstr + ~ghost:true (Set (Cil.var var, int2enumstate_exp loc state.nums, loc)) + let is_state_exp state loc = if Aorai_option.Deterministic.get () @@ -1901,173 +1903,173 @@ let act_convert loc act res = in List.map treat_one_act act -let copy_stmt s = - let vis = new Visitor.frama_c_refresh (Project.current()) in - Visitor.visitFramacStmt vis s +let mk_transitions_stmt generated_kf loc f st res trans = + List.fold_right + (fun trans + (aux_stmts, aux_vars, new_funcs, exp_from_trans, stmt_from_action) -> + let (tr_stmts, tr_vars, tr_funcs, exp) = + crosscond_to_exp generated_kf f st loc trans.cross res + in + let cond = Cil.mkBinOp loc LAnd (is_state_exp trans.start loc) exp in + (tr_stmts @ aux_stmts, + tr_vars @ aux_vars, + Cil_datatype.Varinfo.Set.union tr_funcs new_funcs, + Cil.mkBinOp loc LOr exp_from_trans cond, + (Cil.copy_exp cond, act_convert loc trans.actions res) + :: stmt_from_action)) + trans + ([],[],Cil_datatype.Varinfo.Set.empty, Cil.zero ~loc, []) + +let mkIfStmt loc exp1 block1 block2 = + Cil.mkStmt ~ghost:true (If (exp1, block1, block2, loc)) + +let mk_deterministic_stmt + generated_kf loc auto f fst status ret state + (other_stmts, other_funcs, other_vars, trans_stmts as res) = + if is_reachable state status then begin + let trans = get_accessible_transitions auto state status in + let aux_stmts, aux_vars, aux_funcs, _, stmt_from_action = + mk_transitions_stmt generated_kf loc f fst ret trans + in + let stmts = + List.fold_left + (fun acc (cond, stmt_act) -> + [mkIfStmt loc cond + (mkBlock (is_state_det_stmt state loc :: stmt_act)) + (mkBlock acc)]) + trans_stmts + (List.rev stmt_from_action) + in + aux_stmts @ other_stmts, + Cil_datatype.Varinfo.Set.union aux_funcs other_funcs, + aux_vars @ other_vars, + stmts + end else res -(* mk_stmt loc (states, tr) f fst status state +(* mk_non_deterministic_stmt loc (states, tr) f fst status state Generates the statement updating the variable representing the state argument. If state is reachable, generates a "If then else" statement, else it is just an assignment. Used in auto_func_block. *) -let mk_stmt generated_kf loc (states, tr) f fst status ((st,_) as state) res = +let mk_non_deterministic_stmt + generated_kf loc (states, tr) f fst status ((st,_) as state) res = if is_reachable st status then begin let useful_trans = get_accessible_transitions (states,tr) st status in - let aux_stmts, new_vars, new_funcs, exp_from_trans,stmt_from_action = - List.fold_right - (fun trans - (aux_stmts, aux_vars, new_funcs, exp_from_trans, stmt_from_action) -> - let (tr_stmts, tr_vars, tr_funcs, exp) = - crosscond_to_exp generated_kf f fst loc trans.cross res - in - (tr_stmts @ aux_stmts, - tr_vars @ aux_vars, - Cil_datatype.Varinfo.Set.union tr_funcs new_funcs, - Cil.mkBinOp loc LAnd (is_state_exp trans.start loc) exp - ::exp_from_trans, - act_convert loc trans.actions res :: stmt_from_action)) - useful_trans - ([],[],Cil_datatype.Varinfo.Set.empty, [], []) - in - let mkIfStmt exp1 block1 block2 = - Cil.mkStmt ~ghost:true (If (exp1, block1, block2, loc)) - in - let if_cond = - List.fold_left - (fun acc exp -> Cil.mkBinOp loc LOr exp acc) - (List.hd exp_from_trans) - (List.tl exp_from_trans) - in - let then_stmt = is_state_stmt state loc in - let else_stmt = - if Aorai_option.Deterministic.get () then [] - else [is_out_of_state_stmt state loc] + let aux_stmts, new_vars, new_funcs, cond,stmt_from_action = + mk_transitions_stmt generated_kf loc f fst res useful_trans in + let then_stmt = is_state_non_det_stmt state loc in + let else_stmt = [is_out_of_state_stmt state loc] in let trans_stmts = - if Aorai_option.Deterministic.get () then - List.fold_left2 - (fun acc cond stmt_act -> - [mkIfStmt cond - (mkBlock (copy_stmt then_stmt :: stmt_act)) (mkBlock acc)]) - else_stmt - (List.rev exp_from_trans) + let actions = + List.fold_left + (fun acc (cond, stmt_act) -> + if stmt_act = [] then acc + else + (mkIfStmt loc cond (mkBlock stmt_act) (mkBlock []))::acc) + [] (List.rev stmt_from_action) - else - let actions = - List.fold_left2 - (fun acc cond stmt_act -> - if stmt_act = [] then acc - else - (mkIfStmt cond (mkBlock stmt_act) (mkBlock []))::acc) - [] - (List.rev exp_from_trans) - (List.rev stmt_from_action) - in - mkIfStmt if_cond (mkBlock [then_stmt]) (mkBlock else_stmt) :: actions + in + mkIfStmt loc cond (mkBlock [then_stmt]) (mkBlock else_stmt) :: actions in new_funcs, new_vars, aux_stmts @ trans_stmts end else - if Aorai_option.Deterministic.get () then - Cil_datatype.Varinfo.Set.empty, [], [] - else Cil_datatype.Varinfo.Set.empty, [], [is_out_of_state_stmt state loc] + Cil_datatype.Varinfo.Set.empty, [], [is_out_of_state_stmt state loc] -let auto_func_block generated_kf loc f st status res = - let dkey = func_body_dkey in - let call_or_ret = - match st with - | Promelaast.Call -> "call" - | Promelaast.Return -> "return" +let equalsStmt lval exp loc = (* assignment *) + Cil.mkStmtOneInstr ~ghost:true (Set (lval, exp, loc)) + +let mk_deterministic_body generated_kf loc f st status res = + let (states, _ as auto) = Data_for_aorai.getGraph() in + let aux_stmts, aux_funcs, aux_vars, trans_stmts = + List.fold_right + (mk_deterministic_stmt generated_kf loc auto f st status res) + states + ([], Cil_datatype.Varinfo.Set.empty, [],[]) in - Aorai_option.debug - ~dkey "func code for %a (%s)" Kernel_function.pretty f call_or_ret; - let (states, _) as auto = Data_for_aorai.getGraph() in + aux_funcs, aux_vars, aux_stmts @ trans_stmts +let mk_non_deterministic_body generated_kf loc f st status res = (* For the following tests, we need a copy of every state. *) - + let (states, _) as auto = Data_for_aorai.getGraph() in let copies, local_var = - if Aorai_option.Deterministic.get () then begin - let orig = Data_for_aorai.get_varinfo curState in - let copy = Cil.copyVarinfo orig (orig.vname ^ "_tmp") in - copy.vglob <- false; - List.map (fun st -> (st, copy)) states, [copy] - end else begin - let bindings = - List.map - (fun st -> - let state_var = Data_for_aorai.get_state_var st in - let copy = Cil.copyVarinfo state_var (state_var.vname ^ "_tmp") in - copy.vglob <- false; - (st,copy)) - states - in bindings, snd (List.split bindings) - end - in - let equalsStmt lval exp = (* assignment *) - Cil.mkStmtOneInstr ~ghost:true (Set (lval, exp, loc)) - in - let stmt_begin_list = - - [ - (* First statement : what is the current status : called or return ? *) - equalsStmt - (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOpStatus)) (* current status... *) - (Cil.new_exp loc (Const (Data_for_aorai.op_status_to_cenum st))); (* ... equals to what it is *) - - (* Second statement : what is the current operation, i.e. which function ? *) - equalsStmt - (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOp)) (* current operation ... *) - (Cil.new_exp loc (Const (Data_for_aorai.func_to_cenum (Kernel_function.get_name f)))) (* ...equals to what it is *) - ] - + let bindings = + List.map + (fun st -> + let state_var = Data_for_aorai.get_state_var st in + let copy = Cil.copyVarinfo state_var (state_var.vname ^ "_tmp") in + copy.vglob <- false; + (st,copy)) + states + in bindings, snd (List.split bindings) in - - (* As we work on copies, they need to be set to their actual values *) - let copies_update = - if Aorai_option.Deterministic.get () then - let orig = Data_for_aorai.get_varinfo curState in - [ equalsStmt (Cil.var (List.hd local_var)) (Cil.evar ~loc orig) ] - else - List.map - (fun (st,copy) -> - equalsStmt (Cil.var copy) - (Cil.evar ~loc (Data_for_aorai.get_state_var st))) - copies + List.map + (fun (st,copy) -> + equalsStmt (Cil.var copy) + (Cil.evar ~loc (Data_for_aorai.get_state_var st)) loc) + copies in - (* For each state, we have to generate the statement that will update its copy. *) let new_funcs, local_var, main_stmt = - List.fold_left (fun (new_funcs, aux_vars, stmts) state -> let my_funcs, my_vars, my_stmts = - mk_stmt generated_kf loc auto f st status state res + mk_non_deterministic_stmt generated_kf loc auto f st status state res in Cil_datatype.Varinfo.Set.union my_funcs new_funcs, my_vars @ aux_vars, my_stmts@stmts ) (Cil_datatype.Varinfo.Set.empty, local_var, []) copies - in (* Finally, we replace the state var values by the ones computed in copies. *) let stvar_update = - if Aorai_option.Deterministic.get () then - let orig = Data_for_aorai.get_varinfo curState in - [ equalsStmt (Cil.var orig) (Cil.evar (List.hd local_var))] + List.map + (fun (state,copy) -> + equalsStmt + (Cil.var (Data_for_aorai.get_state_var state)) + (Cil.evar ~loc copy) loc) + copies + in + new_funcs, local_var, copies_update @ main_stmt @ stvar_update + +let auto_func_block generated_kf loc f st status res = + let dkey = func_body_dkey in + let call_or_ret = + match st with + | Promelaast.Call -> "call" + | Promelaast.Return -> "return" + in + Aorai_option.debug + ~dkey "func code for %a (%s)" Kernel_function.pretty f call_or_ret; + + let stmt_begin_list = + [ + (* First statement : what is the current status : called or return ? *) + equalsStmt + (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOpStatus)) + (Cil.new_exp loc (Const (Data_for_aorai.op_status_to_cenum st))) loc; + (* Second statement : what is the current operation, + i.e. which function ? *) + equalsStmt + (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOp)) + (Cil.new_exp loc + (Const (Data_for_aorai.func_to_cenum (Kernel_function.get_name f)))) + loc + ] + in + let new_funcs, local_var, main_stmt = + if Aorai_option.Deterministic.get() then + mk_deterministic_body generated_kf loc f st status res else - List.map - (fun (state,copy) -> - equalsStmt - (Cil.var (Data_for_aorai.get_state_var state)) - (Cil.evar ~loc copy)) - copies + mk_non_deterministic_body generated_kf loc f st status res in let ret = [ Cil.mkStmt ~ghost:true (Cil_types.Return(None,loc)) ] in let res_block = (Cil.mkBlock - ( stmt_begin_list @ copies_update @ main_stmt @ stvar_update @ ret)) + ( stmt_begin_list @ main_stmt @ ret)) in res_block.blocals <- local_var; Aorai_option.debug ~dkey "Generated body is:@\n%a" diff --git a/src/plugins/aorai/aorai_utils.mli b/src/plugins/aorai/aorai_utils.mli index 0bc659364f45321b358bd845405c89e5d06020d8..efb8b12df79c276e22688cf01d55f06fe5e1e61a 100644 --- a/src/plugins/aorai/aorai_utils.mli +++ b/src/plugins/aorai/aorai_utils.mli @@ -71,9 +71,6 @@ val host_state_term: unit -> Cil_types.term_lval corresponding state. *) val is_state_pred: state -> predicate -(** Returns the statement saying the state is affected *) -val is_state_stmt: state * Cil_types.varinfo -> location -> Cil_types.stmt - (** Returns the boolean expression saying the state is affected *) val is_state_exp: state -> location -> Cil_types.exp diff --git a/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle b/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle index 7b3833fb8c530be00f93100df610e7986540081f..fd7526444df55abd2c128af76809b32c0a411955 100644 --- a/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle @@ -60,12 +60,9 @@ int X; @/ void f_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; - if (3 == aorai_CurStates) aorai_CurStates_tmp = S_in_f; - aorai_CurStates = aorai_CurStates_tmp; + if (3 == aorai_CurStates) aorai_CurStates = S_in_f; return; } @@ -99,12 +96,9 @@ int X; @/ void f_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; - if (2 == aorai_CurStates) aorai_CurStates_tmp = in_main; - aorai_CurStates = aorai_CurStates_tmp; + if (2 == aorai_CurStates) aorai_CurStates = in_main; return; } @@ -151,12 +145,9 @@ void f(void) @/ void main_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (0 == aorai_CurStates) aorai_CurStates_tmp = Sf; - aorai_CurStates = aorai_CurStates_tmp; + if (0 == aorai_CurStates) aorai_CurStates = Sf; return; } @@ -190,12 +181,9 @@ void f(void) @/ void main_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (4 == aorai_CurStates) aorai_CurStates_tmp = S2; - aorai_CurStates = aorai_CurStates_tmp; + if (4 == aorai_CurStates) aorai_CurStates = S2; return; } diff --git a/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle b/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle index ab55916b9af828248a4309cdc6424442f8027441..7141a6e19585342e2f1f9571efaa71e68c2ba704 100644 --- a/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle @@ -61,12 +61,9 @@ check lemma I_deterministic_trans{L}: @/ void main_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (0 == aorai_CurStates) aorai_CurStates_tmp = I; - aorai_CurStates = aorai_CurStates_tmp; + if (0 == aorai_CurStates) aorai_CurStates = I; return; } @@ -88,12 +85,9 @@ check lemma I_deterministic_trans{L}: @/ void main_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (0 == aorai_CurStates) aorai_CurStates_tmp = I; - aorai_CurStates = aorai_CurStates_tmp; + if (0 == aorai_CurStates) aorai_CurStates = I; return; } diff --git a/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle b/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle index 5a30e59e7d5e51dd0849a5f48c908fbe5493e073..8e648b2ea61129f84dbd19578c474b63943ede22 100644 --- a/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle @@ -105,15 +105,16 @@ check lemma S0_deterministic_trans{L}: @/ void g_pre_func(int x) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_g; - aorai_CurStates_tmp = aorai_CurStates; - if (3 == aorai_CurStates) - if (x == 5) aorai_CurStates_tmp = S5; - if (3 == aorai_CurStates) - if (x == 4) aorai_CurStates_tmp = S4; - aorai_CurStates = aorai_CurStates_tmp; + if (3 == aorai_CurStates) { + if (x == 4) aorai_CurStates = S4; else goto _LAND; + } + else { + _LAND: ; + if (3 == aorai_CurStates) + if (x == 5) aorai_CurStates = S5; + } return; } @@ -161,13 +162,11 @@ check lemma S0_deterministic_trans{L}: @/ void g_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_g; - aorai_CurStates_tmp = aorai_CurStates; - if (4 == aorai_CurStates) aorai_CurStates_tmp = S3; - if (5 == aorai_CurStates) aorai_CurStates_tmp = S1; - aorai_CurStates = aorai_CurStates_tmp; + if (5 == aorai_CurStates) aorai_CurStates = S1; + else + if (4 == aorai_CurStates) aorai_CurStates = S3; return; } @@ -230,13 +229,10 @@ void g(int x) @/ void f_pre_func(int x) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; if (1 == aorai_CurStates) - if (x == 4) aorai_CurStates_tmp = S3; - aorai_CurStates = aorai_CurStates_tmp; + if (x == 4) aorai_CurStates = S3; return; } @@ -280,14 +276,11 @@ void g(int x) @/ void f_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; if (1 == aorai_CurStates) if (res == 0) - if (X == 5) aorai_CurStates_tmp = S2; - aorai_CurStates = aorai_CurStates_tmp; + if (X == 5) aorai_CurStates = S2; return; } @@ -356,15 +349,16 @@ int f(int x) @/ void real_main_pre_func(int c) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_real_main; - aorai_CurStates_tmp = aorai_CurStates; - if (0 == aorai_CurStates) - if (c == 0) aorai_CurStates_tmp = S2; - if (0 == aorai_CurStates) - if (c != 0) aorai_CurStates_tmp = S1; - aorai_CurStates = aorai_CurStates_tmp; + if (0 == aorai_CurStates) { + if (c != 0) aorai_CurStates = S1; else goto _LAND; + } + else { + _LAND: ; + if (0 == aorai_CurStates) + if (c == 0) aorai_CurStates = S2; + } return; } @@ -407,12 +401,9 @@ int f(int x) @/ void real_main_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_real_main; - aorai_CurStates_tmp = aorai_CurStates; - if (2 == aorai_CurStates) aorai_CurStates_tmp = Sf; - aorai_CurStates = aorai_CurStates_tmp; + if (2 == aorai_CurStates) aorai_CurStates = Sf; return; } @@ -471,12 +462,9 @@ int real_main(int c) @/ void main_pre_func(int c) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (7 == aorai_CurStates) aorai_CurStates_tmp = S0; - aorai_CurStates = aorai_CurStates_tmp; + if (7 == aorai_CurStates) aorai_CurStates = S0; return; } @@ -519,12 +507,9 @@ int real_main(int c) @/ void main_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (6 == aorai_CurStates) aorai_CurStates_tmp = Sf; - aorai_CurStates = aorai_CurStates_tmp; + if (6 == aorai_CurStates) aorai_CurStates = Sf; return; } diff --git a/src/plugins/aorai/tests/ya/oracle/formals.res.oracle b/src/plugins/aorai/tests/ya/oracle/formals.res.oracle index 3fa9613a782d0cd189af5fb61fae70e89db84d9f..4e41dd7f696e65d3b5b363d4a952c1560a6d5b9f 100644 --- a/src/plugins/aorai/tests/ya/oracle/formals.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/formals.res.oracle @@ -124,21 +124,23 @@ check lemma aorai_intermediate_state_deterministic_trans{L}: @/ void f_pre_func(int x) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; - if (7 == aorai_CurStates) - if (x == 3) { - aorai_CurStates_tmp = aorai_intermediate_state_2; - aorai_x_0 = x; - } - if (7 == aorai_CurStates) + if (7 == aorai_CurStates) { if (x == 1) { - aorai_CurStates_tmp = aorai_intermediate_state; + aorai_CurStates = aorai_intermediate_state; aorai_x = x; } - aorai_CurStates = aorai_CurStates_tmp; + else goto _LAND; + } + else { + _LAND: ; + if (7 == aorai_CurStates) + if (x == 3) { + aorai_CurStates = aorai_intermediate_state_2; + aorai_x_0 = x; + } + } return; } @@ -209,24 +211,30 @@ check lemma aorai_intermediate_state_deterministic_trans{L}: @/ void f_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; if (4 == aorai_CurStates) { - if (aorai_x_0 != 3) aorai_CurStates_tmp = aorai_reject; - else goto _LAND; + if (aorai_x_0 == 3) aorai_CurStates = OK; else goto _LAND_1; } else { - _LAND: ; - if (1 == aorai_CurStates) - if (aorai_x != 1) aorai_CurStates_tmp = aorai_reject; + _LAND_1: ; + if (1 == aorai_CurStates) { + if (aorai_x == 1) aorai_CurStates = aorai_intermediate_state_0; + else goto _LAND_0; + } + else { + _LAND_0: ; + if (4 == aorai_CurStates) { + if (aorai_x_0 != 3) aorai_CurStates = aorai_reject; + else goto _LAND; + } + else { + _LAND: ; + if (1 == aorai_CurStates) + if (aorai_x != 1) aorai_CurStates = aorai_reject; + } + } } - if (1 == aorai_CurStates) - if (aorai_x == 1) aorai_CurStates_tmp = aorai_intermediate_state_0; - if (4 == aorai_CurStates) - if (aorai_x_0 == 3) aorai_CurStates_tmp = OK; - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -347,17 +355,16 @@ int f(int x) @/ void g_pre_func(int y) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_g; - aorai_CurStates_tmp = aorai_CurStates; - if (5 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject; - if (2 == aorai_CurStates) { - aorai_CurStates_tmp = aorai_intermediate_state_1; - aorai_y = y; - } - if (0 == aorai_CurStates) aorai_CurStates_tmp = OK; - aorai_CurStates = aorai_CurStates_tmp; + if (0 == aorai_CurStates) aorai_CurStates = OK; + else + if (2 == aorai_CurStates) { + aorai_CurStates = aorai_intermediate_state_1; + aorai_y = y; + } + else + if (5 == aorai_CurStates) aorai_CurStates = aorai_reject; return; } @@ -420,22 +427,20 @@ int f(int x) @/ void g_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_g; - aorai_CurStates_tmp = aorai_CurStates; - if (5 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject; - else - if (3 == aorai_CurStates) - if (aorai_y != 2) aorai_CurStates_tmp = aorai_reject; if (3 == aorai_CurStates) { - if (aorai_y == 2) aorai_CurStates_tmp = OK; else goto _LAND; + if (aorai_y == 2) aorai_CurStates = OK; else goto _LAND; } else { _LAND: ; - if (0 == aorai_CurStates) aorai_CurStates_tmp = OK; + if (0 == aorai_CurStates) aorai_CurStates = OK; + else + if (5 == aorai_CurStates) aorai_CurStates = aorai_reject; + else + if (3 == aorai_CurStates) + if (aorai_y != 2) aorai_CurStates = aorai_reject; } - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -514,12 +519,9 @@ int g(int y) @/ void main_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (6 == aorai_CurStates) aorai_CurStates_tmp = main_0; - aorai_CurStates = aorai_CurStates_tmp; + if (6 == aorai_CurStates) aorai_CurStates = main_0; return; } @@ -567,13 +569,11 @@ int g(int y) @/ void main_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (5 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject; - if (0 == aorai_CurStates) aorai_CurStates_tmp = OK; - aorai_CurStates = aorai_CurStates_tmp; + if (0 == aorai_CurStates) aorai_CurStates = OK; + else + if (5 == aorai_CurStates) aorai_CurStates = aorai_reject; return; } diff --git a/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle b/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle index 3913f00e2f485fad13453eb892e7fcc28f412f75..ccfb249eba5eb4f3b759bba09f44a869117caa21 100644 --- a/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle @@ -33,11 +33,8 @@ int f(void); @/ void main_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -54,11 +51,8 @@ int f(void); @/ void main_post_func(int res) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - aorai_CurStates = aorai_CurStates_tmp; return; } diff --git a/src/plugins/aorai/tests/ya/oracle/metavariables-right.res.oracle b/src/plugins/aorai/tests/ya/oracle/metavariables-right.res.oracle index 0b3bcf3d45f628b37e1d9a3290724d593ededdce..2f740e907d67b768924e4ecbe361e49c581f4c00 100644 --- a/src/plugins/aorai/tests/ya/oracle/metavariables-right.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/metavariables-right.res.oracle @@ -103,16 +103,13 @@ check lemma e_deterministic_trans{L}: @/ void f_pre_func(int x) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; if (1 == aorai_CurStates) { - aorai_CurStates_tmp = c; + aorai_CurStates = c; aorai_y = aorai_x; aorai_x = x; } - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -158,12 +155,9 @@ check lemma e_deterministic_trans{L}: @/ void f_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; - if (2 == aorai_CurStates) aorai_CurStates_tmp = e; - aorai_CurStates = aorai_CurStates_tmp; + if (2 == aorai_CurStates) aorai_CurStates = e; return; } @@ -227,12 +221,9 @@ void f(int x) @/ void g_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_g; - aorai_CurStates_tmp = aorai_CurStates; - if (1 == aorai_CurStates) aorai_CurStates_tmp = d; - aorai_CurStates = aorai_CurStates_tmp; + if (1 == aorai_CurStates) aorai_CurStates = d; return; } @@ -278,12 +269,9 @@ void f(int x) @/ void g_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_g; - aorai_CurStates_tmp = aorai_CurStates; - if (3 == aorai_CurStates) aorai_CurStates_tmp = g_0; - aorai_CurStates = aorai_CurStates_tmp; + if (3 == aorai_CurStates) aorai_CurStates = g_0; return; } @@ -342,13 +330,10 @@ void g(void) @/ void h_pre_func(int x) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_h; - aorai_CurStates_tmp = aorai_CurStates; if (4 == aorai_CurStates) - if (aorai_x > 0) aorai_CurStates_tmp = f_0; - aorai_CurStates = aorai_CurStates_tmp; + if (aorai_x > 0) aorai_CurStates = f_0; return; } @@ -394,12 +379,9 @@ void g(void) @/ void h_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_h; - aorai_CurStates_tmp = aorai_CurStates; - if (5 == aorai_CurStates) aorai_CurStates_tmp = g_0; - aorai_CurStates = aorai_CurStates_tmp; + if (5 == aorai_CurStates) aorai_CurStates = g_0; return; } @@ -458,12 +440,9 @@ void h(int x) @/ void i_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_i; - aorai_CurStates_tmp = aorai_CurStates; - if (6 == aorai_CurStates) aorai_CurStates_tmp = h_0; - aorai_CurStates = aorai_CurStates_tmp; + if (6 == aorai_CurStates) aorai_CurStates = h_0; return; } @@ -514,16 +493,13 @@ void h(int x) @/ void i_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_i; - aorai_CurStates_tmp = aorai_CurStates; if (7 == aorai_CurStates) { - aorai_CurStates_tmp = e; + aorai_CurStates = e; aorai_y = 0; aorai_x = 1; } - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -587,12 +563,9 @@ void i(void) @/ void main_pre_func(int t) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (0 == aorai_CurStates) aorai_CurStates_tmp = b; - aorai_CurStates = aorai_CurStates_tmp; + if (0 == aorai_CurStates) aorai_CurStates = b; return; } @@ -638,12 +611,9 @@ void i(void) @/ void main_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (4 == aorai_CurStates) aorai_CurStates_tmp = i_0; - aorai_CurStates = aorai_CurStates_tmp; + if (4 == aorai_CurStates) aorai_CurStates = i_0; return; } diff --git a/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle b/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle index 5df73b9c95c31edffe2319c7c773b93acfa13b23..86ceb3e991278c964faf62706c167f6710087817 100644 --- a/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle @@ -64,14 +64,11 @@ check lemma Init_deterministic_trans{L}: @/ void f_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; - if (2 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject; + if (2 == aorai_CurStates) aorai_CurStates = aorai_reject; else - if (1 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject; - aorai_CurStates = aorai_CurStates_tmp; + if (1 == aorai_CurStates) aorai_CurStates = aorai_reject; return; } @@ -99,12 +96,9 @@ check lemma Init_deterministic_trans{L}: @/ void f_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_f; - aorai_CurStates_tmp = aorai_CurStates; - if (2 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject; - aorai_CurStates = aorai_CurStates_tmp; + if (2 == aorai_CurStates) aorai_CurStates = aorai_reject; return; } @@ -145,11 +139,8 @@ void f(void) @/ void main_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -172,11 +163,8 @@ void f(void) @/ void main_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - aorai_CurStates = aorai_CurStates_tmp; return; } diff --git a/src/plugins/aorai/tests/ya/oracle/stack.res.oracle b/src/plugins/aorai/tests/ya/oracle/stack.res.oracle index 61c74befdb48b9cefe767cb5d067e8b3b9437886..d036e4e44939b3d91ffec9da6606f8670f5c7463 100644 --- a/src/plugins/aorai/tests/ya/oracle/stack.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/stack.res.oracle @@ -86,14 +86,11 @@ check lemma emptying_stack_deterministic_trans{L}: @/ void push_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_push; - aorai_CurStates_tmp = aorai_CurStates; - if (3 == aorai_CurStates) aorai_CurStates_tmp = filling_stack; + if (3 == aorai_CurStates) aorai_CurStates = filling_stack; else - if (1 == aorai_CurStates) aorai_CurStates_tmp = filling_stack; - aorai_CurStates = aorai_CurStates_tmp; + if (1 == aorai_CurStates) aorai_CurStates = filling_stack; return; } @@ -132,15 +129,12 @@ check lemma emptying_stack_deterministic_trans{L}: @/ void push_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_push; - aorai_CurStates_tmp = aorai_CurStates; if (4 == aorai_CurStates) { - aorai_CurStates_tmp = filled_stack; + aorai_CurStates = filled_stack; aorai_n ++; } - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -204,13 +198,10 @@ void push(void) @/ void pop_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_pop; - aorai_CurStates_tmp = aorai_CurStates; if (3 == aorai_CurStates) - if (aorai_n > 0) aorai_CurStates_tmp = emptying_stack; - aorai_CurStates = aorai_CurStates_tmp; + if (aorai_n > 0) aorai_CurStates = emptying_stack; return; } @@ -258,21 +249,23 @@ void push(void) @/ void pop_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_pop; - aorai_CurStates_tmp = aorai_CurStates; - if (2 == aorai_CurStates) - if (aorai_n > 1) { - aorai_CurStates_tmp = filled_stack; - aorai_n --; - } - if (2 == aorai_CurStates) + if (2 == aorai_CurStates) { if (aorai_n == 1) { - aorai_CurStates_tmp = empty_stack; + aorai_CurStates = empty_stack; aorai_n --; } - aorai_CurStates = aorai_CurStates_tmp; + else goto _LAND; + } + else { + _LAND: ; + if (2 == aorai_CurStates) + if (aorai_n > 1) { + aorai_CurStates = filled_stack; + aorai_n --; + } + } return; } @@ -338,15 +331,12 @@ void pop(void) @/ void main_pre_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Called; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; if (5 == aorai_CurStates) { - aorai_CurStates_tmp = empty_stack; + aorai_CurStates = empty_stack; aorai_n = 0; } - aorai_CurStates = aorai_CurStates_tmp; return; } @@ -383,12 +373,9 @@ void pop(void) @/ void main_post_func(void) { - int aorai_CurStates_tmp; aorai_CurOpStatus = aorai_Terminated; aorai_CurOperation = op_main; - aorai_CurStates_tmp = aorai_CurStates; - if (1 == aorai_CurStates) aorai_CurStates_tmp = accept; - aorai_CurStates = aorai_CurStates_tmp; + if (1 == aorai_CurStates) aorai_CurStates = accept; return; } diff --git a/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle index 7655e180602256ff7618173c8a157ec9f4bc2b63..e5437b11cf441f0122b9d89b3ba1147984506890 100644 --- a/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle @@ -3,5 +3,5 @@ [aorai] Warning: Call to main does not follow automaton's specification. This path is assumed to be dead [kernel] Parsing TMPDIR/aorai_incorrect_0.i (no preprocessing) [wp] Warning: Missing RTE guards -[kernel:annot:missing-spec] TMPDIR/aorai_incorrect_0.i:65: Warning: +[kernel:annot:missing-spec] TMPDIR/aorai_incorrect_0.i:62: Warning: Neither code nor specification for function f, generating default assigns from the prototype