Summary: First version of an analyzer collecting classes transitively touched. Reviewed By: mbouaziz Differential Revision: D10448025 fbshipit-source-id: 0ddfefd46master
parent
7e7913d5ee
commit
4334225e67
@ -0,0 +1,51 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) 2018-present, Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
open! IStd
|
||||||
|
module F = Format
|
||||||
|
module L = Logging
|
||||||
|
|
||||||
|
module Payload = SummaryPayload.Make (struct
|
||||||
|
type t = ClassLoadsDomain.summary
|
||||||
|
|
||||||
|
let update_payloads post (payloads : Payloads.t) = {payloads with class_loads= Some post}
|
||||||
|
|
||||||
|
let of_payloads (payloads : Payloads.t) = payloads.class_loads
|
||||||
|
end)
|
||||||
|
|
||||||
|
module TransferFunctions (CFG : ProcCfg.S) = struct
|
||||||
|
module CFG = CFG
|
||||||
|
module Domain = ClassLoadsDomain
|
||||||
|
|
||||||
|
type extras = unit
|
||||||
|
|
||||||
|
let exec_instr (astate : Domain.astate) {ProcData.pdesc} _ (instr : HilInstr.t) =
|
||||||
|
match instr with
|
||||||
|
| Call (_, Direct callee, _, _, loc) ->
|
||||||
|
Payload.read pdesc callee
|
||||||
|
|> Option.value_map ~default:astate ~f:(Domain.integrate_summary astate callee loc)
|
||||||
|
| _ ->
|
||||||
|
astate
|
||||||
|
|
||||||
|
|
||||||
|
let pp_session_name _node fmt = F.pp_print_string fmt "class loads"
|
||||||
|
end
|
||||||
|
|
||||||
|
module Analyzer = LowerHil.MakeAbstractInterpreter (ProcCfg.Normal) (TransferFunctions)
|
||||||
|
|
||||||
|
let die_if_not_java proc_desc =
|
||||||
|
let is_java =
|
||||||
|
Procdesc.get_proc_name proc_desc |> Typ.Procname.get_language |> Language.(equal Java)
|
||||||
|
in
|
||||||
|
if not is_java then L.(die InternalError "Not supposed to run on non-Java code yet.")
|
||||||
|
|
||||||
|
|
||||||
|
let analyze_procedure {Callbacks.proc_desc; tenv; summary} =
|
||||||
|
die_if_not_java proc_desc ;
|
||||||
|
let initial = ClassLoadsDomain.empty in
|
||||||
|
let proc_data = ProcData.make proc_desc tenv () in
|
||||||
|
Analyzer.compute_post proc_data ~initial
|
||||||
|
|> Option.value_map ~default:summary ~f:(fun astate -> Payload.update_summary astate summary)
|
@ -0,0 +1,10 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) 2018-present, Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
val analyze_procedure : Callbacks.proc_callback_t
|
@ -0,0 +1,38 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) 2018-present, Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
open! IStd
|
||||||
|
module F = Format
|
||||||
|
module ClassLoad = String
|
||||||
|
module Event = ExplicitTrace.MakeTraceElem (ClassLoad)
|
||||||
|
include Event.FiniteSet
|
||||||
|
|
||||||
|
let add ({Event.trace} as x) astate =
|
||||||
|
match find_opt x astate with
|
||||||
|
| None ->
|
||||||
|
add x astate
|
||||||
|
| Some ({Event.trace= trace'} as x') ->
|
||||||
|
if Int.( <= ) (List.length trace') (List.length trace) then astate
|
||||||
|
else remove x' astate |> add x
|
||||||
|
|
||||||
|
|
||||||
|
let union xs ys = fold add xs ys
|
||||||
|
|
||||||
|
let integrate_summary astate callee_pname loc callee_summary =
|
||||||
|
match callee_pname with
|
||||||
|
| Typ.Procname.Java java_pname ->
|
||||||
|
let clazz = Typ.Procname.Java.get_class_name java_pname in
|
||||||
|
let new_event = Event.make clazz loc in
|
||||||
|
let callsite = CallSite.make callee_pname loc in
|
||||||
|
let summary = with_callsite callee_summary callsite in
|
||||||
|
add new_event astate |> union summary
|
||||||
|
| _ ->
|
||||||
|
astate
|
||||||
|
|
||||||
|
|
||||||
|
type summary = astate
|
||||||
|
|
||||||
|
let pp_summary = pp
|
@ -0,0 +1,16 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) 2018-present, Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
open! IStd
|
||||||
|
module F = Format
|
||||||
|
|
||||||
|
include AbstractDomain.WithBottom
|
||||||
|
|
||||||
|
type summary = astate
|
||||||
|
|
||||||
|
val pp_summary : F.formatter -> summary -> unit
|
||||||
|
|
||||||
|
val integrate_summary : astate -> Typ.Procname.t -> Location.t -> summary -> astate
|
Loading…
Reference in new issue