From dd71a5a7e4590704553f921371e2f0405b67695c Mon Sep 17 00:00:00 2001 From: Jules Villard Date: Wed, 6 May 2020 11:23:46 -0700 Subject: [PATCH] make FragmentRetainsView an `intraprocedural` Summary: Making checkers/ its own dune library. Reviewed By: ezgicicek Differential Revision: D21407065 fbshipit-source-id: c23fbc8e1 --- infer/src/backend/registerCheckers.ml | 3 +- .../checkers/fragmentRetainsViewChecker.ml | 29 +++++++++---------- .../checkers/fragmentRetainsViewChecker.mli | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/infer/src/backend/registerCheckers.ml b/infer/src/backend/registerCheckers.ml index 784c794a8..2e1a2b174 100644 --- a/infer/src/backend/registerCheckers.ml +++ b/infer/src/backend/registerCheckers.ml @@ -178,7 +178,8 @@ let all_checkers = ; { name= "fragment retains view" ; active= Config.is_checker_enabled FragmentRetainsView ; callbacks= - [(Procedure FragmentRetainsViewChecker.callback_fragment_retains_view, Language.Java)] } + [(intraprocedural FragmentRetainsViewChecker.callback_fragment_retains_view, Language.Java)] + } ; { name= "eradicate" ; active= Config.is_checker_enabled Eradicate ; callbacks= diff --git a/infer/src/checkers/fragmentRetainsViewChecker.ml b/infer/src/checkers/fragmentRetainsViewChecker.ml index 43c0886c9..2b1d2e306 100644 --- a/infer/src/checkers/fragmentRetainsViewChecker.ml +++ b/infer/src/checkers/fragmentRetainsViewChecker.ml @@ -31,9 +31,7 @@ let format_method pname = Procname.to_string pname -let report_warning class_name fld fld_typ summary = - let pname = Summary.get_proc_name summary in - let loc = Summary.get_loc summary in +let report_warning ({ProcAttributes.proc_name; loc} as attrs) err_log class_name fld fld_typ = let pp_m = MarkupFormatter.pp_monospaced in let description = Format.asprintf @@ -41,15 +39,15 @@ let report_warning class_name fld fld_typ summary = the back stack, a reference to this (probably dead) View will be retained. In general, it \ is a good idea to initialize View's in %a, then nullify them in %a." pp_m (Typ.Name.name class_name) pp_m (Fieldname.get_field_name fld) pp_m (format_typ fld_typ) - pp_m (format_method pname) pp_m on_create_view pp_m on_destroy_view + pp_m (format_method proc_name) pp_m on_create_view pp_m on_destroy_view in - SummaryReporting.log_warning summary ~loc IssueType.checkers_fragment_retain_view description + Reporting.log_warning attrs err_log ~loc IssueType.checkers_fragment_retain_view description -let callback_fragment_retains_view_java java_pname {Callbacks.summary; exe_env} = +let callback_fragment_retains_view_java {IntraproceduralAnalysis.proc_desc; tenv; err_log} + java_pname = (* TODO: complain if onDestroyView is not defined, yet the Fragment has View fields *) (* TODO: handle fields nullified in callees in the same file *) - let tenv = Exe_env.get_tenv exe_env (Summary.get_proc_name summary) in let is_on_destroy_view = String.equal (Procname.Java.get_method java_pname) on_destroy_view in let fld_typ_is_view typ = match typ.Typ.desc with @@ -68,7 +66,7 @@ let callback_fragment_retains_view_java java_pname {Callbacks.summary; exe_env} match Tenv.lookup tenv class_name with | Some {fields} when AndroidFramework.is_fragment tenv class_name -> let declared_view_fields = List.filter ~f:(is_declared_view_typ class_name) fields in - let fields_nullified = PatternMatch.get_fields_nullified (Summary.get_proc_desc summary) in + let fields_nullified = PatternMatch.get_fields_nullified proc_desc in (* report if a field is declared by C, but not nulled out in C.onDestroyView *) List.iter ~f:(fun (fname, fld_typ, ia) -> @@ -76,17 +74,18 @@ let callback_fragment_retains_view_java java_pname {Callbacks.summary; exe_env} not ( Annotations.ia_ends_with ia Annotations.auto_cleanup || Fieldname.Set.mem fname fields_nullified ) - then report_warning class_name fname fld_typ summary ) + then + let attrs = Procdesc.get_attributes proc_desc in + report_warning attrs err_log class_name fname fld_typ ) declared_view_fields | _ -> () -let callback_fragment_retains_view ({Callbacks.summary} as args) : Summary.t = - let proc_name = Summary.get_proc_name summary in - ( match proc_name with +let callback_fragment_retains_view ({IntraproceduralAnalysis.proc_desc} as analysis_data) : unit = + let proc_name = Procdesc.get_proc_name proc_desc in + match proc_name with | Procname.Java java_pname -> - callback_fragment_retains_view_java java_pname args + callback_fragment_retains_view_java analysis_data java_pname | _ -> - () ) ; - summary + () diff --git a/infer/src/checkers/fragmentRetainsViewChecker.mli b/infer/src/checkers/fragmentRetainsViewChecker.mli index 59b2bac59..1e787307e 100644 --- a/infer/src/checkers/fragmentRetainsViewChecker.mli +++ b/infer/src/checkers/fragmentRetainsViewChecker.mli @@ -7,4 +7,4 @@ open! IStd -val callback_fragment_retains_view : Callbacks.proc_callback_t +val callback_fragment_retains_view : IntraproceduralAnalysis.t -> unit