From f6ef864dd09a088212606c0404237bdaf9759b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Mon, 21 Feb 2022 16:40:01 +0100 Subject: [PATCH] [Eva] Iterator: save results according to [Function_calls.define_analysis_target]. --- src/plugins/value/engine/compute_functions.ml | 10 ++++++---- src/plugins/value/engine/function_calls.mli | 3 ++- src/plugins/value/engine/iterator.ml | 10 +++++----- src/plugins/value/engine/iterator.mli | 1 + 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/plugins/value/engine/compute_functions.ml b/src/plugins/value/engine/compute_functions.ml index 3f88ff3f854..58a7232b07e 100644 --- a/src/plugins/value/engine/compute_functions.ml +++ b/src/plugins/value/engine/compute_functions.ml @@ -212,8 +212,8 @@ module Make (Abstract: Abstractions.Eva) = struct (* Interprets a [call] at callsite [kinstr] in the state [state] by analyzing the body of the called function. *) - let compute_using_body fundec kinstr call state = - let result = Computer.compute call.kf kinstr state in + let compute_using_body fundec ~save_results kinstr call state = + let result = Computer.compute ~save_results call.kf kinstr state in Summary.FunctionStats.recompute fundec; result @@ -246,8 +246,10 @@ module Make (Abstract: Abstractions.Eva) = struct let call_stack = Eva_utils.call_stack () in let compute, kind = match target with - | `Def (fundec, _) -> compute_using_body fundec, `Def - | `Spec funspec -> compute_using_spec funspec, `Spec funspec + | `Def (fundec, save_results) -> + compute_using_body fundec ~save_results, `Def + | `Spec funspec -> + compute_using_spec funspec, `Spec funspec in Db.Value.Call_Type_Value_Callbacks.apply (kind, cvalue_state, call_stack); let resulting_states, cacheable = compute kinstr call state in diff --git a/src/plugins/value/engine/function_calls.mli b/src/plugins/value/engine/function_calls.mli index 3cf91982cc0..7a9cfcdc4fc 100644 --- a/src/plugins/value/engine/function_calls.mli +++ b/src/plugins/value/engine/function_calls.mli @@ -25,7 +25,8 @@ open Cil_types (** What is used for the analysis of a given function: - a Cvalue builtin (and other domains use the specification) - the function specification - - the function body. *) + - the function body. The boolean indicates whether the resulting states + must be recorded at each statement of this function. *) type analysis_target = [ `Builtin of string * Builtins.builtin * Eval.cacheable * funspec | `Spec of Cil_types.funspec diff --git a/src/plugins/value/engine/iterator.ml b/src/plugins/value/engine/iterator.ml index d9d50612ebb..3be91801bcb 100644 --- a/src/plugins/value/engine/iterator.ml +++ b/src/plugins/value/engine/iterator.ml @@ -667,7 +667,7 @@ module Make_Dataflow ); states_after - let merge_results () = + let merge_results ~save_results = let get_merged_states = let merged_states = VertexTable.create control_point_count and get_smashed_store v = @@ -700,7 +700,7 @@ module Make_Dataflow let merged_pre_cvalues = lazy (lift_to_cvalues merged_pre_states) and merged_post_cvalues = lazy (lift_to_cvalues merged_post_states) in let callstack = Eva_utils.call_stack () in - if Mark_noresults.should_memorize_function fundec then begin + if save_results then begin let register_pre = Domain.Store.register_state_before_stmt callstack and register_post = Domain.Store.register_state_after_stmt callstack in StmtTable.iter register_pre (Lazy.force merged_pre_states); @@ -762,7 +762,7 @@ module Computer end) = struct - let compute kf call_kinstr state = + let compute ~save_results kf call_kinstr state = let module Dataflow = Make_Dataflow (Abstract) (States) (Transfer) (Init) (Logic) (Spec) @@ -778,7 +778,7 @@ module Computer if Parameters.ValShowProgress.get () then Self.feedback "Recording results for %a" Kernel_function.pretty kf; - Dataflow.merge_results (); + Dataflow.merge_results ~save_results; let f = Kernel_function.get_definition kf in if Cil.hasAttribute "noreturn" f.svar.vattr && results <> [] then Eva_utils.warning_once_current @@ -788,7 +788,7 @@ module Computer in let cleanup () = Dataflow.mark_degeneration (); - Dataflow.merge_results () + Dataflow.merge_results ~save_results in Eva_utils.protect compute ~cleanup end diff --git a/src/plugins/value/engine/iterator.mli b/src/plugins/value/engine/iterator.mli index 81c8cc65844..47ca49314a2 100644 --- a/src/plugins/value/engine/iterator.mli +++ b/src/plugins/value/engine/iterator.mli @@ -44,6 +44,7 @@ module Computer : sig val compute: + save_results:bool -> kernel_function -> kinstr -> Abstract.Dom.t -> (Partition.key * Abstract.Dom.t) list * Eval.cacheable -- GitLab