source/interprocedural_analyses/taint/taintTransforms.ml (53 lines of code) (raw):

(* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. *) open Core module T = struct type t = TaintTransform.t list [@@deriving compare, eq, hash, sexp] end include T module Set = struct include Stdlib.Set.Make (T) end let empty = [] let add_transform transforms transform = transform :: transforms let add_named_transforms init named_transforms = List.fold_right named_transforms ~init ~f:(fun named_transform sofar -> add_transform sofar named_transform) let rev_add_named_transforms init named_transforms = List.fold_left named_transforms ~init ~f:add_transform let add_sanitize_transforms init sanitize_transforms = let existing_sanitizers, rest = List.split_while init ~f:TaintTransform.is_sanitize_transform in let existing_sanitizers = List.filter_map existing_sanitizers ~f:TaintTransform.get_sanitize_transform |> SanitizeTransform.Set.of_list in let sanitizers = SanitizeTransform.Set.union sanitize_transforms existing_sanitizers in SanitizeTransform.Set.fold (fun sanitize_transform sofar -> add_transform sofar (TaintTransform.Sanitize sanitize_transform)) sanitizers rest let of_named_transforms = add_named_transforms empty let of_sanitize_transforms = add_sanitize_transforms empty let is_empty = List.is_empty let get_named_transforms = List.filter ~f:TaintTransform.is_named_transform let get_sanitize_transforms transforms = List.take_while transforms ~f:TaintTransform.is_sanitize_transform |> List.filter_map ~f:TaintTransform.get_sanitize_transform |> SanitizeTransform.Set.of_list let discard_sanitize_transforms = List.filter ~f:TaintTransform.is_named_transform let merge ~local ~global = local @ global let show_transforms transforms = List.map transforms ~f:TaintTransform.show |> String.concat ~sep:":" let pp_transforms formatter transforms = Format.fprintf formatter "%s" (show_transforms transforms) let pp_kind ~formatter ~pp_base ~local ~global ~base = if is_empty local then Format.fprintf formatter "%a:%a" pp_transforms global pp_base base else if is_empty global then Format.fprintf formatter "%a@@%a" pp_transforms local pp_base base else Format.fprintf formatter "%a@@%a:%a" pp_transforms local pp_transforms global pp_base base