@ -587,36 +587,39 @@ type resolve_and_analyze_result =
analyzed * )
analyzed * )
let resolve_and_analyze
let resolve_and_analyze
{ InterproceduralAnalysis . analyze_dependency ; analyze_pdesc_dependency ; proc_desc ; tenv }
{ InterproceduralAnalysis . analyze_dependency ; analyze_pdesc_dependency ; proc_desc ; tenv }
? ( has_clang_model = false ) 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 =
(* TODO ( #15748878 ) : Fix conflict with method overloading by encoding in the procedure name
if has_clang_model then
whether the method is defined or generated by the specialization * )
{ resolved_pname = callee_proc_name ; resolved_procdesc_opt = None ; resolved_summary_opt = None }
let analyze_ondemand resolved_pname =
else
if Procname . equal resolved_pname callee_proc_name then
(* TODO ( #15748878 ) : Fix conflict with method overloading by encoding in the procedure name
( AnalysisCallbacks . get_proc_desc callee_proc_name , analyze_dependency callee_proc_name )
whether the method is defined or generated by the specialization * )
else
let analyze_ondemand resolved_pname =
(* Create the type specialized procedure description and analyze it directly *)
if Procname . equal resolved_pname callee_proc_name then
let resolved_proc_desc_option =
( AnalysisCallbacks . get_proc_desc callee_proc_name , analyze_dependency callee_proc_name )
match AnalysisCallbacks . get_proc_desc resolved_pname with
else
| Some _ as resolved_proc_desc ->
(* Create the type specialized procedure description and analyze it directly *)
resolved_proc_desc
let resolved_proc_desc_option =
| None ->
match AnalysisCallbacks . get_proc_desc resolved_pname with
let procdesc_opt = AnalysisCallbacks . get_proc_desc callee_proc_name in
| Some _ as resolved_proc_desc ->
Option . map procdesc_opt ~ f : ( fun callee_proc_desc ->
resolved_proc_desc
(* It is possible that the types of the arguments are not as precise as the type of
| None ->
the objects in the heap , so we should update them to get the best results . * )
let procdesc_opt = AnalysisCallbacks . get_proc_desc callee_proc_name in
let resolved_args = resolve_args prop args in
Option . map procdesc_opt ~ f : ( fun callee_proc_desc ->
SpecializeProcdesc . with_formals_types ~ has_clang_model callee_proc_desc
(* It is possible that the types of the arguments are not as precise as the type of
resolved_pname resolved_args )
the objects in the heap , so we should update them to get the best results . * )
in
let resolved_args = resolve_args prop args in
( resolved_proc_desc_option
SpecializeProcdesc . with_formals_types callee_proc_desc resolved_pname
, Option . bind resolved_proc_desc_option ~ f : ( fun pdesc ->
resolved_args )
analyze_pdesc_dependency pdesc | > Option . map ~ f : ( fun summary -> ( pdesc , summary ) ) ) )
in
in
( resolved_proc_desc_option
let resolved_pname =
, Option . bind resolved_proc_desc_option ~ f : ( fun pdesc ->
resolve_pname ~ caller_pdesc : proc_desc tenv prop args callee_proc_name call_flags
analyze_pdesc_dependency pdesc | > Option . map ~ f : ( fun summary -> ( pdesc , summary ) ) ) )
in
in
let resolved_procdesc_opt , resolved_summary_opt = analyze_ondemand resolved_pname in
let resolved_pname =
{ resolved_pname ; resolved_procdesc_opt ; resolved_summary_opt }
resolve_pname ~ caller_pdesc : proc_desc tenv prop args callee_proc_name call_flags
in
let resolved_procdesc_opt , resolved_summary_opt = analyze_ondemand resolved_pname in
{ resolved_pname ; resolved_procdesc_opt ; resolved_summary_opt }
(* * recognize calls to the constructor java.net.URL and splits the argument string to be only the
(* * recognize calls to the constructor java.net.URL and splits the argument string to be only the
@ -1158,7 +1161,8 @@ let rec sym_exec
norm_args
norm_args
in
in
let resolve_and_analyze_result =
let resolve_and_analyze_result =
resolve_and_analyze analysis_data norm_prop norm_args callee_pname call_flags
resolve_and_analyze ~ has_clang_model : false analysis_data norm_prop norm_args
callee_pname call_flags
in
in
let resolved_pname = resolve_and_analyze_result . resolved_pname in
let resolved_pname = resolve_and_analyze_result . resolved_pname in
match resolve_and_analyze_result . resolved_summary_opt with
match resolve_and_analyze_result . resolved_summary_opt with