[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
master
Nikos Gorogiannis 5 years ago committed by Facebook GitHub Bot
parent f4c52851fb
commit 8c4b212545

@ -166,8 +166,5 @@ let with_formals_types callee_pdesc resolved_pname args =
in in
let resolved_proc_desc = Procdesc.from_proc_attributes resolved_attributes 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 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 resolved_proc_desc

@ -13,7 +13,6 @@ type 'payload t =
; err_log: Errlog.t ; err_log: Errlog.t
; exe_env: Exe_env.t ; exe_env: Exe_env.t
; analyze_dependency: Procname.t -> (Procdesc.t * 'payload) option ; 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 } ; update_stats: ?add_symops:int -> ?failure_kind:SymOp.failure_kind -> unit -> unit }
type 'payload file_t = type 'payload file_t =
@ -28,8 +27,4 @@ let bind_payload ~f analysis_data =
(fun proc_name -> (fun proc_name ->
analysis_data.analyze_dependency proc_name analysis_data.analyze_dependency proc_name
|> Option.bind ~f:(fun (proc_desc, payloads) -> |> Option.bind ~f:(fun (proc_desc, payloads) ->
Option.map (f payloads) ~f:(fun payloads' -> (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) ) }

@ -20,8 +20,6 @@ type 'payload t =
; analyze_dependency: Procname.t -> (Procdesc.t * 'payload) option ; analyze_dependency: Procname.t -> (Procdesc.t * 'payload) option
(** On-demand analysis of callees or other dependencies of the analysis of the current (** On-demand analysis of callees or other dependencies of the analysis of the current
procedure. Uses [Ondemand.analyze_procedure]. *) 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_stats: ?add_symops:int -> ?failure_kind:SymOp.failure_kind -> unit -> unit
(** update the [Summary.Stats.t] of the summary of the current procedure *) } (** update the [Summary.Stats.t] of the summary of the current procedure *) }

@ -16,17 +16,13 @@ let () =
; proc_resolve_attributes_f= Summary.OnDisk.proc_resolve_attributes } ; 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)) () = ?(tenv = Exe_env.get_tenv exe_env (Summary.get_proc_name summary)) () =
let analyze_dependency proc_name = let analyze_dependency proc_name =
let summary = Ondemand.analyze_proc_name exe_env ~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; _} -> Option.bind summary ~f:(fun {Summary.payloads; proc_desc; _} ->
f_analyze_dep proc_desc (get_payload payloads) ) f_analyze_dep proc_desc (get_payload payloads) )
in 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 stats = ref summary.Summary.stats in
let update_stats ?add_symops ?failure_kind () = let update_stats ?add_symops ?failure_kind () =
stats := Summary.Stats.update ?add_symops ?failure_kind !stats 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 ; err_log= Summary.get_err_log summary
; exe_env ; exe_env
; analyze_dependency ; analyze_dependency
; analyze_pdesc_dependency
; update_stats } ; update_stats }
, stats ) , stats )
@ -45,13 +40,12 @@ let mk_interprocedural_field_t payload_field exe_env summary =
mk_interprocedural_t mk_interprocedural_t
~f_analyze_dep:(fun pdesc payload_opt -> ~f_analyze_dep:(fun pdesc payload_opt ->
Option.map payload_opt ~f:(fun payload -> (pdesc, payload)) ) 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 let interprocedural ~f_analyze_dep ~get_payload ~set_payload checker {Callbacks.summary; exe_env} =
{Callbacks.summary; exe_env} =
let analysis_data, stats_ref = 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 in
let result = checker analysis_data in let result = checker analysis_data in
{summary with payloads= set_payload summary.payloads result; stats= !stats_ref} {summary with payloads= set_payload summary.payloads result; stats= !stats_ref}

@ -20,7 +20,6 @@ val mk_interprocedural_field_t :
val interprocedural : val interprocedural :
f_analyze_dep:(Procdesc.t -> 'payloads_orig -> (Procdesc.t * 'payloads) option) 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) -> get_payload:(Payloads.t -> 'payloads_orig)
-> set_payload:(Payloads.t -> 'payload_checker -> Payloads.t) -> set_payload:(Payloads.t -> 'payload_checker -> Payloads.t)
-> ('payloads InterproceduralAnalysis.t -> 'payload_checker) -> ('payloads InterproceduralAnalysis.t -> 'payload_checker)

@ -304,31 +304,7 @@ let get_proc_desc callee_pname =
; lazy (Topl.get_proc_desc callee_pname) ] ; lazy (Topl.get_proc_desc callee_pname) ]
type callee = ProcName of Procname.t | ProcDesc of Procdesc.t let analyze_callee exe_env ?caller_summary callee_pname =
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
register_callee ?caller_summary callee_pname ; register_callee ?caller_summary callee_pname ;
if is_active callee_pname then None if is_active callee_pname then None
else else
@ -337,8 +313,8 @@ let analyze_callee exe_env ?caller_summary callee =
callee_summary_option callee_summary_option
| None -> | None ->
let summ_opt = let summ_opt =
if callee_should_be_analyzed callee then if procedure_should_be_analyzed callee_pname then
match get_callee_proc_desc callee with match get_proc_desc callee_pname with
| Some callee_pdesc -> | Some callee_pdesc ->
RestartScheduler.lock_exn callee_pname ; RestartScheduler.lock_exn callee_pname ;
let callee_summary = let callee_summary =
@ -356,16 +332,12 @@ let analyze_callee exe_env ?caller_summary callee =
summ_opt 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 = 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 = 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 = let analyze_procedures exe_env procs_to_analyze source_file_opt =

@ -12,10 +12,6 @@ open! IStd
val get_proc_desc : Procname.t -> Procdesc.t option val get_proc_desc : Procname.t -> Procdesc.t option
(** Find a proc desc for the procedure, perhaps loading it from disk. *) (** 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 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 (** [analyze_proc_name exe_env ~caller_summary callee_pname] performs an on-demand analysis of
[callee_pname] triggered during the analysis of [caller_summary] *) [callee_pname] triggered during the analysis of [caller_summary] *)

@ -30,7 +30,6 @@ let interprocedural2 payload_field1 payload_field2 checker =
Procedure Procedure
(CallbackOfChecker.interprocedural (CallbackOfChecker.interprocedural
~f_analyze_dep:(fun proc_desc payloads -> Some (proc_desc, payloads)) ~f_analyze_dep:(fun proc_desc payloads -> Some (proc_desc, payloads))
~f_analyze_pdesc_dep:Option.some
~get_payload:(fun payloads -> ~get_payload:(fun payloads ->
(Field.get payload_field1 payloads, Field.get payload_field2 payloads) ) (Field.get payload_field1 payloads, Field.get payload_field2 payloads) )
~set_payload:(fun payloads payload1 -> Field.fset payload_field1 payloads payload1) ~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 Procedure
(CallbackOfChecker.interprocedural (CallbackOfChecker.interprocedural
~f_analyze_dep:(fun proc_desc payloads -> Some (proc_desc, payloads)) ~f_analyze_dep:(fun proc_desc payloads -> Some (proc_desc, payloads))
~f_analyze_pdesc_dep:Option.some
~get_payload:(fun payloads -> ~get_payload:(fun payloads ->
( Field.get payload_field1 payloads ( Field.get payload_field1 payloads
, Field.get payload_field2 payloads , Field.get payload_field2 payloads

@ -585,8 +585,7 @@ type resolve_and_analyze_result =
(** Resolve the procedure name and run the analysis of the resolved procedure if not already (** Resolve the procedure name and run the analysis of the resolved procedure if not already
analyzed *) analyzed *)
let resolve_and_analyze let resolve_and_analyze {InterproceduralAnalysis.analyze_dependency; proc_desc; tenv}
{InterproceduralAnalysis.analyze_dependency; analyze_pdesc_dependency; proc_desc; tenv}
~has_clang_model prop args callee_proc_name call_flags : resolve_and_analyze_result = ~has_clang_model prop args callee_proc_name call_flags : resolve_and_analyze_result =
if has_clang_model then if has_clang_model then
{resolved_pname= callee_proc_name; resolved_procdesc_opt= None; resolved_summary_opt= None} {resolved_pname= callee_proc_name; resolved_procdesc_opt= None; resolved_summary_opt= None}
@ -612,8 +611,8 @@ let resolve_and_analyze
resolved_args ) resolved_args )
in in
( resolved_proc_desc_option ( resolved_proc_desc_option
, Option.bind resolved_proc_desc_option ~f:(fun pdesc -> , Option.bind resolved_proc_desc_option ~f:(fun _pdesc ->
analyze_pdesc_dependency pdesc |> Option.map ~f:(fun summary -> (pdesc, summary)) ) ) analyze_dependency resolved_pname ) )
in in
let resolved_pname = let resolved_pname =
resolve_pname ~caller_pdesc:proc_desc tenv prop args callee_proc_name call_flags resolve_pname ~caller_pdesc:proc_desc tenv prop args callee_proc_name call_flags

Loading…
Cancel
Save