From 9fb45638d91ad2d7d1c8fae47d892ff723c98ac6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Tue, 9 Apr 2019 11:01:16 +0200
Subject: [PATCH] [Eva] Embeds split_return in partition as a new partitioning
 action.

Moves function split_by_evaluation from evaluation to partition.
Moves function split_final_state from transfer_stmt to partition.
New partitioning action Restrict, that restricts the rationing according to the
evaluation of an expression into some expected values.
---
 src/plugins/value/engine/evaluation.ml        |  39 ------
 src/plugins/value/engine/evaluation.mli       |  15 ---
 src/plugins/value/engine/partition.ml         | 127 ++++++++++++++----
 src/plugins/value/engine/partition.mli        |   2 +-
 .../value/engine/trace_partitioning.ml        |  41 +++---
 src/plugins/value/engine/transfer_stmt.ml     |  27 ----
 src/plugins/value/engine/transfer_stmt.mli    |   3 -
 tests/value/oracle/split_return.0.res.oracle  |   2 +-
 tests/value/oracle/split_return.1.res.oracle  |   2 +-
 tests/value/oracle/split_return.3.res.oracle  |  28 ++--
 tests/value/oracle/split_return.4.res.oracle  |  50 +++----
 11 files changed, 164 insertions(+), 172 deletions(-)

diff --git a/src/plugins/value/engine/evaluation.ml b/src/plugins/value/engine/evaluation.ml
index bf0c38fa2cc..cc4018b105a 100644
--- a/src/plugins/value/engine/evaluation.ml
+++ b/src/plugins/value/engine/evaluation.ml
@@ -208,9 +208,6 @@ module type S = sig
     ?valuation:Valuation.t -> state -> exp -> bool -> Valuation.t evaluated
   val assume:
     ?valuation:Valuation.t -> state -> exp -> value -> Valuation.t or_bottom
-  val split_by_evaluation:
-    exp -> Integer.t list -> state list ->
-    (Integer.t * state list * bool) list * state list
   val eval_function_exp:
     exp -> ?args:exp list -> state -> (Kernel_function.t * Valuation.t) list evaluated
   val interpret_truth:
@@ -1587,42 +1584,6 @@ module Make
           Bottom.bot_of_list list, alarms
       end
     | _ -> assert false
-
-  let split_by_evaluation = match Value.get Main_values.cvalue_key with
-    | None -> fun _ _ states -> [], states
-    | Some get -> fun expr expected_values states ->
-      let typ = Cil.typeOf expr in
-      let eval acc state =
-        match fst (evaluate state expr) with
-        | `Bottom -> (state, `Bottom, false) :: acc
-        | `Value (_cache, value) ->
-          let zero_or_one = Cvalue.V.cardinal_zero_or_one (get value) in
-          (state, `Value value, zero_or_one) :: acc
-      in
-      let eval_states = List.fold_left eval [] states in
-      let match_expected_value expected_value states =
-        let process_one_state (eq, mess, neq) (s, v, zero_or_one as current) =
-          if Bottom.is_included Value.is_included expected_value v then
-            (* The integer on which we split is part of the result *)
-            if zero_or_one then
-              (s :: eq, mess, neq) (* Clean split *)
-            else
-              (eq, true, current :: neq) (* v is not exact: mess, i.e. no split *)
-          else
-            (eq, mess, current :: neq) (* Integer not in the result at all *)
-        in
-        List.fold_left process_one_state ([], false, []) states
-      in
-      let process_one_value (acc, states) i =
-        let value = `Value (Value.reduce (Value.inject_int typ i)) in
-        let eq, mess, neq = match_expected_value value states in
-        (i, eq, mess) :: acc, neq
-      in
-      let matched, tail =
-        List.fold_left process_one_value ([], eval_states) expected_values
-      in
-      matched, List.map (fun (s, _, _) -> s) tail
-
 end
 
 
diff --git a/src/plugins/value/engine/evaluation.mli b/src/plugins/value/engine/evaluation.mli
index 9f263d86b36..ad8886669f2 100644
--- a/src/plugins/value/engine/evaluation.mli
+++ b/src/plugins/value/engine/evaluation.mli
@@ -94,21 +94,6 @@ module type S = sig
     ?valuation:Valuation.t ->
     state -> exp -> value -> Valuation.t or_bottom
 
-  (* Sorts a list of states by the evaluation of an expression, according to
-     a list of expected integer values.
-     [split_by_evaluation expr expected_values states] returns two list
-     (matched, tail) such as:
-     - for each element (i, states, mess) of the first list [matched],
-       i was in the list of integer [expected_values], [states] is the list of
-       input states where [expr] evaluates to exactly [i], and [mess] is true
-       if there was some other input state on which [expr] evaluates to a value
-       including [i] (but not equal to [i]).
-     - tail are the states on which [expr] does not evaluate to none of the
-       [expected_values]. *)
-  val split_by_evaluation:
-    exp -> Integer.t list -> state list ->
-    (Integer.t * state list * bool) list * state list
-
   val eval_function_exp:
     exp -> ?args:exp list -> state ->
     (Kernel_function.t * Valuation.t) list evaluated
diff --git a/src/plugins/value/engine/partition.ml b/src/plugins/value/engine/partition.ml
index ad833cba6dd..8b7c530a1aa 100644
--- a/src/plugins/value/engine/partition.ml
+++ b/src/plugins/value/engine/partition.ml
@@ -158,6 +158,7 @@ type action =
   | Incr_loop
   | Branch of branch * int
   | Ration of rationing
+  | Restrict of Cil_types.exp * Integer.t list
   | Split of Cil_types.exp * split_kind * int
   | Merge of Cil_types.exp * split_kind
   | Update_dynamic_splits
@@ -297,7 +298,6 @@ struct
                  to increase this limit."
         monitor.split_limit pp_count
 
-
   let eval_exp_to_int state exp =
     let _valuation, ival = evaluate_exp_to_ival state exp in
     try
@@ -308,8 +308,105 @@ struct
     | Failure _ ->
       fail ~exp "this partitioning parameter is too big"
 
+  (* Sorts a list of states by the evaluation of an expression, according to
+     a list of expected integer values.
+     [split_by_evaluation expr expected_values states] returns two list
+     (matched, tail) such as:
+     - for each element (i, states, mess) of the first list [matched],
+       i was in the list of integer [expected_values], [states] is the list of
+       input states where [expr] evaluates to exactly [i], and [mess] is true
+       if there was some other input state on which [expr] evaluates to a value
+       including [i] (but not equal to [i]).
+     - tail are the states on which [expr] does not evaluate to none of the
+       [expected_values]. *)
+  let split_by_evaluation = match Abstract.Val.get Main_values.cvalue_key with
+    | None -> fun _ _ states -> [], states
+    | Some get -> fun expr expected_values states ->
+      let typ = Cil.typeOf expr in
+      let eval acc state =
+        match fst (Abstract.Eval.evaluate state expr) with
+        | `Bottom -> (state, `Bottom, false) :: acc
+        | `Value (_cache, value) ->
+          let zero_or_one = Cvalue.V.cardinal_zero_or_one (get value) in
+          (state, `Value value, zero_or_one) :: acc
+      in
+      let eval_states = List.fold_left eval [] states in
+      let match_expected_value expected_value states =
+        let process_one_state (eq, mess, neq) (s, v, zero_or_one as current) =
+          if Bottom.is_included Abstract.Val.is_included expected_value v then
+            (* The integer on which we split is part of the result *)
+            if zero_or_one then
+              (s :: eq, mess, neq) (* Clean split *)
+            else
+              (eq, true, current :: neq) (* v is not exact: mess, i.e. no split *)
+          else
+            (eq, mess, current :: neq) (* Integer not in the result at all *)
+        in
+        List.fold_left process_one_state ([], false, []) states
+      in
+      let process_one_value (acc, states) i =
+        let value = `Value Abstract.Val.(reduce (inject_int typ i)) in
+        let eq, mess, neq = match_expected_value value states in
+        (i, eq, mess) :: acc, neq
+      in
+      let matched, tail =
+        List.fold_left process_one_value ([], eval_states) expected_values
+      in
+      matched, List.map (fun (s, _, _) -> s) tail
+
+  let smash_states = function
+    | [] -> []
+    | v1 :: l -> [ List.fold_left Abstract.Dom.join v1 l ]
+
+  (* In the list of [states], join states in which [expr] evaluates to the
+     same exact value in [expected_values] or to any other value. *)
+  let merge_by_value expr expected_values states =
+    let states =
+      if Cil.isIntegralOrPointerType (Cil.typeOf expr)
+      then
+        let matched, tail =
+          split_by_evaluation expr expected_values states
+        in
+        let process (i, states, mess) =
+          if mess then
+            Value_parameters.result ~once:true ~current:true
+              "cannot properly split on \\result == %a"
+              Abstract_interp.Int.pretty i;
+          states
+        in
+        tail :: List.map process matched
+      else [states]
+    in
+    List.flatten (List.map smash_states states)
+
   (* --- Applying partitioning actions onto flows --------------------------- *)
 
+  (* Applies the transfer function [f] to the states whose partitioning keys
+     only differ by the ration stamp. [f] may smash those states, thus
+     restricting the rationing without affecting the other partitioning. *)
+  let restrict_rationing (f : state list -> state list) (p : t) : t =
+    (* Group the states in buckets, where each bucket is a list of states
+       with the same key except for the ration stamp *)
+    let fill_buckets buckets (k,x)  =
+      (* Ignore the ration stamp *)
+      let k = { k with ration_stamp = None } in
+      (* Find the bucket *)
+      let contents =
+        try KMap.find k buckets
+        with Not_found -> []
+      in
+      (* Add the state to the bucket *)
+      KMap.add k (x :: contents) buckets
+    in
+    let buckets = List.fold_left fill_buckets KMap.empty p in
+    (* Apply the transfer function to each bucket *)
+    let result = KMap.map f buckets in
+    (* Rebuild the flow *)
+    let add_bucket k bucket acc =
+      List.map (fun x -> k,x) bucket @ acc
+    in
+    KMap.fold add_bucket result []
+
   let split_state ~monitor (kind : split_kind) (exp : Cil_types.exp)
       (key : key) (state : state) : (key * state) list =
     try
@@ -358,9 +455,12 @@ struct
     | Update_dynamic_splits ->
       update_dynamic_splits p
 
+    | Restrict (expr, expected_values) ->
+      restrict_rationing (merge_by_value expr expected_values) p
+
     | action -> (* Simple map transfer functions *)
       let transfer = match action with
-        | Split _ | Update_dynamic_splits ->
+        | Restrict _ | Split _ | Update_dynamic_splits ->
           assert false (* Handled above *)
 
         | Enter_loop limit_kind -> fun k x ->
@@ -446,29 +546,6 @@ struct
     in
     List.fold_left transfer [] p
 
-  let legacy_transfer_states (f : state list -> state list) (p : t) : t =
-    (* Group the states in buckets, where each bucket is a list of states
-       with the same key except for the ration stamp *)
-    let fill_buckets buckets (k,x)  =
-      (* Ignore the ration stamp *)
-      let k = { k with ration_stamp = None } in
-      (* Find the bucket *)
-      let contents =
-        try KMap.find k buckets
-        with Not_found -> []
-      in
-      (* Add the state to the bucket *)
-      KMap.add k (x :: contents) buckets
-    in
-    let buckets = List.fold_left fill_buckets KMap.empty p in
-    (* Apply the transfer function to each bucket *)
-    let result = KMap.map f buckets in
-    (* Rebuild the flow *)
-    let add_bucket k bucket acc =
-      List.map (fun x -> k,x) bucket @ acc
-    in
-    KMap.fold add_bucket result []
-
   let iter (f : state -> unit) (p : t) : unit =
     List.iter (fun (_k,x) -> f x) p
 end
diff --git a/src/plugins/value/engine/partition.mli b/src/plugins/value/engine/partition.mli
index 10155a3d869..ed7a1211289 100644
--- a/src/plugins/value/engine/partition.mli
+++ b/src/plugins/value/engine/partition.mli
@@ -102,6 +102,7 @@ type action =
   | Incr_loop
   | Branch of branch * int (* branch taken, max branches in history *)
   | Ration of rationing
+  | Restrict of Cil_types.exp * Integer.t list
   | Split of Cil_types.exp * split_kind * int
   | Merge of Cil_types.exp * split_kind
   | Update_dynamic_splits
@@ -130,7 +131,6 @@ sig
 
   val transfer_keys : t -> action -> t
   val transfer_states : (state -> state list) -> t -> t
-  val legacy_transfer_states : (state list -> state list) -> t -> t
 
   val iter : (state -> unit) -> t -> unit
 end
diff --git a/src/plugins/value/engine/trace_partitioning.ml b/src/plugins/value/engine/trace_partitioning.ml
index 701487999a2..c4bb0eb2bb2 100644
--- a/src/plugins/value/engine/trace_partitioning.ml
+++ b/src/plugins/value/engine/trace_partitioning.ml
@@ -151,38 +151,37 @@ struct
 
   (* Partition transfer functions *)
 
-  let loop_transfer p action =
+  let transfer_action p action =
     p.flow_states <- Flow.transfer_keys p.flow_states action
 
   let enter_loop (p : flow) (i : loop) : unit =
-    loop_transfer p (Enter_loop (unroll i))
+    transfer_action p (Enter_loop (unroll i))
 
   let leave_loop (p : flow) (_i : loop) : unit =
-    loop_transfer p Leave_loop
+    transfer_action p Leave_loop
 
   let next_loop_iteration (p : flow) (_i : loop) : unit =
-    loop_transfer p Incr_loop
+    transfer_action p Incr_loop
+
+  let empty_rationing = new_rationing ~limit:0 ~merge:false
 
   let split_return (flow : flow) (return_exp : exp option) : unit =
-    (** Join every state in the list *)
-    let transfer_split states =
+    let strategy = Split_return.kf_strategy kf in
+    if strategy <> Split_strategy.FullSplit
+    then
+      let smash () =
+        transfer_action flow (Ration empty_rationing);
+        let p = Flow.to_partition flow.flow_states in
+        flow.flow_states <- Flow.of_partition p
+      in
       match Split_return.kf_strategy kf with
+      (* SplitAuto already transformed into SplitEqList. *)
+      | Split_strategy.FullSplit | Split_strategy.SplitAuto -> assert false
+      | Split_strategy.NoSplit -> smash ()
       | Split_strategy.SplitEqList i ->
-        begin match return_exp with
-          | Some return_exp ->
-            let states = Transfer.split_final_states kf return_exp i states in
-            List.flatten (List.map smash_states states)
-          | None ->
-            smash_states states
-        end
-      | Split_strategy.NoSplit   -> smash_states states
-      | Split_strategy.FullSplit -> states
-      (* Last case not possible : already transformed into SplitEqList *)
-      | Split_strategy.SplitAuto -> assert false
-    in
-    flow.flow_states <-
-      Flow.legacy_transfer_states transfer_split flow.flow_states
-
+        match return_exp with
+        | None -> smash ()
+        | Some return_exp -> transfer_action flow (Restrict (return_exp, i))
 
   (* Reset state (for hierchical convergence) *)
 
diff --git a/src/plugins/value/engine/transfer_stmt.ml b/src/plugins/value/engine/transfer_stmt.ml
index c81a78f0133..e7be6f8f582 100644
--- a/src/plugins/value/engine/transfer_stmt.ml
+++ b/src/plugins/value/engine/transfer_stmt.ml
@@ -33,8 +33,6 @@ module type S = sig
   val call:
     stmt -> lval option -> exp -> exp list -> state ->
     state list or_bottom * Value_types.cacheable
-  val split_final_states:
-    kernel_function -> exp -> Integer.t list -> state list -> state list list
   val check_unspecified_sequence:
     stmt ->
     state -> (stmt * lval list * lval list * lval list * stmt ref list) list ->
@@ -764,31 +762,6 @@ module Make (Abstract: Abstractions.Eva) = struct
     in
     eval, !cacheable
 
-
-  (* ------------------------------------------------------------------------ *)
-  (*                            Function Return                               *)
-  (* ------------------------------------------------------------------------ *)
-
-  let split_final_states kf return_expr expected_values states =
-    let varinfo = match return_expr.enode with
-      | Lval (Var varinfo, NoOffset) -> varinfo
-      | _                            -> assert false (* Cil invariant *)
-    in
-    if Cil.isIntegralOrPointerType varinfo.vtype
-    then
-      let matched, tail =
-        Eval.split_by_evaluation return_expr expected_values states
-      in
-      let process (i, states, mess) =
-        if mess then
-          Value_parameters.result ~once:true ~current:true
-            "%a: cannot properly split on \\result == %a"
-            Kernel_function.pretty kf Abstract_interp.Int.pretty i;
-        states
-      in
-      tail :: List.map process matched
-    else [states]
-
   (* ------------------------------------------------------------------------ *)
   (*                            Unspecified Sequence                          *)
   (* ------------------------------------------------------------------------ *)
diff --git a/src/plugins/value/engine/transfer_stmt.mli b/src/plugins/value/engine/transfer_stmt.mli
index a2e64699a2e..567674a5f34 100644
--- a/src/plugins/value/engine/transfer_stmt.mli
+++ b/src/plugins/value/engine/transfer_stmt.mli
@@ -39,9 +39,6 @@ module type S = sig
     stmt -> lval option -> exp -> exp list -> state ->
     state list or_bottom * Value_types.cacheable
 
-  val split_final_states:
-    kernel_function -> exp -> Integer.t list -> state list -> state list list
-
   val check_unspecified_sequence:
     Cil_types.stmt ->
     state ->
diff --git a/tests/value/oracle/split_return.0.res.oracle b/tests/value/oracle/split_return.0.res.oracle
index 342033647fd..073552cab4f 100644
--- a/tests/value/oracle/split_return.0.res.oracle
+++ b/tests/value/oracle/split_return.0.res.oracle
@@ -43,7 +43,7 @@
   Called from tests/value/split_return.i:206.
 [eva] computing for function f3 <- main3 <- main.
   Called from tests/value/split_return.i:73.
-[eva] tests/value/split_return.i:69: f3: cannot properly split on \result == -2
+[eva] tests/value/split_return.i:69: cannot properly split on \result == -2
 [eva] Recording results for f3
 [eva] Done for function f3
 [eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2; 7}, {0; 5}
diff --git a/tests/value/oracle/split_return.1.res.oracle b/tests/value/oracle/split_return.1.res.oracle
index ff8657d99c4..27d86c75523 100644
--- a/tests/value/oracle/split_return.1.res.oracle
+++ b/tests/value/oracle/split_return.1.res.oracle
@@ -83,7 +83,7 @@
   Called from tests/value/split_return.i:135.
 [eva:alarm] tests/value/split_return.i:130: Warning: 
   assertion got status unknown.
-[eva] tests/value/split_return.i:131: f6: cannot properly split on \result == 0
+[eva] tests/value/split_return.i:131: cannot properly split on \result == 0
 [eva] Recording results for f6
 [eva] Done for function f6
 [eva] Recording results for main6
diff --git a/tests/value/oracle/split_return.3.res.oracle b/tests/value/oracle/split_return.3.res.oracle
index bfdd36469af..1ad5a6b9498 100644
--- a/tests/value/oracle/split_return.3.res.oracle
+++ b/tests/value/oracle/split_return.3.res.oracle
@@ -26,12 +26,12 @@
   Called from tests/value/split_return.i:48.
 [eva] Recording results for f2
 [eva] Done for function f2
-[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {7}, {5}
-[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {5}, {5}
 [eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {0}, {0}
+[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {5}, {5}
+[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {7}, {5}
 [eva] tests/value/split_return.i:51: assertion got status valid.
-[eva] tests/value/split_return.i:53: Frama_C_show_each_f2_2: {7}, {5}
 [eva] tests/value/split_return.i:53: Frama_C_show_each_f2_2: {5}, {5}
+[eva] tests/value/split_return.i:53: Frama_C_show_each_f2_2: {7}, {5}
 [eva] tests/value/split_return.i:54: assertion got status valid.
 [eva] Recording results for main2
 [eva] Done for function main2
@@ -41,8 +41,8 @@
   Called from tests/value/split_return.i:73.
 [eva] Recording results for f3
 [eva] Done for function f3
-[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {7}, {5}
+[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:76: assertion got status valid.
 [eva] tests/value/split_return.i:78: assertion got status valid.
 [eva] Recording results for main3
@@ -53,8 +53,8 @@
   Called from tests/value/split_return.i:73.
 [eva] Recording results for f3
 [eva] Done for function f3
-[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {7}, {5}
+[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] Recording results for main3
 [eva] Done for function main3
 [eva] computing for function main4 <- main.
@@ -63,8 +63,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:97: assertion got status valid.
 [eva] tests/value/split_return.i:99: assertion got status valid.
 [eva] Recording results for main4
@@ -75,8 +75,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main4 <- main.
@@ -85,8 +85,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main4 <- main.
@@ -95,8 +95,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main5 <- main.
@@ -105,8 +105,8 @@
   Called from tests/value/split_return.i:117.
 [eva] Recording results for f5
 [eva] Done for function f5
-[eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {-2}, {0}
 [eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {7}, {5}
+[eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {-2}, {0}
 [eva] tests/value/split_return.i:120: assertion got status valid.
 [eva] tests/value/split_return.i:122: assertion got status valid.
 [eva] Recording results for main5
@@ -155,8 +155,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -165,8 +165,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -175,8 +175,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -185,8 +185,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main9 <- main.
diff --git a/tests/value/oracle/split_return.4.res.oracle b/tests/value/oracle/split_return.4.res.oracle
index 060b00fe35e..46c3281323e 100644
--- a/tests/value/oracle/split_return.4.res.oracle
+++ b/tests/value/oracle/split_return.4.res.oracle
@@ -29,12 +29,12 @@
   Called from tests/value/split_return.i:48.
 [eva] Recording results for f2
 [eva] Done for function f2
-[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {7}, {5}
-[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {5}, {5}
 [eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {0}, {0}
+[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {5}, {5}
+[eva] tests/value/split_return.i:49: Frama_C_show_each_f2: {7}, {5}
 [eva] tests/value/split_return.i:51: assertion got status valid.
-[eva] tests/value/split_return.i:53: Frama_C_show_each_f2_2: {7}, {5}
 [eva] tests/value/split_return.i:53: Frama_C_show_each_f2_2: {5}, {5}
+[eva] tests/value/split_return.i:53: Frama_C_show_each_f2_2: {7}, {5}
 [eva] tests/value/split_return.i:54: assertion got status valid.
 [eva] Recording results for main2
 [eva] Done for function main2
@@ -44,8 +44,8 @@
   Called from tests/value/split_return.i:73.
 [eva] Recording results for f3
 [eva] Done for function f3
-[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {7}, {5}
+[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:76: assertion got status valid.
 [eva] tests/value/split_return.i:78: assertion got status valid.
 [eva] Recording results for main3
@@ -56,8 +56,8 @@
   Called from tests/value/split_return.i:73.
 [eva] Recording results for f3
 [eva] Done for function f3
-[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {7}, {5}
+[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] Recording results for main3
 [eva] Done for function main3
 [eva] computing for function main4 <- main.
@@ -66,8 +66,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:97: assertion got status valid.
 [eva] tests/value/split_return.i:99: assertion got status valid.
 [eva] Recording results for main4
@@ -78,8 +78,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main4 <- main.
@@ -88,8 +88,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main4 <- main.
@@ -98,8 +98,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main5 <- main.
@@ -108,8 +108,8 @@
   Called from tests/value/split_return.i:117.
 [eva] Recording results for f5
 [eva] Done for function f5
-[eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {-2}, {0}
 [eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {7}, {5}
+[eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {-2}, {0}
 [eva] tests/value/split_return.i:120: assertion got status valid.
 [eva] tests/value/split_return.i:122: assertion got status valid.
 [eva] Recording results for main5
@@ -158,8 +158,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -168,8 +168,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -178,8 +178,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -188,8 +188,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main9 <- main.
@@ -483,8 +483,8 @@
   Called from tests/value/split_return.i:73.
 [eva] Recording results for f3
 [eva] Done for function f3
-[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {7}, {5}
+[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] Recording results for main3
 [eva] Done for function main3
 [eva] computing for function main3 <- main.
@@ -493,8 +493,8 @@
   Called from tests/value/split_return.i:73.
 [eva] Recording results for f3
 [eva] Done for function f3
-[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {7}, {5}
+[eva] tests/value/split_return.i:74: Frama_C_show_each_f3: {-2}, {0}
 [eva] Recording results for main3
 [eva] Done for function main3
 [eva] computing for function main4 <- main.
@@ -503,8 +503,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main4 <- main.
@@ -513,8 +513,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main4 <- main.
@@ -523,8 +523,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main4 <- main.
@@ -533,8 +533,8 @@
   Called from tests/value/split_return.i:94.
 [eva] Recording results for f4
 [eva] Done for function f4
-[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {4}, {0}
+[eva] tests/value/split_return.i:95: Frama_C_show_each_f4: {7}, {5}
 [eva] Recording results for main4
 [eva] Done for function main4
 [eva] computing for function main5 <- main.
@@ -543,8 +543,8 @@
   Called from tests/value/split_return.i:117.
 [eva] Recording results for f5
 [eva] Done for function f5
-[eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {-2}, {0}
 [eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {7}, {5}
+[eva] tests/value/split_return.i:118: Frama_C_show_each_f5: {-2}, {0}
 [eva] Recording results for main5
 [eva] Done for function main5
 [eva] computing for function main6 <- main.
@@ -589,8 +589,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -599,8 +599,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -609,8 +609,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main8 <- main.
@@ -619,8 +619,8 @@
   Called from tests/value/split_return.i:171.
 [eva] Recording results for f8
 [eva] Done for function f8
-[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {4}, {{ &x }}
+[eva] tests/value/split_return.i:172: Frama_C_show_each_then8: {-1}, {0}
 [eva] Recording results for main8
 [eva] Done for function main8
 [eva] computing for function main9 <- main.
-- 
GitLab