From 501b9bd40ea396a099e70fad5a4924e07e10d518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Tue, 19 Oct 2021 10:04:59 +0200 Subject: [PATCH] [Eva] Adds function [call_return] to trace_partitioning.ml Called from the iterator; removes [call_return_policy] from iterator.ml. In partition.ml, renames [recombine] to [combine]. --- src/plugins/value/engine/iterator.ml | 8 +++----- src/plugins/value/partitioning/partition.ml | 2 +- src/plugins/value/partitioning/partition.mli | 4 ++-- src/plugins/value/partitioning/trace_partitioning.ml | 4 ++++ src/plugins/value/partitioning/trace_partitioning.mli | 6 ++++++ 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/plugins/value/engine/iterator.ml b/src/plugins/value/engine/iterator.ml index 31bf7543394..773be0b00ab 100644 --- a/src/plugins/value/engine/iterator.ml +++ b/src/plugins/value/engine/iterator.ml @@ -88,10 +88,9 @@ module Make_Dataflow (* Ideally, the slevel parameter should not be used anymore in this file but it is still required for logic interpretation *) - let slevel, call_return_policy = + let slevel = let module P = Partitioning_parameters.Make (AnalysisParam) in - P.slevel, - P.call_return_policy + P.slevel (* --- Abstract values storage --- *) @@ -282,8 +281,7 @@ module Make_Dataflow (* Propagate info that the current call cannot be cached either *) cacheable := Eval.NoCacheCallers; (* Recombine callee partitioning keys with caller key *) - let recombine = Partition.Key.recombine ~policy:call_return_policy in - List.map (fun (k, s) -> recombine ~caller:key ~callee:k, s) result + Partitioning.call_return ~caller:key result let transfer_instr (stmt : stmt) (instr : instr) : transfer_function = match instr with diff --git a/src/plugins/value/partitioning/partition.ml b/src/plugins/value/partitioning/partition.ml index 7ff3a9f7843..91f40d87ad3 100644 --- a/src/plugins/value/partitioning/partition.ml +++ b/src/plugins/value/partitioning/partition.ml @@ -247,7 +247,7 @@ struct let exceed_rationing key = key.ration_stamp = None - let recombine ~policy ~caller ~callee = + let combine ~policy ~caller ~callee = let keep_second _ v1 v2 = match v1, v2 with | None, None -> None diff --git a/src/plugins/value/partitioning/partition.mli b/src/plugins/value/partitioning/partition.mli index 7ef819e2a77..8ac9926955e 100644 --- a/src/plugins/value/partitioning/partition.mli +++ b/src/plugins/value/partitioning/partition.mli @@ -52,8 +52,8 @@ module Key : sig include Datatype.S_with_collections with type t = key val zero : t (** Initial key: no partitioning. *) val exceed_rationing: t -> bool - val recombine : policy:call_return_policy -> - caller:t -> callee:t -> t (** Recombinaison of keys after a call *) + val combine : policy:call_return_policy -> caller:t -> callee:t -> t + (** Recombinaison of keys after a call *) end (** Collection of states, each identified by a unique key. *) diff --git a/src/plugins/value/partitioning/trace_partitioning.ml b/src/plugins/value/partitioning/trace_partitioning.ml index b07eaa7ca62..61f2b7a458f 100644 --- a/src/plugins/value/partitioning/trace_partitioning.ml +++ b/src/plugins/value/partitioning/trace_partitioning.ml @@ -175,6 +175,10 @@ struct then apply (Restrict (return_exp, i)) else apply (Ration empty_rationing) + let call_return ~caller result = + let combine = Partition.Key.combine ~policy:call_return_policy in + List.map (fun (k, s) -> combine ~caller ~callee:k, s) result + (* Reset state (for hierchical convergence) *) let reset_store (s : store) : unit = diff --git a/src/plugins/value/partitioning/trace_partitioning.mli b/src/plugins/value/partitioning/trace_partitioning.mli index 5c208d99b80..dbdd548600b 100644 --- a/src/plugins/value/partitioning/trace_partitioning.mli +++ b/src/plugins/value/partitioning/trace_partitioning.mli @@ -81,6 +81,12 @@ sig val next_loop_iteration : flow -> Cil_types.stmt -> flow val split_return : flow -> Cil_types.exp option -> flow + (** After the analysis of a function call, recombines callee partitioning keys + with the caller key. *) + val call_return: + caller:Partition.key -> + (Partition.key * state) list -> (Partition.key * state) list + (* --- Operators --- *) (** Remove all states from the tank, leaving it empty as if it was just -- GitLab