From 3de92484dff135aaf6a221e9c541703dff390f4e Mon Sep 17 00:00:00 2001
From: Sungkeun Cho <scho@fb.com>
Date: Fri, 17 Jan 2020 04:00:20 -0800
Subject: [PATCH] [inferbo] Refactoring: move get_formals type definition

Summary:
This diffs does: (1) move `get_formals` to `BufferOverrunUtils` (2) use separate `get_formals` in
`BufferOverrunChecker`, in order to simplify the following diff.

Reviewed By: jvillard

Differential Revision: D19432280

fbshipit-source-id: bfb4df118
---
 .../bufferoverrun/bufferOverrunAnalysis.ml    |  6 +--
 .../src/bufferoverrun/bufferOverrunChecker.ml | 37 +++++++++++--------
 infer/src/bufferoverrun/bufferOverrunUtils.ml |  2 +
 .../src/bufferoverrun/bufferOverrunUtils.mli  |  2 +
 4 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/infer/src/bufferoverrun/bufferOverrunAnalysis.ml b/infer/src/bufferoverrun/bufferOverrunAnalysis.ml
index 47436c8bd..efcc1b215 100644
--- a/infer/src/bufferoverrun/bufferOverrunAnalysis.ml
+++ b/infer/src/bufferoverrun/bufferOverrunAnalysis.ml
@@ -25,11 +25,9 @@ module Payload = SummaryPayload.Make (struct
   let field = Payloads.Fields.buffer_overrun_analysis
 end)
 
-type get_formals = Procname.t -> (Pvar.t * Typ.t) list option
-
 type extras =
   { get_summary: BufferOverrunAnalysisSummary.get_summary
-  ; get_formals: get_formals
+  ; get_formals: BoUtils.get_formals
   ; oenv: OndemandEnv.t }
 
 module CFG = ProcCfg.NormalOneInstrPerNode
@@ -449,7 +447,7 @@ let compute_invariant_map :
     -> Tenv.t
     -> Typ.IntegerWidths.t
     -> BufferOverrunAnalysisSummary.get_summary
-    -> get_formals
+    -> BoUtils.get_formals
     -> invariant_map =
  fun summary tenv integer_type_widths get_summary get_formals ->
   let pdesc = Summary.get_proc_desc summary in
diff --git a/infer/src/bufferoverrun/bufferOverrunChecker.ml b/infer/src/bufferoverrun/bufferOverrunChecker.ml
index 02e2f64df..8917de708 100644
--- a/infer/src/bufferoverrun/bufferOverrunChecker.ml
+++ b/infer/src/bufferoverrun/bufferOverrunChecker.ml
@@ -250,10 +250,11 @@ let instantiate_cond :
 
 type checks_summary = BufferOverrunCheckerSummary.t
 
-type get_checks_summary = Procname.t -> ((Pvar.t * Typ.t) list * checks_summary) option
+type get_checks_summary = Procname.t -> checks_summary option
 
 let check_instr :
        get_checks_summary
+    -> BoUtils.get_formals
     -> Procdesc.t
     -> Tenv.t
     -> Typ.IntegerWidths.t
@@ -262,7 +263,7 @@ let check_instr :
     -> Dom.Mem.t
     -> PO.ConditionSet.checked_t
     -> PO.ConditionSet.checked_t =
- fun get_checks_summary pdesc tenv integer_type_widths node instr mem cond_set ->
+ fun get_checks_summary get_formals pdesc tenv integer_type_widths node instr mem cond_set ->
   match instr with
   | Sil.Load {e= exp; loc= location} ->
       cond_set
@@ -291,12 +292,12 @@ let check_instr :
           in
           check model_env mem cond_set
       | None -> (
-        match get_checks_summary callee_pname with
-        | Some (callee_formals, callee_condset) ->
+        match (get_checks_summary callee_pname, get_formals callee_pname) with
+        | Some callee_condset, Some callee_formals ->
             instantiate_cond integer_type_widths callee_pname callee_formals params mem
               callee_condset location
             |> PO.ConditionSet.join cond_set
-        | None ->
+        | _, _ ->
             (* unknown call / no inferbo payload *) cond_set ) )
   | Sil.Prune (exp, location, _, _) ->
       check_expr_for_integer_overflow integer_type_widths exp location mem cond_set
@@ -316,6 +317,7 @@ let print_debug_info : Sil.instr -> Dom.Mem.t -> PO.ConditionSet.checked_t -> un
 
 let check_instrs :
        get_checks_summary
+    -> BoUtils.get_formals
     -> Procdesc.t
     -> Tenv.t
     -> Typ.IntegerWidths.t
@@ -325,7 +327,7 @@ let check_instrs :
     -> Dom.Mem.t AbstractInterpreter.State.t
     -> Checks.t
     -> Checks.t =
- fun get_checks_summary pdesc tenv integer_type_widths cfg node instrs state checks ->
+ fun get_checks_summary get_formals pdesc tenv integer_type_widths cfg node instrs state checks ->
   match state with
   | _ when Instrs.is_empty instrs ->
       checks
@@ -342,7 +344,8 @@ let check_instrs :
             checks
       in
       let cond_set =
-        check_instr get_checks_summary pdesc tenv integer_type_widths node instr pre checks.cond_set
+        check_instr get_checks_summary get_formals pdesc tenv integer_type_widths node instr pre
+          checks.cond_set
       in
       print_debug_info instr pre cond_set ;
       {checks with cond_set}
@@ -350,6 +353,7 @@ let check_instrs :
 
 let check_node :
        get_checks_summary
+    -> BoUtils.get_formals
     -> Procdesc.t
     -> Tenv.t
     -> Typ.IntegerWidths.t
@@ -358,11 +362,12 @@ let check_node :
     -> Checks.t
     -> CFG.Node.t
     -> Checks.t =
- fun get_checks_summary pdesc tenv integer_type_widths cfg inv_map checks node ->
+ fun get_checks_summary get_formals pdesc tenv integer_type_widths cfg inv_map checks node ->
   match BufferOverrunAnalysis.extract_state (CFG.Node.id node) inv_map with
   | Some state ->
       let instrs = CFG.instrs node in
-      check_instrs get_checks_summary pdesc tenv integer_type_widths cfg node instrs state checks
+      check_instrs get_checks_summary get_formals pdesc tenv integer_type_widths cfg node instrs
+        state checks
   | _ ->
       checks
 
@@ -371,15 +376,16 @@ type checks = Checks.t
 
 let compute_checks :
        get_checks_summary
+    -> BoUtils.get_formals
     -> Procdesc.t
     -> Tenv.t
     -> Typ.IntegerWidths.t
     -> CFG.t
     -> BufferOverrunAnalysis.invariant_map
     -> checks =
- fun get_checks_summary pdesc tenv integer_type_widths cfg inv_map ->
+ fun get_checks_summary get_formals pdesc tenv integer_type_widths cfg inv_map ->
   CFG.fold_nodes cfg
-    ~f:(check_node get_checks_summary pdesc tenv integer_type_widths cfg inv_map)
+    ~f:(check_node get_checks_summary get_formals pdesc tenv integer_type_widths cfg inv_map)
     ~init:Checks.empty
 
 
@@ -422,12 +428,11 @@ let checker : Callbacks.proc_callback_args -> Summary.t =
   NodePrinter.with_session ~pp_name underlying_exit_node ~f:(fun () ->
       let cfg = CFG.from_pdesc proc_desc in
       let checks =
-        let get_checks_summary callee_pname =
-          Payload.read_full ~caller_summary:summary ~callee_pname
-          |> Option.map ~f:(fun (callee_pdesc, callee_summary) ->
-                 (Procdesc.get_pvar_formals callee_pdesc, callee_summary) )
+        let get_checks_summary callee_pname = Payload.read ~caller_summary:summary ~callee_pname in
+        let get_formals callee_pname =
+          Ondemand.get_proc_desc callee_pname |> Option.map ~f:Procdesc.get_pvar_formals
         in
-        compute_checks get_checks_summary proc_desc tenv integer_type_widths cfg inv_map
+        compute_checks get_checks_summary get_formals proc_desc tenv integer_type_widths cfg inv_map
       in
       report_errors tenv checks summary ;
       let cond_set = get_checks_summary checks in
diff --git a/infer/src/bufferoverrun/bufferOverrunUtils.ml b/infer/src/bufferoverrun/bufferOverrunUtils.ml
index c2b093af5..3afda4bac 100644
--- a/infer/src/bufferoverrun/bufferOverrunUtils.ml
+++ b/infer/src/bufferoverrun/bufferOverrunUtils.ml
@@ -328,3 +328,5 @@ module Check = struct
     | _, _ ->
         cond_set
 end
+
+type get_formals = Procname.t -> (Pvar.t * Typ.t) list option
diff --git a/infer/src/bufferoverrun/bufferOverrunUtils.mli b/infer/src/bufferoverrun/bufferOverrunUtils.mli
index 1eb2a4404..18737a9a2 100644
--- a/infer/src/bufferoverrun/bufferOverrunUtils.mli
+++ b/infer/src/bufferoverrun/bufferOverrunUtils.mli
@@ -92,3 +92,5 @@ module Check : sig
     -> PO.ConditionSet.checked_t
     -> PO.ConditionSet.checked_t
 end
+
+type get_formals = Procname.t -> (Pvar.t * Typ.t) list option