From f4c52851fba0c51fbacd82e3c249d7b5deb94338 Mon Sep 17 00:00:00 2001 From: Nikos Gorogiannis Date: Wed, 9 Dec 2020 09:30:12 -0800 Subject: [PATCH] [ondemand] remove ref to execution environment Summary: Whenever the interface functions are called, there is always an execution environment present, so it is safer and better to get rid of the setter/getter reference thing. Reviewed By: jvillard Differential Revision: D25421335 fbshipit-source-id: 7110c932b --- infer/src/backend/CallbackOfChecker.ml | 6 +-- infer/src/backend/StarvationGlobalAnalysis.ml | 2 +- infer/src/backend/ondemand.ml | 44 +++++++------------ infer/src/backend/ondemand.mli | 19 ++++---- infer/src/unit/TaintTests.ml | 2 - 5 files changed, 29 insertions(+), 44 deletions(-) diff --git a/infer/src/backend/CallbackOfChecker.ml b/infer/src/backend/CallbackOfChecker.ml index 47d0920f6..5406765c3 100644 --- a/infer/src/backend/CallbackOfChecker.ml +++ b/infer/src/backend/CallbackOfChecker.ml @@ -19,12 +19,12 @@ let () = let mk_interprocedural_t ~f_analyze_dep ~f_analyze_pdesc_dep ~get_payload exe_env summary ?(tenv = Exe_env.get_tenv exe_env (Summary.get_proc_name summary)) () = let analyze_dependency proc_name = - let summary = Ondemand.analyze_proc_name ~caller_summary:summary proc_name in + let summary = Ondemand.analyze_proc_name exe_env ~caller_summary:summary proc_name in Option.bind summary ~f:(fun {Summary.payloads; proc_desc; _} -> f_analyze_dep proc_desc (get_payload payloads) ) in let analyze_pdesc_dependency proc_desc = - let summary = Ondemand.analyze_proc_desc ~caller_summary:summary proc_desc in + let summary = Ondemand.analyze_proc_desc exe_env ~caller_summary:summary proc_desc in Option.bind summary ~f:(fun {Summary.payloads; _} -> f_analyze_pdesc_dep (get_payload payloads)) in let stats = ref summary.Summary.stats in @@ -65,7 +65,7 @@ let interprocedural_with_field payload_field checker {Callbacks.summary; exe_env let interprocedural_file payload_field checker {Callbacks.procedures; exe_env; source_file} = let analyze_file_dependency proc_name = - let summary = Ondemand.analyze_proc_name_no_caller proc_name in + let summary = Ondemand.analyze_proc_name_no_caller exe_env proc_name in Option.bind summary ~f:(fun {Summary.payloads; proc_desc; _} -> Field.get payload_field payloads |> Option.map ~f:(fun payload -> (proc_desc, payload)) ) in diff --git a/infer/src/backend/StarvationGlobalAnalysis.ml b/infer/src/backend/StarvationGlobalAnalysis.ml index 944b67372..48853fe41 100644 --- a/infer/src/backend/StarvationGlobalAnalysis.ml +++ b/infer/src/backend/StarvationGlobalAnalysis.ml @@ -71,7 +71,7 @@ let report exe_env work_set = let acc = Starvation.report_on_pair ~analyze_ondemand:(fun pname -> - Ondemand.analyze_proc_name ~caller_summary:summary pname + Ondemand.analyze_proc_name exe_env ~caller_summary:summary pname |> Option.bind ~f:(fun summary -> Option.map summary.Summary.payloads.starvation ~f:(fun starvation -> (Summary.get_proc_desc summary, starvation) ) ) ) diff --git a/infer/src/backend/ondemand.ml b/infer/src/backend/ondemand.ml index 4c2c5a11a..5d5b0b2d7 100644 --- a/infer/src/backend/ondemand.ml +++ b/infer/src/backend/ondemand.ml @@ -12,8 +12,6 @@ open! IStd module L = Logging module F = Format -let exe_env_ref = ref None - module LocalCache = struct let results = lazy @@ -36,10 +34,6 @@ module LocalCache = struct Procname.LRUHash.replace (Lazy.force results) proc_name summary_option end -let set_exe_env (env : Exe_env.t) = exe_env_ref := Some env - -let unset_exe_env () = exe_env_ref := None - (* always incremented before use *) let nesting = ref (-1) @@ -156,14 +150,13 @@ let update_taskbar callee_pdesc = !ProcessPoolState.update_status t0 status -let analyze callee_summary = - let exe_env = Option.value_exn !exe_env_ref in +let analyze exe_env callee_summary = let summary = Callbacks.iterate_procedure_callbacks exe_env callee_summary in BackendStats.incr_ondemand_procs_analyzed () ; summary -let run_proc_analysis ~caller_pdesc callee_pdesc = +let run_proc_analysis exe_env ~caller_pdesc callee_pdesc = let callee_pname = Procdesc.get_proc_name callee_pdesc in let log_elapsed_time = let start_time = Mtime_clock.counter () in @@ -179,7 +172,7 @@ let run_proc_analysis ~caller_pdesc callee_pdesc = let preprocess () = incr nesting ; update_taskbar callee_pdesc ; - Preanal.do_preanalysis (Option.value_exn !exe_env_ref) callee_pdesc ; + Preanal.do_preanalysis exe_env callee_pdesc ; if Config.debug_mode then DotCfg.emit_proc_desc (Procdesc.get_attributes callee_pdesc).translation_unit callee_pdesc |> ignore ; @@ -216,7 +209,7 @@ let run_proc_analysis ~caller_pdesc callee_pdesc = let attributes = Procdesc.get_attributes callee_pdesc in try let callee_summary = - if attributes.ProcAttributes.is_defined then analyze initial_callee_summary + if attributes.ProcAttributes.is_defined then analyze exe_env initial_callee_summary else initial_callee_summary in let final_callee_summary = postprocess callee_summary in @@ -254,14 +247,14 @@ let run_proc_analysis ~caller_pdesc callee_pdesc = (* shadowed for tracing *) -let run_proc_analysis ~caller_pdesc callee_pdesc = +let run_proc_analysis exe_env ~caller_pdesc callee_pdesc = PerfEvent.( log (fun logger -> let callee_pname = Procdesc.get_proc_name callee_pdesc in log_begin_event logger ~name:"ondemand" ~categories:["backend"] ~arguments:[("proc", `String (Procname.to_string callee_pname))] () )) ; - let summary = run_proc_analysis ~caller_pdesc callee_pdesc in + let summary = run_proc_analysis exe_env ~caller_pdesc callee_pdesc in PerfEvent.(log (fun logger -> log_end_event logger ())) ; summary @@ -334,7 +327,7 @@ let get_callee_proc_desc = function get_proc_desc proc_name -let analyze_callee ?caller_summary callee = +let analyze_callee exe_env ?caller_summary callee = let callee_pname = proc_name_of_callee callee in register_callee ?caller_summary callee_pname ; if is_active callee_pname then None @@ -349,7 +342,7 @@ let analyze_callee ?caller_summary callee = | Some callee_pdesc -> RestartScheduler.lock_exn callee_pname ; let callee_summary = - run_proc_analysis + run_proc_analysis exe_env ~caller_pdesc:(Option.map ~f:Summary.get_proc_desc caller_summary) callee_pdesc in @@ -363,39 +356,36 @@ let analyze_callee ?caller_summary callee = summ_opt -let analyze_proc_desc ~caller_summary callee_pdesc = - analyze_callee ~caller_summary (ProcDesc callee_pdesc) +let analyze_proc_desc exe_env ~caller_summary callee_pdesc = + analyze_callee exe_env ~caller_summary (ProcDesc callee_pdesc) -let analyze_proc_name ~caller_summary callee_pname = - analyze_callee ~caller_summary (ProcName callee_pname) +let analyze_proc_name exe_env ~caller_summary callee_pname = + analyze_callee exe_env ~caller_summary (ProcName callee_pname) -let analyze_proc_name_no_caller callee_pname = - analyze_callee ?caller_summary:None (ProcName callee_pname) +let analyze_proc_name_no_caller exe_env callee_pname = + analyze_callee exe_env ?caller_summary:None (ProcName callee_pname) let analyze_procedures exe_env procs_to_analyze source_file_opt = let saved_language = !Language.curr_language in - set_exe_env exe_env ; let analyze_proc_name_call pname = - ignore (analyze_proc_name_no_caller pname : Summary.t option) + ignore (analyze_proc_name_no_caller exe_env pname : Summary.t option) in List.iter ~f:analyze_proc_name_call procs_to_analyze ; Option.iter source_file_opt ~f:(fun source_file -> if Config.dump_duplicate_symbols then dump_duplicate_procs source_file procs_to_analyze ) ; Option.iter source_file_opt ~f:(fun source_file -> Callbacks.iterate_file_callbacks_and_store_issues procs_to_analyze exe_env source_file ) ; - unset_exe_env () ; Language.curr_language := saved_language (** Invoke all procedure-level and file-level callbacks on a given environment. *) -let analyze_file (exe_env : Exe_env.t) source_file = +let analyze_file exe_env source_file = let procs_to_analyze = SourceFiles.proc_names_of_source source_file in analyze_procedures exe_env procs_to_analyze (Some source_file) (** Invoke procedure callbacks on a given environment. *) -let analyze_proc_name_toplevel (exe_env : Exe_env.t) proc_name = - analyze_procedures exe_env [proc_name] None +let analyze_proc_name_toplevel exe_env proc_name = analyze_procedures exe_env [proc_name] None diff --git a/infer/src/backend/ondemand.mli b/infer/src/backend/ondemand.mli index 4e666e45d..5bf3138f2 100644 --- a/infer/src/backend/ondemand.mli +++ b/infer/src/backend/ondemand.mli @@ -12,21 +12,18 @@ open! IStd val get_proc_desc : Procname.t -> Procdesc.t option (** Find a proc desc for the procedure, perhaps loading it from disk. *) -val analyze_proc_desc : caller_summary:Summary.t -> Procdesc.t -> Summary.t option -(** [analyze_proc_desc ~caller_summary callee_pdesc] performs an on-demand analysis of +val analyze_proc_desc : Exe_env.t -> caller_summary:Summary.t -> Procdesc.t -> Summary.t option +(** [analyze_proc_desc exe_env ~caller_summary callee_pdesc] performs an on-demand analysis of [callee_pdesc] triggered during the analysis of [caller_summary] *) -val analyze_proc_name : caller_summary:Summary.t -> Procname.t -> Summary.t option -(** [analyze_proc_name ~caller_summary callee_pname] performs an on-demand analysis of +val analyze_proc_name : Exe_env.t -> caller_summary:Summary.t -> Procname.t -> Summary.t option +(** [analyze_proc_name exe_env ~caller_summary callee_pname] performs an on-demand analysis of [callee_pname] triggered during the analysis of [caller_summary] *) -val analyze_proc_name_no_caller : Procname.t -> Summary.t option -(** [analyze_proc_name_no_caller callee_pname] performs an on-demand analysis of [callee_pname] - triggered by the top-level of a file-level checker. This must not be used in any other context, - as this will break incremental analysis. *) - -val set_exe_env : Exe_env.t -> unit -(** Set the execution enviroment used during on-demand analysis. *) +val analyze_proc_name_no_caller : Exe_env.t -> Procname.t -> Summary.t option +(** [analyze_proc_name_no_caller exe_env callee_pname] performs an on-demand analysis of + [callee_pname] triggered by the top-level of a file-level checker. This must not be used in any + other context, as this will break incremental analysis. *) module LocalCache : sig val clear : unit -> unit diff --git a/infer/src/unit/TaintTests.ml b/infer/src/unit/TaintTests.ml index 37939a0b2..9e5b5332c 100644 --- a/infer/src/unit/TaintTests.ml +++ b/infer/src/unit/TaintTests.ml @@ -114,8 +114,6 @@ let tests = make_load_fld ~rhs_typ:StdTyp.void lhs_id_str fld_str (Exp.Var (ident_of_str root_str)) in let assert_empty = invariant "{ }" in - let exe_env = Exe_env.mk () in - Ondemand.set_exe_env exe_env ; let test_list = [ ("source recorded", [assign_to_source "ret_id"; invariant "{ ret_id$0* => (SOURCE -> ?) }"]) ; ("non-source not recorded", [assign_to_non_source "ret_id"; assert_empty])