Reviewed By: jvillard Differential Revision: D3723785 fbshipit-source-id: c55f0e4master
parent
20584be8f3
commit
e853b01051
@ -0,0 +1,61 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) 2016 - present Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*)
|
||||||
|
|
||||||
|
open! Utils
|
||||||
|
|
||||||
|
module F = Format
|
||||||
|
module L = Logging
|
||||||
|
|
||||||
|
(** Create a taint analysis from a trace domain *)
|
||||||
|
module Make (TraceDomain : Trace.S) = struct
|
||||||
|
|
||||||
|
module TaintDomain = AccessTree.Make (TraceDomain)
|
||||||
|
module IdMapDomain = IdAccessPathMapDomain
|
||||||
|
|
||||||
|
module Domain = struct
|
||||||
|
type astate =
|
||||||
|
{
|
||||||
|
access_tree : TaintDomain.astate; (* mapping of access paths to trace sets *)
|
||||||
|
id_map : IdMapDomain.astate; (* mapping of id's to access paths for normalization *)
|
||||||
|
}
|
||||||
|
|
||||||
|
let initial =
|
||||||
|
let access_tree = TaintDomain.initial in
|
||||||
|
let id_map = IdMapDomain.initial in
|
||||||
|
{ access_tree; id_map; }
|
||||||
|
|
||||||
|
let (<=) ~lhs ~rhs =
|
||||||
|
if lhs == rhs
|
||||||
|
then true
|
||||||
|
else
|
||||||
|
TaintDomain.(<=) ~lhs:lhs.access_tree ~rhs:rhs.access_tree &&
|
||||||
|
IdMapDomain.(<=) ~lhs:lhs.id_map ~rhs:rhs.id_map
|
||||||
|
|
||||||
|
let join astate1 astate2 =
|
||||||
|
if astate1 == astate2
|
||||||
|
then astate1
|
||||||
|
else
|
||||||
|
let access_tree = TaintDomain.join astate1.access_tree astate2.access_tree in
|
||||||
|
let id_map = IdMapDomain.join astate1.id_map astate2.id_map in
|
||||||
|
{ access_tree; id_map; }
|
||||||
|
|
||||||
|
let widen ~prev ~next ~num_iters =
|
||||||
|
if prev == next
|
||||||
|
then prev
|
||||||
|
else
|
||||||
|
let access_tree =
|
||||||
|
TaintDomain.widen ~prev:prev.access_tree ~next:next.access_tree ~num_iters in
|
||||||
|
let id_map = IdMapDomain.widen ~prev:prev.id_map ~next:next.id_map ~num_iters in
|
||||||
|
{ access_tree; id_map; }
|
||||||
|
|
||||||
|
let pp fmt { access_tree; id_map; } =
|
||||||
|
F.fprintf fmt "(%a, %a)" TaintDomain.pp access_tree IdMapDomain.pp id_map
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in new issue