From d31b041fba9b2729544ac7a534cf5fd77f801d36 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Mon, 8 Feb 2016 03:53:03 -0800 Subject: [PATCH] Replace CRC module with Digest. Reviewed By: jberdine Differential Revision: D2906134 fb-gh-sync-id: 08dd19f --- infer/src/backend/CRC.ml | 62 ------------------------------ infer/src/backend/CRC.mli | 11 ------ infer/src/backend/DB.ml | 15 +------- infer/src/backend/DB.mli | 3 -- infer/src/backend/config.ml | 5 ++- infer/src/backend/procname.ml | 2 +- infer/src/backend/utils.ml | 14 +++++++ infer/src/backend/utils.mli | 8 ++++ infer/src/clang/cFrontend_utils.ml | 6 +-- 9 files changed, 32 insertions(+), 94 deletions(-) delete mode 100644 infer/src/backend/CRC.ml delete mode 100644 infer/src/backend/CRC.mli diff --git a/infer/src/backend/CRC.ml b/infer/src/backend/CRC.ml deleted file mode 100644 index 029061006..000000000 --- a/infer/src/backend/CRC.ml +++ /dev/null @@ -1,62 +0,0 @@ -(* - * Copyright (c) 2009 - 2013 Monoidics ltd. - * Copyright (c) 2013 - 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. - *) - -let vecH = [| - 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; - 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; - 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; - 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; - 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; - 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; - 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; - 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; - 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; - 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; - 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; - 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; - 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; - 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; - 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; - 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; - 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; - 0x40 |] - -let vecL = [| - 0x00; 0xC0; 0xC1; 0x01; 0xC3; 0x03; 0x02; 0xC2; 0xC6; 0x06; 0x07; 0xC7; 0x05; 0xC5; 0xC4; - 0x04; 0xCC; 0x0C; 0x0D; 0xCD; 0x0F; 0xCF; 0xCE; 0x0E; 0x0A; 0xCA; 0xCB; 0x0B; 0xC9; 0x09; - 0x08; 0xC8; 0xD8; 0x18; 0x19; 0xD9; 0x1B; 0xDB; 0xDA; 0x1A; 0x1E; 0xDE; 0xDF; 0x1F; 0xDD; - 0x1D; 0x1C; 0xDC; 0x14; 0xD4; 0xD5; 0x15; 0xD7; 0x17; 0x16; 0xD6; 0xD2; 0x12; 0x13; 0xD3; - 0x11; 0xD1; 0xD0; 0x10; 0xF0; 0x30; 0x31; 0xF1; 0x33; 0xF3; 0xF2; 0x32; 0x36; 0xF6; 0xF7; - 0x37; 0xF5; 0x35; 0x34; 0xF4; 0x3C; 0xFC; 0xFD; 0x3D; 0xFF; 0x3F; 0x3E; 0xFE; 0xFA; 0x3A; - 0x3B; 0xFB; 0x39; 0xF9; 0xF8; 0x38; 0x28; 0xE8; 0xE9; 0x29; 0xEB; 0x2B; 0x2A; 0xEA; 0xEE; - 0x2E; 0x2F; 0xEF; 0x2D; 0xED; 0xEC; 0x2C; 0xE4; 0x24; 0x25; 0xE5; 0x27; 0xE7; 0xE6; 0x26; - 0x22; 0xE2; 0xE3; 0x23; 0xE1; 0x21; 0x20; 0xE0; 0xA0; 0x60; 0x61; 0xA1; 0x63; 0xA3; 0xA2; - 0x62; 0x66; 0xA6; 0xA7; 0x67; 0xA5; 0x65; 0x64; 0xA4; 0x6C; 0xAC; 0xAD; 0x6D; 0xAF; 0x6F; - 0x6E; 0xAE; 0xAA; 0x6A; 0x6B; 0xAB; 0x69; 0xA9; 0xA8; 0x68; 0x78; 0xB8; 0xB9; 0x79; 0xBB; - 0x7B; 0x7A; 0xBA; 0xBE; 0x7E; 0x7F; 0xBF; 0x7D; 0xBD; 0xBC; 0x7C; 0xB4; 0x74; 0x75; 0xB5; - 0x77; 0xB7; 0xB6; 0x76; 0x72; 0xB2; 0xB3; 0x73; 0xB1; 0x71; 0x70; 0xB0; 0x50; 0x90; 0x91; - 0x51; 0x93; 0x53; 0x52; 0x92; 0x96; 0x56; 0x57; 0x97; 0x55; 0x95; 0x94; 0x54; 0x9C; 0x5C; - 0x5D; 0x9D; 0x5F; 0x9F; 0x9E; 0x5E; 0x5A; 0x9A; 0x9B; 0x5B; 0x99; 0x59; 0x58; 0x98; 0x88; - 0x48; 0x49; 0x89; 0x4B; 0x8B; 0x8A; 0x4A; 0x4E; 0x8E; 0x8F; 0x4F; 0x8D; 0x4D; 0x4C; 0x8C; - 0x44; 0x84; 0x85; 0x45; 0x87; 0x47; 0x46; 0x86; 0x82; 0x42; 0x43; 0x83; 0x41; 0x81; 0x80; - 0x40 |] - -let compute_crc16 s cc = - let h = ref 0xFF in - let l = ref 0xFF in - for n = 0 to cc - 1 do - let i = !h lxor Char.code (s.[n]) in - h := !l lxor vecH.(i); - l := vecL.(i) - done; - Printf.sprintf "%02X%02X" !h !l - -let crc16 s = - compute_crc16 s (String.length s) diff --git a/infer/src/backend/CRC.mli b/infer/src/backend/CRC.mli deleted file mode 100644 index bdb31d6e0..000000000 --- a/infer/src/backend/CRC.mli +++ /dev/null @@ -1,11 +0,0 @@ -(* - * Copyright (c) 2009 - 2013 Monoidics ltd. - * Copyright (c) 2013 - 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. - *) - -val crc16 : string -> string diff --git a/infer/src/backend/DB.ml b/infer/src/backend/DB.ml index c74696fb6..b5ceb22da 100644 --- a/infer/src/backend/DB.ml +++ b/infer/src/backend/DB.ml @@ -98,18 +98,7 @@ let source_file_encoding source_file = | Enc_crc -> let base = Filename.basename source_file_s in let dir = Filename.dirname source_file_s in - let crc = CRC.crc16 dir in - base ^ "." ^ crc - -(** covert a long filename to a short ones by truncating the name and adding a hash *) -let get_short_filename filename = - let cutoff_length = 100 in (** if longer than cutoff, cut it and append CRC *) - let name_up_to_cutoff = - if String.length filename <= cutoff_length - then filename - else String.sub filename 0 cutoff_length in - let crc_str = CRC.crc16 filename in - name_up_to_cutoff ^ ":" ^ crc_str + string_append_crc_cutoff ~key:dir base let source_file_empty = Absolute "" @@ -129,7 +118,7 @@ let source_dir_to_string source_dir = source_dir (** get the path to an internal file with the given extention (.cfg, .cg, .tenv) *) let source_dir_get_internal_file source_dir extension = let source_dir_name = - get_short_filename (Filename.chop_extension (Filename.basename source_dir)) in + string_append_crc_cutoff (Filename.chop_extension (Filename.basename source_dir)) in let fname = source_dir_name ^ extension in Filename.concat source_dir fname diff --git a/infer/src/backend/DB.mli b/infer/src/backend/DB.mli index b0bdcb7f3..4aa754986 100644 --- a/infer/src/backend/DB.mli +++ b/infer/src/backend/DB.mli @@ -126,9 +126,6 @@ val source_dir_from_source_file : source_file -> source_dir (** get the path to the copy of the source file to be stored in the results directory *) val source_file_in_resdir : source_file -> filename -(** covert a long filename to a short ones by truncating the name and adding a hash *) -val get_short_filename : string -> string - (** directory where the results of the capture phase are stored *) val captured_dir : unit -> filename diff --git a/infer/src/backend/config.ml b/infer/src/backend/config.ml index 1c1dc855c..12e0828c2 100644 --- a/infer/src/backend/config.ml +++ b/infer/src/backend/config.ml @@ -56,6 +56,9 @@ let models_dir = let lib_specs_dir = Filename.concat lib_dir specs_dir_name in lib_specs_dir +let string_crc_hex32 s = + Digest.to_hex (Digest.string s) + module JarCache = struct let infer_cache : string option ref = ref None @@ -80,7 +83,7 @@ struct match !infer_cache with | Some cache_dir -> let basename = Filename.basename jarfile in - let key = basename ^ CRC.crc16 jarfile in + let key = basename ^ string_crc_hex32 jarfile in let key_dir = Filename.concat cache_dir key in if (mkdir key_dir) diff --git a/infer/src/backend/procname.ml b/infer/src/backend/procname.ml index 6ff7076d8..234989e42 100644 --- a/infer/src/backend/procname.ml +++ b/infer/src/backend/procname.ml @@ -449,7 +449,7 @@ let to_simplified_string ?(withclass = false) p = (** Convert a proc name to a filename *) let to_filename (pn : proc_name) = - DB.get_short_filename (to_unique_id pn) + string_append_crc_cutoff (to_unique_id pn) (** Pretty print a proc name *) let pp f pn = diff --git a/infer/src/backend/utils.ml b/infer/src/backend/utils.ml index 923c103e9..6c47b098c 100644 --- a/infer/src/backend/utils.ml +++ b/infer/src/backend/utils.ml @@ -971,3 +971,17 @@ let analyzer_of_string = function | "checkers" -> Checkers | "tracing" -> Tracing | _ -> raise Unknown_analyzer + + +let string_crc_hex32 = + Config.string_crc_hex32 (* implemented in Config to avoid circularities *) + +let string_append_crc_cutoff ?(cutoff=100) ?(key="") name = + let name_up_to_cutoff = + if String.length name <= cutoff + then name + else String.sub name 0 cutoff in + let crc_str = + let name_for_crc = name ^ key in + string_crc_hex32 name_for_crc in + name_up_to_cutoff ^ "." ^ crc_str diff --git a/infer/src/backend/utils.mli b/infer/src/backend/utils.mli index 8760406af..f9c8c8d29 100644 --- a/infer/src/backend/utils.mli +++ b/infer/src/backend/utils.mli @@ -248,6 +248,14 @@ module Arg : sig end +(** Compute a 32-character hexadecimal crc using the Digest module *) +val string_crc_hex32 : string -> string + +(** Append a crc to the string, using string_crc_hex32. + Cut the string if it exceeds the cutoff limit. + Use an optional key to compute the crc. *) +val string_append_crc_cutoff : ?cutoff:int -> ?key:string -> string -> string + (** Check if the lhs is a substring of the rhs. *) val string_is_prefix : string -> string -> bool diff --git a/infer/src/clang/cFrontend_utils.ml b/infer/src/clang/cFrontend_utils.ml index c00f5401c..ff8a03168 100644 --- a/infer/src/clang/cFrontend_utils.ml +++ b/infer/src/clang/cFrontend_utils.ml @@ -561,7 +561,7 @@ struct if String.length mangled == 0 then Procname.from_string_c_fun name else - let crc = CRC.crc16 mangled in + let crc = string_crc_hex32 mangled in Procname.mangled_c_fun name crc let mk_procname_from_objc_method class_name method_name method_kind = @@ -570,7 +570,7 @@ struct let mk_procname_from_cpp_method class_name method_name tp = let type_name = Ast_utils.string_of_type_ptr tp in - let type_name_crc = Some (CRC.crc16 type_name) in + let type_name_crc = Some (string_crc_hex32 type_name) in Procname.mangled_c_method class_name method_name type_name_crc let get_var_name_string name_info var_decl_info = @@ -598,7 +598,7 @@ struct let start_location = fst decl_info.Clang_ast_t.di_source_range in let line_opt = start_location.Clang_ast_t.sl_line in let line_str = match line_opt with | Some line -> string_of_int line | None -> "" in - let mangled = CRC.crc16 (type_name ^ line_str) in + let mangled = string_crc_hex32 (type_name ^ line_str) in let mangled_name = Mangled.mangled name_string mangled in Sil.mk_pvar mangled_name procname | None -> Sil.mk_pvar (Mangled.from_string name_string) procname