From 2f5342a4f240b60df7135dbfa7e63081c9bd70a7 Mon Sep 17 00:00:00 2001 From: Virgile Prevosto <virgile.prevosto@m4x.org> Date: Sat, 1 Jan 2022 11:38:28 +0100 Subject: [PATCH] [aorai] Frama_C_show_aorai_state works in non-deterministic state --- .../aorai/aorai_eva_analysis.enabled.ml | 41 +++++++++++++++++-- src/plugins/aorai/tests/ya/observed.i | 2 +- .../aorai/tests/ya/oracle/observed.res.oracle | 2 +- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/plugins/aorai/aorai_eva_analysis.enabled.ml b/src/plugins/aorai/aorai_eva_analysis.enabled.ml index f4591090689..753b5b8fd47 100644 --- a/src/plugins/aorai/aorai_eva_analysis.enabled.ml +++ b/src/plugins/aorai/aorai_eva_analysis.enabled.ml @@ -39,13 +39,32 @@ let show_val fmt (expr, v) = Printer.pp_exp expr (Cvalue.V.pretty_typ (Some (Cil.typeOf expr))) v +let show_non_det_state fmt state = + let (states,_) = Data_for_aorai.getGraph () in + let first_print = ref true in + let print_state s sure = + if not !first_print then Format.fprintf fmt ",@ "; + first_print := false; + Format.fprintf fmt "%s%s" + (if sure then "" else "(?)") + s.Promelaast.name + in + let print_one s = + (* TODO: sync Data_for_aorai.get_state_var with current project*) + let vi = Data_for_aorai.get_varinfo s.Promelaast.name in + let e = Cil.evar vi in + let cvalue = !Db.Value.eval_expr state e in + if Cvalue.V.contains_non_zero cvalue then + print_state s (not (Cvalue.V.contains_zero cvalue)) + in + List.iter print_one states + let show_aorai_state = "Frama_C_show_aorai_state" let builtin_show_aorai_state state args = if not (Aorai_option.Deterministic.get()) then begin - Aorai_option.warning - ~current:true "%s can only display info for deterministic automata" - show_aorai_state + Aorai_option.result ~current:true + "@[<hv 2>Possible states:@ %a@]" show_non_det_state state; end else begin let history = Data_for_aorai.(curState :: (whole_history ())) in Aorai_option.result ~current:true "@[<hv>%a@]" @@ -77,13 +96,27 @@ let add_slevel_annotation vi kind = let add_slevel_annotations () = Aorai_visitors.Aux_funcs.iter add_slevel_annotation +let add_nondet_partitioning () = + let (states,_) = Data_for_aorai.getGraph() in + let add_one_state state = + let vi = Data_for_aorai.get_state_var state in + Eva.Parameters.use_global_value_partitioning vi + in + List.iter add_one_state states + let add_partitioning varname = match Data_for_aorai.get_varinfo_option varname with - | None -> () + | None -> add_nondet_partitioning () | Some vi -> Eva.Parameters.use_global_value_partitioning vi +let add_aux_partitioning () = + List.iter + Eva.Parameters.use_global_value_partitioning + (Data_for_aorai.aux_variables()) + let add_state_variables_partitioning () = add_partitioning Data_for_aorai.curState; + add_aux_partitioning (); List.iter add_partitioning (Data_for_aorai.whole_history ()) let setup () = diff --git a/src/plugins/aorai/tests/ya/observed.i b/src/plugins/aorai/tests/ya/observed.i index 28b40a8ed50..05b843f0fda 100644 --- a/src/plugins/aorai/tests/ya/observed.i +++ b/src/plugins/aorai/tests/ya/observed.i @@ -1,5 +1,5 @@ /* run.config* - OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@ + OPT: -aorai-automata %{dep:@PTEST_DIR@/@PTEST_NAME@.ya} -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@ */ void f(void) {} diff --git a/src/plugins/aorai/tests/ya/oracle/observed.res.oracle b/src/plugins/aorai/tests/ya/oracle/observed.res.oracle index 393c8d85224..85dd02e85b7 100644 --- a/src/plugins/aorai/tests/ya/oracle/observed.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/observed.res.oracle @@ -1,4 +1,4 @@ -[kernel] Parsing tests/ya/observed.i (no preprocessing) +[kernel] Parsing observed.i (no preprocessing) [kernel] Parsing TMPDIR/aorai_observed_0.i (no preprocessing) /* Generated by Frama-C */ enum aorai_ListOper { -- GitLab