From 6d12d67613950e0acde4267091cf778515d68483 Mon Sep 17 00:00:00 2001 From: Martino Luca Date: Fri, 16 Nov 2018 11:18:49 -0800 Subject: [PATCH] [Perf] Embed filtering for costs reports Reviewed By: mbouaziz Differential Revision: D13103020 fbshipit-source-id: 641e549ee --- infer/src/backend/Differential.ml | 107 +++++++++--------- infer/src/backend/InferPrint.ml | 19 ++-- .../differential_of_costs_report/Makefile | 4 +- .../differential_of_costs_report/fixed.exp | 2 +- .../introduced.exp | 4 +- 5 files changed, 70 insertions(+), 66 deletions(-) diff --git a/infer/src/backend/Differential.ml b/infer/src/backend/Differential.ml index f7c9752da..80c9bcaec 100644 --- a/infer/src/backend/Differential.ml +++ b/infer/src/backend/Differential.ml @@ -136,56 +136,59 @@ let issue_of_cost cost_info ~delta ~prev_cost ~curr_cost = else if CostDomain.BasicCost.is_zero curr_cost then IssueType.zero_execution_time_call else IssueType.performance_variation in - let qualifier = - let pp_delta fmt delta = - match delta with - | `Decreased -> - Format.fprintf fmt "decreased" - | `Increased -> - Format.fprintf fmt "increased" + if (not Config.filtering) || issue_type.IssueType.enabled then + let qualifier = + let pp_delta fmt delta = + match delta with + | `Decreased -> + Format.fprintf fmt "decreased" + | `Increased -> + Format.fprintf fmt "increased" + in + let pp_raw_cost fmt cost_polynomial = + if Config.developer_mode then + Format.fprintf fmt " Cost is %a (degree is %a)" CostDomain.BasicCost.pp cost_polynomial + CostDomain.BasicCost.pp_degree cost_polynomial + else () + in + Format.asprintf "Complexity of this function has %a from %a to %a.%a" + (MarkupFormatter.wrap_bold pp_delta) + delta + (MarkupFormatter.wrap_monospaced CostDomain.BasicCost.pp_degree_hum) + prev_cost + (MarkupFormatter.wrap_monospaced CostDomain.BasicCost.pp_degree_hum) + curr_cost pp_raw_cost curr_cost in - let pp_raw_cost fmt cost_polynomial = - if Config.developer_mode then - Format.fprintf fmt " Cost is %a (degree is %a)" CostDomain.BasicCost.pp cost_polynomial - CostDomain.BasicCost.pp_degree cost_polynomial - else () + let line = cost_info.Jsonbug_t.loc.lnum in + let column = cost_info.Jsonbug_t.loc.cnum in + let trace = + [Errlog.make_trace_element 0 {Location.line; col= column; file= source_file} "" []] in - Format.asprintf "Complexity of this function has %a from %a to %a.%a" - (MarkupFormatter.wrap_bold pp_delta) - delta - (MarkupFormatter.wrap_monospaced CostDomain.BasicCost.pp_degree_hum) - prev_cost - (MarkupFormatter.wrap_monospaced CostDomain.BasicCost.pp_degree_hum) - curr_cost pp_raw_cost curr_cost - in - let line = cost_info.Jsonbug_t.loc.lnum in - let column = cost_info.Jsonbug_t.loc.cnum in - let trace = - [Errlog.make_trace_element 0 {Location.line; col= column; file= source_file} "" []] - in - let severity = Exceptions.Warning in - { Jsonbug_j.bug_type= issue_type.IssueType.unique_id - ; qualifier - ; severity= Exceptions.severity_string severity - ; visibility= Exceptions.string_of_visibility Exceptions.Exn_user - ; line - ; column - ; procedure= cost_info.Jsonbug_t.procedure_id - ; procedure_start_line= 0 - ; file - ; bug_trace= InferPrint.loc_trace_to_jsonbug_record trace severity - ; key= "" - ; node_key= None - ; hash= cost_info.Jsonbug_t.hash - ; dotty= None - ; infer_source_loc= None - ; bug_type_hum= issue_type.IssueType.hum - ; linters_def_file= None - ; doc_url= None - ; traceview_id= None - ; censored_reason= InferPrint.censored_reason issue_type source_file - ; access= None - ; extras= None } + let severity = Exceptions.Warning in + Some + { Jsonbug_j.bug_type= issue_type.IssueType.unique_id + ; qualifier + ; severity= Exceptions.severity_string severity + ; visibility= Exceptions.string_of_visibility Exceptions.Exn_user + ; line + ; column + ; procedure= cost_info.Jsonbug_t.procedure_id + ; procedure_start_line= line + ; file + ; bug_trace= InferPrint.loc_trace_to_jsonbug_record trace severity + ; key= "" + ; node_key= None + ; hash= cost_info.Jsonbug_t.hash + ; dotty= None + ; infer_source_loc= None + ; bug_type_hum= issue_type.IssueType.hum + ; linters_def_file= None + ; doc_url= None + ; traceview_id= None + ; censored_reason= InferPrint.censored_reason issue_type source_file + ; access= None + ; extras= None } + else None (** Differential of cost reports, based on degree variations. @@ -207,18 +210,18 @@ let of_costs ~(current_costs : Jsonbug_t.costs_report) ~(previous_costs : Jsonbu let curr_cost_info, curr_cost = max_degree_polynomial current in let _, prev_cost = max_degree_polynomial previous in let cmp = CostDomain.BasicCost.compare_by_degree curr_cost prev_cost in + let concat_opt l v = match v with Some v' -> v' :: l | None -> l in if cmp > 0 then (* introduced *) let left' = - let issue = issue_of_cost curr_cost_info ~delta:`Increased ~prev_cost ~curr_cost in - issue :: left + issue_of_cost curr_cost_info ~delta:`Increased ~prev_cost ~curr_cost |> concat_opt left in (left', both, right) else if cmp < 0 then (* fixed *) let right' = - let issue = issue_of_cost curr_cost_info ~delta:`Decreased ~prev_cost ~curr_cost in - issue :: right + issue_of_cost curr_cost_info ~delta:`Decreased ~prev_cost ~curr_cost + |> concat_opt right in (left, both, right') else diff --git a/infer/src/backend/InferPrint.ml b/infer/src/backend/InferPrint.ml index 57a97de48..d794e1ab1 100644 --- a/infer/src/backend/InferPrint.ml +++ b/infer/src/backend/InferPrint.ml @@ -240,6 +240,14 @@ type json_issue_printer_typ = ; err_key: Errlog.err_key ; err_data: Errlog.err_data } +let procedure_id_of_procname proc_name = + match Typ.Procname.get_language proc_name with + | Language.Java -> + Typ.Procname.to_unique_id proc_name + | _ -> + Typ.Procname.to_string proc_name + + module JsonIssuePrinter = MakeJsonListPrinter (struct type elt = json_issue_printer_typ @@ -288,13 +296,6 @@ module JsonIssuePrinter = MakeJsonListPrinter (struct Format.sprintf "%s@\n%s" base_qualifier potential_exception_message else base_qualifier in - let procedure = - match Typ.Procname.get_language proc_name with - | Language.Java -> - Typ.Procname.to_unique_id proc_name - | _ -> - Typ.Procname.to_string proc_name - in let bug = { Jsonbug_j.bug_type ; qualifier @@ -302,7 +303,7 @@ module JsonIssuePrinter = MakeJsonListPrinter (struct ; visibility ; line= err_data.loc.Location.line ; column= err_data.loc.Location.col - ; procedure + ; procedure= procedure_id_of_procname proc_name ; procedure_start_line ; file ; bug_trace= loc_trace_to_jsonbug_record err_data.loc_trace err_key.severity @@ -353,7 +354,7 @@ module JsonCostsPrinter = MakeJsonListPrinter (struct let file = SourceFile.to_rel_path loc.Location.file in { Jsonbug_t.hash= compute_hash ~severity:"" ~bug_type:"" ~proc_name ~file ~qualifier:"" ; loc= {file; lnum= loc.Location.line; cnum= loc.Location.col; enum= -1} - ; procedure_id= Typ.Procname.to_string proc_name + ; procedure_id= procedure_id_of_procname proc_name ; polynomial= CostDomain.BasicCost.encode post ; hum } in diff --git a/infer/tests/build_systems/differential_of_costs_report/Makefile b/infer/tests/build_systems/differential_of_costs_report/Makefile index 774899ab2..d2f740dbd 100644 --- a/infer/tests/build_systems/differential_of_costs_report/Makefile +++ b/infer/tests/build_systems/differential_of_costs_report/Makefile @@ -16,9 +16,9 @@ $(CURRENT_REPORT) $(PREVIOUS_REPORT): $(JAVA_DEPS) $(CURRENT_REPORT): $(QUIET)$(COPY) src/DiffExample.java.current src/DiffExample.java $(QUIET)$(call silent_on_success,Testing Differential skips anon class renamings: current,\ - $(INFER_BIN) --cost-only -o $(CURRENT_DIR) -- $(JAVAC) src/*.java) + $(INFER_BIN) --enable-issue-type INFINITE_EXECUTION_TIME_CALL --cost-only -o $(CURRENT_DIR) -- $(JAVAC) src/*.java) $(PREVIOUS_REPORT): $(QUIET)$(COPY) src/DiffExample.java.previous src/DiffExample.java $(QUIET)$(call silent_on_success,Testing Differential skips anon class renamings: previous,\ - $(INFER_BIN) --cost-only -o $(PREVIOUS_DIR) -- $(JAVAC) src/*.java) + $(INFER_BIN) --enable-issue-type INFINITE_EXECUTION_TIME_CALL --cost-only -o $(PREVIOUS_DIR) -- $(JAVAC) src/*.java) diff --git a/infer/tests/build_systems/differential_of_costs_report/fixed.exp b/infer/tests/build_systems/differential_of_costs_report/fixed.exp index 54a830c49..b35e05ce4 100644 --- a/infer/tests/build_systems/differential_of_costs_report/fixed.exp +++ b/infer/tests/build_systems/differential_of_costs_report/fixed.exp @@ -1 +1 @@ -PERFORMANCE_VARIATION, no_bucket, src/DiffExample.java, void DiffExample.f2(int), 27 +PERFORMANCE_VARIATION, no_bucket, src/DiffExample.java, DiffExample.f2(int):void, 0 diff --git a/infer/tests/build_systems/differential_of_costs_report/introduced.exp b/infer/tests/build_systems/differential_of_costs_report/introduced.exp index ee65a9ec8..7f385cfc9 100644 --- a/infer/tests/build_systems/differential_of_costs_report/introduced.exp +++ b/infer/tests/build_systems/differential_of_costs_report/introduced.exp @@ -1,2 +1,2 @@ -PERFORMANCE_VARIATION, no_bucket, src/DiffExample.java, int DiffExample.f4(int), 39 -INFINITE_EXECUTION_TIME_CALL, no_bucket, src/DiffExample.java, void DiffExample.f1(int), 19 +INFINITE_EXECUTION_TIME_CALL, no_bucket, src/DiffExample.java, DiffExample.f1(int):void, 0 +PERFORMANCE_VARIATION, no_bucket, src/DiffExample.java, DiffExample.f4(int):int, 0