diff --git a/src/kernel_services/plugin_entry_points/db.ml b/src/kernel_services/plugin_entry_points/db.ml index 960480c8c2213503cd308d9f11b65c155181286a..469c3aed3c67d646755540143018f65cd1bdd9bf 100644 --- a/src/kernel_services/plugin_entry_points/db.ml +++ b/src/kernel_services/plugin_entry_points/db.ml @@ -219,12 +219,7 @@ module Value = struct if VGlobals.get_option () <> None then (!initial_state_changed (); VGlobals.clear ()) - let initial_state_only_globals = mk_fun "Value.initial_state_only_globals" - - let globals_state () = - match VGlobals.get_option () with - | Some v -> v - | None -> !initial_state_only_globals () + let globals_state () = VGlobals.get_option () let globals_use_supplied_state () = not (VGlobals.get_option () = None) diff --git a/src/kernel_services/plugin_entry_points/db.mli b/src/kernel_services/plugin_entry_points/db.mli index d664470b29dc0bf994ede598f40ea3c6c112e3c7..9344f5d1c2421c7bb61aad31f5bb8a84ddcae841 100644 --- a/src/kernel_services/plugin_entry_points/db.mli +++ b/src/kernel_services/plugin_entry_points/db.mli @@ -161,8 +161,8 @@ module Value : sig val globals_use_default_initial_state : unit -> unit - (** Initial state used by the analysis *) - val globals_state : unit -> state + (** Initial state provided by [globals_set_initial_state], if any. *) + val globals_state : unit -> state option (** @return [true] if the initial state for globals used by the value @@ -174,9 +174,6 @@ module Value : sig (**/**) (** {3 Internal use only} *) - - val initial_state_only_globals : (unit -> state) ref - val initial_state_changed: (unit -> unit) ref end [@@alert db_deprecated diff --git a/src/plugins/eva/engine/analysis.ml b/src/plugins/eva/engine/analysis.ml index 6bbfef27ba4dc1a948398cb182431dd2c0fda689..06aa0bce44b1c7290400f61d59edf71f381e680d 100644 --- a/src/plugins/eva/engine/analysis.ml +++ b/src/plugins/eva/engine/analysis.ml @@ -88,7 +88,6 @@ module type Analyzer = sig include S val compute_from_entry_point : kernel_function -> lib_entry:bool -> unit (* val compute_from_init_state: kernel_function -> Dom.t -> unit *) - val initial_state: lib_entry:bool -> Dom.t or_bottom end @@ -181,14 +180,6 @@ let set_current_analyzer config (analyzer: (module Analyzer)) = Analyzer_Hook.apply (module (val analyzer): S); ref_analyzer := (config, analyzer) -let cvalue_initial_state () = - let module A = (val snd !ref_analyzer) in - let module G = (Cvalue_domain.Getters (A.Dom)) in - let _, lib_entry = Globals.entry_point () in - G.get_cvalue_or_bottom (A.initial_state ~lib_entry) - -let () = Db.Value.initial_state_only_globals := cvalue_initial_state - (* Builds the Analyzer module corresponding to a given configuration, and sets it as the current analyzer. *) let make_analyzer config = diff --git a/src/plugins/eva/engine/compute_functions.ml b/src/plugins/eva/engine/compute_functions.ml index d46426ab057153674119cfb4d418b2a8db790894..59f8a8d9a4e6c3e74a00fbc6427d09371995da74 100644 --- a/src/plugins/eva/engine/compute_functions.ml +++ b/src/plugins/eva/engine/compute_functions.ml @@ -167,8 +167,6 @@ module Make (Abstract: Abstractions.S_with_evaluation) = struct include Cvalue_domain.Getters (Abstract.Dom) - let initial_state = Init.initial_state - let get_cval = match Abstract.Val.get Main_values.CVal.key with | None -> fun _ -> assert false diff --git a/src/plugins/eva/engine/compute_functions.mli b/src/plugins/eva/engine/compute_functions.mli index 28f78965dbb2d54008aabe51674bbf084a49f3d8..b582766632a43768abdd5399173249071a265a5f 100644 --- a/src/plugins/eva/engine/compute_functions.mli +++ b/src/plugins/eva/engine/compute_functions.mli @@ -23,7 +23,6 @@ (** Value analysis of entire functions, using Eva engine. *) open Cil_types -open Eval module Make (Abstract: Abstractions.S_with_evaluation) : sig @@ -33,6 +32,4 @@ module Make (Abstract: Abstractions.S_with_evaluation) (** Compute a call to the main function from the given initial state. *) val compute_from_init_state: kernel_function -> Abstract.Dom.t -> unit - - val initial_state: lib_entry:bool -> Abstract.Dom.t or_bottom end diff --git a/src/plugins/eva/engine/initialization.ml b/src/plugins/eva/engine/initialization.ml index da1ac7627c24ad6b1b39e6b09f7803ba7d6ec3e7..572cbf09e68f68d596b6f7faf98bd48d29ba6b32 100644 --- a/src/plugins/eva/engine/initialization.ml +++ b/src/plugins/eva/engine/initialization.ml @@ -27,7 +27,6 @@ open Eval module type S = sig type state - val initial_state : lib_entry:bool -> state or_bottom val initial_state_with_formals : lib_entry:bool -> kernel_function -> state or_bottom val initialize_local_variable: @@ -357,19 +356,13 @@ module Make InitialState.memo (compute_global_state ~lib_entry) (* The global cvalue state may be supplied by the user. *) - let supplied_state () = - let cvalue_state = Db.Value.globals_state () in + let supplied_state cvalue_state = if Cvalue.Model.is_reachable cvalue_state then let cvalue_state = cvalue_state, Locals_scoping.bottom () in `Value (Domain.set Cvalue_domain.State.key cvalue_state Domain.top) else `Bottom - let initial_state ~lib_entry = - if Db.Value.globals_use_supplied_state () - then supplied_state () - else global_state ~lib_entry - let print_initial_cvalue_state state = let cvalue_state = get_cvalue_or_bottom state in (* Do not show variables from the frama-c libc specifications. *) @@ -391,18 +384,16 @@ module Make let initial_state_with_formals ~lib_entry kf = let init_state = - if Db.Value.globals_use_supplied_state () - then begin + match Db.Value.globals_state () with + | Some state -> Self.feedback "Initial state supplied by user"; - supplied_state () - end - else begin + supplied_state state + | None -> let pp = Parameters.ValShowProgress.get () in if pp then Self.feedback "Computing initial state"; let state = global_state ~lib_entry in if pp then Self.feedback "Initial state computed"; state - end in let b = Parameters.ResultsAll.get () in Domain.Store.register_global_state b init_state; diff --git a/src/plugins/eva/engine/initialization.mli b/src/plugins/eva/engine/initialization.mli index 872206abe61796ac482a107efdd3d344668ca87b..e669a8df56c486c4751b7ac4bf798c12b02af7c2 100644 --- a/src/plugins/eva/engine/initialization.mli +++ b/src/plugins/eva/engine/initialization.mli @@ -28,11 +28,6 @@ open Lattice_bounds module type S = sig type state - (** Compute the initial state for an analysis. The initial state is generated - according to the options of Value governing the shape of this state. - All global variables are bound in the resulting abstract state. *) - val initial_state : lib_entry:bool -> state or_bottom - (** Compute the initial state for an analysis (as in {!initial_state}), but also bind the formal parameters of the function given as argument. *) val initial_state_with_formals : diff --git a/src/plugins/eva/legacy/eval_terms.ml b/src/plugins/eva/legacy/eval_terms.ml index 72e58f5421a151d2c5301def1d89ad7c9cf0fb2a..0eceb70bf4872593ecfed55d2ff0353f4261d740 100644 --- a/src/plugins/eva/legacy/eval_terms.ml +++ b/src/plugins/eva/legacy/eval_terms.ml @@ -238,8 +238,10 @@ let add_pre = add_logic Logic_const.pre_label let add_post = add_logic Logic_const.post_label let add_old = add_logic Logic_const.old_label (* Init is a bit special, it is constant and always added to the initial state*) -let add_init state = - add_logic Logic_const.init_label (Db.Value.globals_state ()) state +let add_init states = + match Cvalue_results.get_global_state () with + | `Bottom -> states + | `Value state -> add_logic Logic_const.init_label state states let add_logic_var env lv cvalue = { env with logic_vars = LogicVarEnv.add lv cvalue env.logic_vars } diff --git a/src/plugins/eva/utils/eva_results.ml b/src/plugins/eva/utils/eva_results.ml index 606158151f651cc2197e55f78b3b4b26ecfc1ca4..c3fb17411b706d2443c641eba774e10adc141a01 100644 --- a/src/plugins/eva/utils/eva_results.ml +++ b/src/plugins/eva/utils/eva_results.ml @@ -57,7 +57,7 @@ type results = { after_states: stmt_by_callstack Stmt.Hashtbl.t; kf_initial_states: stmt_by_callstack Kernel_function.Hashtbl.t; kf_callers: Function_calls.t; - initial_state: Cvalue.Model.t; + initial_state: Cvalue.Model.t Lattice_bounds.or_bottom; initial_args: Cvalue.V.t list option; alarms: Property_status.emitted_status AlarmsStmt.Hashtbl.t; statuses: Property_status.emitted_status Property.Hashtbl.t @@ -93,7 +93,7 @@ let get_results () = in Globals.Functions.iter copy_kf; let kf_callers = Function_calls.get_results () in - let initial_state = Db.Value.globals_state () in + let initial_state = Cvalue_results.get_global_state () in let initial_args = Db.Value.fun_get_args () in let aux_statuses f_status ip = let aux_any_status e status = @@ -133,7 +133,7 @@ let set_results results = Project.clear ~selection (); (* Those two functions may clear Self.state. Start by them *) (* Initial state *) - Db.Value.globals_set_initial_state results.initial_state; + Cvalue_results.register_global_state true results.initial_state; (* Initial args *) begin match results.initial_args with | None -> Db.Value.fun_use_default_args () @@ -254,7 +254,9 @@ let merge r1 r2 = let kf_callers = Function_calls.merge_results r1.kf_callers r2.kf_callers in let alarms = AlarmsStmtH.merge merge_statuses r1.alarms r2.alarms in let statuses = PropertyH.merge merge_statuses r1.statuses r2.statuses in - let initial_state = Cvalue.Model.join r1.initial_state r2.initial_state in + let initial_state = + Lattice_bounds.Bottom.join Cvalue.Model.join r1.initial_state r2.initial_state + in let initial_args = match main, r1.initial_args, r2.initial_args with | None, _, _ | _, None, _ | _, _, None -> None