[starvation] make summary a proper subset of abstract state

Summary: Abstract state tracks stuff that is not needed for summaries, wasting space/time.

Reviewed By: jvillard

Differential Revision: D18171499

fbshipit-source-id: 25483ced9
master
Nikos Gorogiannis 5 years ago committed by Facebook Github Bot
parent f9b0d06826
commit 4a9b21f62c

@ -66,9 +66,9 @@ module TransferFunctions (CFG : ProcCfg.S) = struct
in
let do_unlock locks astate = List.filter_map ~f:get_lock_path locks |> Domain.release astate in
let do_call callee loc astate =
let callsite = CallSite.make callee loc in
Payload.read ~caller_summary:summary ~callee_pname:callee
|> Option.value_map ~default:astate ~f:(fun callee_summary ->
Domain.integrate_summary tenv ~caller_summary:astate ~callee_summary ~callee ~loc )
|> Option.fold ~init:astate ~f:(Domain.integrate_summary tenv callsite)
in
match instr with
| Assign _ | Assume _ | Call (_, Indirect _, _, _, _) | Metadata _ ->
@ -155,7 +155,8 @@ let analyze_procedure {Callbacks.exe_env; summary} =
in
Analyzer.compute_post proc_data ~initial
|> Option.map ~f:filter_blocks
|> Option.value_map ~default:summary ~f:(fun astate -> Payload.update_summary astate summary)
|> Option.map ~f:Domain.summary_of_astate
|> Option.fold ~init:summary ~f:(fun acc payload -> Payload.update_summary payload acc)
(** per-procedure report map, which takes care of deduplication *)
@ -452,7 +453,7 @@ let report_on_pair ((tenv, summary) as env) (pair : Domain.CriticalPair.t) repor
let reporting {Callbacks.procedures; source_file} =
let report_on_summary env (summary : Domain.t) report_map =
let report_on_summary env (summary : Domain.summary) report_map =
Domain.CriticalPairs.fold (report_on_pair env) summary.critical_pairs report_map
in
let report_procedure issue_log ((tenv, summary) as env) =

@ -492,17 +492,6 @@ let release ({lock_state} as astate) locks =
lock_state= List.fold locks ~init:lock_state ~f:(fun acc l -> LockState.release l acc) }
let integrate_summary tenv ~caller_summary:({lock_state; critical_pairs; thread} as astate) ~callee
~loc ~callee_summary =
let callsite = CallSite.make callee loc in
let critical_pairs' =
CriticalPairs.with_callsite callee_summary.critical_pairs tenv lock_state callsite thread
in
{ astate with
critical_pairs= CriticalPairs.join critical_pairs critical_pairs'
; thread= ThreadDomain.integrate_summary ~caller:thread ~callee:callee_summary.thread }
let set_on_ui_thread astate = {astate with thread= ThreadDomain.UIThread}
let add_guard ~acquire_now ~procname ~loc tenv astate guard lock =
@ -534,6 +523,22 @@ let filter_blocking_calls ({critical_pairs} as astate) =
{astate with critical_pairs= CriticalPairs.filter CriticalPair.is_blocking_call critical_pairs}
type summary = t
type summary = {critical_pairs: CriticalPairs.t; thread: ThreadDomain.t}
let pp_summary fmt (summary : summary) =
F.fprintf fmt "{thread= %a; critical_pairs= %a}" ThreadDomain.pp summary.thread CriticalPairs.pp
summary.critical_pairs
let integrate_summary tenv callsite (astate : t) (summary : summary) =
let critical_pairs' =
CriticalPairs.with_callsite summary.critical_pairs tenv astate.lock_state callsite
astate.thread
in
{ astate with
critical_pairs= CriticalPairs.join astate.critical_pairs critical_pairs'
; thread= ThreadDomain.integrate_summary ~caller:astate.thread ~callee:summary.thread }
let pp_summary = pp
let summary_of_astate : t -> summary =
fun astate -> {critical_pairs= astate.critical_pairs; thread= astate.thread}

@ -137,16 +137,12 @@ val remove_guard : t -> HilExp.t -> t
val unlock_guard : t -> HilExp.t -> t
(** Release the lock the guard was constructed with. *)
type summary = t
type summary = {critical_pairs: CriticalPairs.t; thread: ThreadDomain.t}
val pp_summary : F.formatter -> summary -> unit
val integrate_summary :
Tenv.t
-> caller_summary:t
-> callee:Typ.Procname.t
-> loc:Location.t
-> callee_summary:summary
-> t
val integrate_summary : Tenv.t -> CallSite.t -> t -> summary -> t
val summary_of_astate : t -> summary
val filter_blocking_calls : t -> t

Loading…
Cancel
Save