open Core_kernel open Yojson.Basic.Util (** Extracts the symbols to check for from json document. An example looks like this: "CWE467": { "symbols": ["strncmp", "malloc", "alloca", "_alloca", "strncat", "wcsncat", "strncpy", "wcsncpy", "stpncpy", "wcpncpy", "memcpy", "wmemcpy", "memmove", "wmemmove", "memcmp", "wmemcmp"], "_comment": "any function that takes something of type size_t could be a possible candidate." }, *) let get_symbols_from_json (json : Yojson.Basic.t) cwe = [json] |> filter_member cwe |> filter_member "symbols" |> flatten |> List.map ~f:to_string let get_symbol_lists_from_json (json : Yojson.Basic.t) cwe = [json] |> filter_member cwe |> filter_member "pairs" |> flatten |> List.map ~f:(fun l -> List.map (to_list l) ~f:to_string) let get_parameter_list_from_json (json : Yojson.Basic.t) cwe = [json] |> filter_member cwe |> filter_member "parameters" |> flatten |> List.map ~f:to_string let get_arch_from_json (bin_format : Yojson.Basic.t) ?(conv : string = "") (arch : string) : Yojson.Basic.t = match arch with | "x86" -> bin_format |> member arch |> member conv | _ -> bin_format |> member arch let get_bin_format_from_json (json : Yojson.Basic.t) (bin_format : string) : Yojson.Basic.t = json |> member bin_format let get_registers_from_json (arch : Yojson.Basic.t) (context : string) : string list = arch |> member context |> to_list |> filter_string let get_arch_list_from_json (json : Yojson.Basic.t) (bin_format : string) : (string * Yojson.Basic.t) list = json |> member bin_format |> to_assoc