From 8c4b212545078e6ef9b7d1e46ac698967f6e3910 Mon Sep 17 00:00:00 2001 From: Nikos Gorogiannis Date: Wed, 9 Dec 2020 09:30:31 -0800 Subject: [PATCH] [ondemand] kill analyze_proc_desc Summary: The Ondemand entry point `analyze_proc_desc` exists purely to support specialisation under biabduction. After fixing the storing of specialised `proc_desc`s for java it suffices to use `analyze_proc_name` which will work just fine in its place. Reviewed By: jvillard Differential Revision: D25421763 fbshipit-source-id: b162feec3 --- infer/src/IR/SpecializeProcdesc.ml | 5 +-- infer/src/absint/InterproceduralAnalysis.ml | 7 +--- infer/src/absint/InterproceduralAnalysis.mli | 2 -- infer/src/backend/CallbackOfChecker.ml | 14 +++----- infer/src/backend/CallbackOfChecker.mli | 1 - infer/src/backend/ondemand.ml | 38 +++----------------- infer/src/backend/ondemand.mli | 4 --- infer/src/backend/registerCheckers.ml | 2 -- infer/src/biabduction/SymExec.ml | 7 ++-- 9 files changed, 14 insertions(+), 66 deletions(-) diff --git a/infer/src/IR/SpecializeProcdesc.ml b/infer/src/IR/SpecializeProcdesc.ml index 25873991e..1c340d411 100644 --- a/infer/src/IR/SpecializeProcdesc.ml +++ b/infer/src/IR/SpecializeProcdesc.ml @@ -166,8 +166,5 @@ let with_formals_types callee_pdesc resolved_pname args = in let resolved_proc_desc = Procdesc.from_proc_attributes resolved_attributes in let resolved_proc_desc = with_formals_types_proc callee_pdesc resolved_proc_desc substitutions in - (* The attributes here are used to retrieve the per-file type environment for Clang languages. - The analysis for Java is using a global type environment *) - if not (Procname.is_java resolved_pname) then - Attributes.store ~proc_desc:(Some resolved_proc_desc) resolved_attributes ; + Attributes.store ~proc_desc:(Some resolved_proc_desc) resolved_attributes ; resolved_proc_desc diff --git a/infer/src/absint/InterproceduralAnalysis.ml b/infer/src/absint/InterproceduralAnalysis.ml index 702dfe4ba..62c8eb8fa 100644 --- a/infer/src/absint/InterproceduralAnalysis.ml +++ b/infer/src/absint/InterproceduralAnalysis.ml @@ -13,7 +13,6 @@ type 'payload t = ; err_log: Errlog.t ; exe_env: Exe_env.t ; analyze_dependency: Procname.t -> (Procdesc.t * 'payload) option - ; analyze_pdesc_dependency: Procdesc.t -> 'payload option ; update_stats: ?add_symops:int -> ?failure_kind:SymOp.failure_kind -> unit -> unit } type 'payload file_t = @@ -28,8 +27,4 @@ let bind_payload ~f analysis_data = (fun proc_name -> analysis_data.analyze_dependency proc_name |> Option.bind ~f:(fun (proc_desc, payloads) -> - Option.map (f payloads) ~f:(fun payloads' -> (proc_desc, payloads')) ) ) - ; analyze_pdesc_dependency= - (fun proc_desc -> - analysis_data.analyze_pdesc_dependency proc_desc - |> Option.bind ~f:(fun payloads -> f payloads) ) } + Option.map (f payloads) ~f:(fun payloads' -> (proc_desc, payloads')) ) ) } diff --git a/infer/src/absint/InterproceduralAnalysis.mli b/infer/src/absint/InterproceduralAnalysis.mli index 006fd4ef0..da7129eae 100644 --- a/infer/src/absint/InterproceduralAnalysis.mli +++ b/infer/src/absint/InterproceduralAnalysis.mli @@ -20,8 +20,6 @@ type 'payload t = ; analyze_dependency: Procname.t -> (Procdesc.t * 'payload) option (** On-demand analysis of callees or other dependencies of the analysis of the current procedure. Uses [Ondemand.analyze_procedure]. *) - ; analyze_pdesc_dependency: Procdesc.t -> 'payload option - (** same as above when we already know the {!Procdesc.t} *) ; update_stats: ?add_symops:int -> ?failure_kind:SymOp.failure_kind -> unit -> unit (** update the [Summary.Stats.t] of the summary of the current procedure *) } diff --git a/infer/src/backend/CallbackOfChecker.ml b/infer/src/backend/CallbackOfChecker.ml index 5406765c3..4cfc01b03 100644 --- a/infer/src/backend/CallbackOfChecker.ml +++ b/infer/src/backend/CallbackOfChecker.ml @@ -16,17 +16,13 @@ let () = ; proc_resolve_attributes_f= Summary.OnDisk.proc_resolve_attributes } -let mk_interprocedural_t ~f_analyze_dep ~f_analyze_pdesc_dep ~get_payload exe_env summary +let mk_interprocedural_t ~f_analyze_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 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 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 let update_stats ?add_symops ?failure_kind () = stats := Summary.Stats.update ?add_symops ?failure_kind !stats @@ -36,7 +32,6 @@ let mk_interprocedural_t ~f_analyze_dep ~f_analyze_pdesc_dep ~get_payload exe_en ; err_log= Summary.get_err_log summary ; exe_env ; analyze_dependency - ; analyze_pdesc_dependency ; update_stats } , stats ) @@ -45,13 +40,12 @@ let mk_interprocedural_field_t payload_field exe_env summary = mk_interprocedural_t ~f_analyze_dep:(fun pdesc payload_opt -> Option.map payload_opt ~f:(fun payload -> (pdesc, payload)) ) - ~f_analyze_pdesc_dep:Fn.id ~get_payload:(Field.get payload_field) exe_env summary + ~get_payload:(Field.get payload_field) exe_env summary -let interprocedural ~f_analyze_dep ~f_analyze_pdesc_dep ~get_payload ~set_payload checker - {Callbacks.summary; exe_env} = +let interprocedural ~f_analyze_dep ~get_payload ~set_payload checker {Callbacks.summary; exe_env} = let analysis_data, stats_ref = - mk_interprocedural_t ~f_analyze_dep ~f_analyze_pdesc_dep ~get_payload exe_env summary () + mk_interprocedural_t ~f_analyze_dep ~get_payload exe_env summary () in let result = checker analysis_data in {summary with payloads= set_payload summary.payloads result; stats= !stats_ref} diff --git a/infer/src/backend/CallbackOfChecker.mli b/infer/src/backend/CallbackOfChecker.mli index b927f22b5..b56f43164 100644 --- a/infer/src/backend/CallbackOfChecker.mli +++ b/infer/src/backend/CallbackOfChecker.mli @@ -20,7 +20,6 @@ val mk_interprocedural_field_t : val interprocedural : f_analyze_dep:(Procdesc.t -> 'payloads_orig -> (Procdesc.t * 'payloads) option) - -> f_analyze_pdesc_dep:('payloads_orig -> 'payloads option) -> get_payload:(Payloads.t -> 'payloads_orig) -> set_payload:(Payloads.t -> 'payload_checker -> Payloads.t) -> ('payloads InterproceduralAnalysis.t -> 'payload_checker) diff --git a/infer/src/backend/ondemand.ml b/infer/src/backend/ondemand.ml index 5d5b0b2d7..68a91c3bd 100644 --- a/infer/src/backend/ondemand.ml +++ b/infer/src/backend/ondemand.ml @@ -304,31 +304,7 @@ let get_proc_desc callee_pname = ; lazy (Topl.get_proc_desc callee_pname) ] -type callee = ProcName of Procname.t | ProcDesc of Procdesc.t - -let proc_name_of_callee = function - | ProcName proc_name -> - proc_name - | ProcDesc proc_desc -> - Procdesc.get_proc_name proc_desc - - -let callee_should_be_analyzed = function - | ProcName proc_name -> - procedure_should_be_analyzed proc_name - | ProcDesc proc_desc -> - should_be_analyzed (Procdesc.get_attributes proc_desc) - - -let get_callee_proc_desc = function - | ProcDesc proc_desc -> - Some proc_desc - | ProcName proc_name -> - get_proc_desc proc_name - - -let analyze_callee exe_env ?caller_summary callee = - let callee_pname = proc_name_of_callee callee in +let analyze_callee exe_env ?caller_summary callee_pname = register_callee ?caller_summary callee_pname ; if is_active callee_pname then None else @@ -337,8 +313,8 @@ let analyze_callee exe_env ?caller_summary callee = callee_summary_option | None -> let summ_opt = - if callee_should_be_analyzed callee then - match get_callee_proc_desc callee with + if procedure_should_be_analyzed callee_pname then + match get_proc_desc callee_pname with | Some callee_pdesc -> RestartScheduler.lock_exn callee_pname ; let callee_summary = @@ -356,16 +332,12 @@ let analyze_callee exe_env ?caller_summary callee = summ_opt -let analyze_proc_desc exe_env ~caller_summary callee_pdesc = - analyze_callee exe_env ~caller_summary (ProcDesc callee_pdesc) - - let analyze_proc_name exe_env ~caller_summary callee_pname = - analyze_callee exe_env ~caller_summary (ProcName callee_pname) + analyze_callee exe_env ~caller_summary callee_pname let analyze_proc_name_no_caller exe_env callee_pname = - analyze_callee exe_env ?caller_summary:None (ProcName callee_pname) + analyze_callee exe_env ?caller_summary:None callee_pname let analyze_procedures exe_env procs_to_analyze source_file_opt = diff --git a/infer/src/backend/ondemand.mli b/infer/src/backend/ondemand.mli index 5bf3138f2..b7933f214 100644 --- a/infer/src/backend/ondemand.mli +++ b/infer/src/backend/ondemand.mli @@ -12,10 +12,6 @@ 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 : 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 : 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] *) diff --git a/infer/src/backend/registerCheckers.ml b/infer/src/backend/registerCheckers.ml index 5023eadc0..c15d20b81 100644 --- a/infer/src/backend/registerCheckers.ml +++ b/infer/src/backend/registerCheckers.ml @@ -30,7 +30,6 @@ let interprocedural2 payload_field1 payload_field2 checker = Procedure (CallbackOfChecker.interprocedural ~f_analyze_dep:(fun proc_desc payloads -> Some (proc_desc, payloads)) - ~f_analyze_pdesc_dep:Option.some ~get_payload:(fun payloads -> (Field.get payload_field1 payloads, Field.get payload_field2 payloads) ) ~set_payload:(fun payloads payload1 -> Field.fset payload_field1 payloads payload1) @@ -42,7 +41,6 @@ let interprocedural3 payload_field1 payload_field2 payload_field3 ~set_payload c Procedure (CallbackOfChecker.interprocedural ~f_analyze_dep:(fun proc_desc payloads -> Some (proc_desc, payloads)) - ~f_analyze_pdesc_dep:Option.some ~get_payload:(fun payloads -> ( Field.get payload_field1 payloads , Field.get payload_field2 payloads diff --git a/infer/src/biabduction/SymExec.ml b/infer/src/biabduction/SymExec.ml index 53890c306..e4bdb6474 100644 --- a/infer/src/biabduction/SymExec.ml +++ b/infer/src/biabduction/SymExec.ml @@ -585,8 +585,7 @@ type resolve_and_analyze_result = (** Resolve the procedure name and run the analysis of the resolved procedure if not already analyzed *) -let resolve_and_analyze - {InterproceduralAnalysis.analyze_dependency; analyze_pdesc_dependency; proc_desc; tenv} +let resolve_and_analyze {InterproceduralAnalysis.analyze_dependency; proc_desc; tenv} ~has_clang_model prop args callee_proc_name call_flags : resolve_and_analyze_result = if has_clang_model then {resolved_pname= callee_proc_name; resolved_procdesc_opt= None; resolved_summary_opt= None} @@ -612,8 +611,8 @@ let resolve_and_analyze resolved_args ) in ( resolved_proc_desc_option - , Option.bind resolved_proc_desc_option ~f:(fun pdesc -> - analyze_pdesc_dependency pdesc |> Option.map ~f:(fun summary -> (pdesc, summary)) ) ) + , Option.bind resolved_proc_desc_option ~f:(fun _pdesc -> + analyze_dependency resolved_pname ) ) in let resolved_pname = resolve_pname ~caller_pdesc:proc_desc tenv prop args callee_proc_name call_flags