[base] move `Config.language` to its own `Language` module

Summary:
I needed to do this for something, now I don't know if I want to do the thing
anymore but this seems generally useful to decrease a little bit the size of
Config.ml.

Reviewed By: sblackshear, mbouaziz

Differential Revision: D6796427

fbshipit-source-id: d9c009d
master
Jules Villard 7 years ago committed by Facebook Github Bot
parent f999f2ebb7
commit 58e0cbe6ee

@ -26,7 +26,7 @@ let volatile = {class_name= "volatile"; parameters= []}
let final = {class_name= "final"; parameters= []} let final = {class_name= "final"; parameters= []}
(** Pretty print an annotation. *) (** Pretty print an annotation. *)
let prefix = match Config.curr_language_is Config.Java with true -> "@" | false -> "_" let prefix = match Language.curr_language_is Java with true -> "@" | false -> "_"
let pp fmt annotation = F.fprintf fmt "%s%s" prefix annotation.class_name let pp fmt annotation = F.fprintf fmt "%s%s" prefix annotation.class_name

@ -34,9 +34,7 @@ type t =
each expression represents a path, with Dpvar being the simplest one *) each expression represents a path, with Dpvar being the simplest one *)
type vpath = t option type vpath = t option
let java () = Config.equal_language !Config.curr_language Config.Java let eradicate_java () = Config.eradicate && Language.curr_language_is Java
let eradicate_java () = Config.eradicate && java ()
(** convert a dexp to a string *) (** convert a dexp to a string *)
let rec to_string = function let rec to_string = function
@ -87,13 +85,13 @@ let rec to_string = function
(* this->fieldname *) (* this->fieldname *)
Typ.Fieldname.to_simplified_string f Typ.Fieldname.to_simplified_string f
| Darrow (de, f) -> | Darrow (de, f) ->
if java () then to_string de ^ "." ^ Typ.Fieldname.to_flat_string f if Language.curr_language_is Java then to_string de ^ "." ^ Typ.Fieldname.to_flat_string f
else to_string de ^ "->" ^ Typ.Fieldname.to_string f else to_string de ^ "->" ^ Typ.Fieldname.to_string f
| Ddot (Dpvar _, fe) when eradicate_java () -> | Ddot (Dpvar _, fe) when eradicate_java () ->
(* static field access *) (* static field access *)
Typ.Fieldname.to_simplified_string fe Typ.Fieldname.to_simplified_string fe
| Ddot (de, f) -> | Ddot (de, f) ->
if java () then to_string de ^ "." ^ Typ.Fieldname.to_flat_string f if Language.curr_language_is Java then to_string de ^ "." ^ Typ.Fieldname.to_flat_string f
else to_string de ^ "." ^ Typ.Fieldname.to_string f else to_string de ^ "." ^ Typ.Fieldname.to_string f
| Dpvar pv -> | Dpvar pv ->
Mangled.to_string (Pvar.get_name pv) Mangled.to_string (Pvar.get_name pv)

@ -240,8 +240,7 @@ let log_issue err_kind err_log loc (node_id, node_key) session ltr ?linters_def_
let err_kind = match error.kind with Some err_kind -> err_kind | _ -> err_kind in let err_kind = match error.kind with Some err_kind -> err_kind | _ -> err_kind in
let hide_java_loc_zero = let hide_java_loc_zero =
(* hide java errors at location zero unless in -developer_mode *) (* hide java errors at location zero unless in -developer_mode *)
not Config.developer_mode && Config.curr_language_is Config.Java not Config.developer_mode && Language.curr_language_is Java && Int.equal loc.Location.line 0
&& Int.equal loc.Location.line 0
in in
let hide_memory_error = let hide_memory_error =
match Localise.error_desc_get_bucket error.description with match Localise.error_desc_get_bucket error.description with

@ -243,7 +243,7 @@ let add_by_call_to_opt problem_str tags proc_name_opt =
let rec format_typ typ = let rec format_typ typ =
match typ.Typ.desc with match typ.Typ.desc with
| Typ.Tptr (t, _) when Config.curr_language_is Config.Java -> | Typ.Tptr (t, _) when Language.curr_language_is Java ->
format_typ t format_typ t
| Typ.Tstruct name -> | Typ.Tstruct name ->
Typ.Name.name name Typ.Name.name name
@ -252,7 +252,7 @@ let rec format_typ typ =
let format_field f = let format_field f =
if Config.curr_language_is Config.Java then Typ.Fieldname.Java.get_field f if Language.curr_language_is Java then Typ.Fieldname.Java.get_field f
else Typ.Fieldname.to_string f else Typ.Fieldname.to_string f
@ -279,7 +279,7 @@ type deref_str =
; value_post: string option (** string printed after the value being dereferenced *) ; value_post: string option (** string printed after the value being dereferenced *)
; problem_str: string (** description of the problem *) } ; problem_str: string (** description of the problem *) }
let pointer_or_object () = if Config.curr_language_is Config.Java then "object" else "pointer" let pointer_or_object () = if Language.curr_language_is Java then "object" else "pointer"
let deref_str_null_ proc_name_opt problem_str_ tags = let deref_str_null_ proc_name_opt problem_str_ tags =
let problem_str = add_by_call_to_opt problem_str_ tags proc_name_opt in let problem_str = add_by_call_to_opt problem_str_ tags proc_name_opt in

@ -130,6 +130,6 @@ let language_is tenv lang =
| () -> | () ->
false false
| exception Found JavaClass _ -> | exception Found JavaClass _ ->
Config.equal_language lang Java Language.equal lang Java
| exception Found _ -> | exception Found _ ->
Config.equal_language lang Clang Language.equal lang Clang

@ -46,5 +46,5 @@ val sort_fields_tenv : t -> unit
val pp : Format.formatter -> t -> unit [@@warning "-32"] val pp : Format.formatter -> t -> unit [@@warning "-32"]
(** print a type environment *) (** print a type environment *)
val language_is : t -> Config.language -> bool val language_is : t -> Language.t -> bool
(** Test the language from which the types in the tenv were translated *) (** Test the language from which the types in the tenv were translated *)

@ -835,17 +835,17 @@ module Procname = struct
(** Return the language of the procedure. *) (** Return the language of the procedure. *)
let get_language = function let get_language = function
| ObjC_Cpp _ -> | ObjC_Cpp _ ->
Config.Clang Language.Clang
| C _ -> | C _ ->
Config.Clang Language.Clang
| Block _ -> | Block _ ->
Config.Clang Language.Clang
| Linters_dummy_method -> | Linters_dummy_method ->
Config.Clang Language.Clang
| WithBlockParameters _ -> | WithBlockParameters _ ->
Config.Clang Language.Clang
| Java _ -> | Java _ ->
Config.Java Language.Java
let is_objc_constructor method_name = let is_objc_constructor method_name =

@ -407,7 +407,7 @@ module Procname : sig
val from_string_c_fun : string -> t val from_string_c_fun : string -> t
(** Convert a string to a proc name. *) (** Convert a string to a proc name. *)
val get_language : t -> Config.language val get_language : t -> Language.t
(** Return the language of the procedure. *) (** Return the language of the procedure. *)
val get_method : t -> string val get_method : t -> string

@ -38,7 +38,7 @@ let mk_empty_array_rearranged len =
let extract_array_type typ = let extract_array_type typ =
if Config.curr_language_is Config.Java then if Language.curr_language_is Java then
match typ.Typ.desc with Typ.Tptr (({Typ.desc= Tarray _} as arr), _) -> Some arr | _ -> None match typ.Typ.desc with Typ.Tptr (({Typ.desc= Tarray _} as arr), _) -> Some arr | _ -> None
else else
match typ.Typ.desc with match typ.Typ.desc with
@ -270,7 +270,7 @@ let execute___instanceof_cast ~instof {Builtin.pdesc; tenv; prop_; path; ret_id;
in in
(* In Java, we throw an exception, in C++ we return 0 in case of a cast to a pointer, *) (* In Java, we throw an exception, in C++ we return 0 in case of a cast to a pointer, *)
(* and throw an exception in case of a cast to a reference. *) (* and throw an exception in case of a cast to a reference. *)
let should_throw_exception = Config.curr_language_is Config.Java || is_cast_to_reference in let should_throw_exception = Language.curr_language_is Java || is_cast_to_reference in
let deal_with_failed_cast val1 texp1 texp2 = let deal_with_failed_cast val1 texp1 texp2 =
raise (Tabulation.create_cast_exception tenv __POS__ None texp1 texp2 val1) raise (Tabulation.create_cast_exception tenv __POS__ None texp1 texp2 val1)
in in

@ -138,8 +138,8 @@ let remove_abduced_retvars tenv p =
let remove_locals tenv (curr_f: Procdesc.t) p = let remove_locals tenv (curr_f: Procdesc.t) p =
let names_of_locals = List.map ~f:(get_name_of_local curr_f) (Procdesc.get_locals curr_f) in let names_of_locals = List.map ~f:(get_name_of_local curr_f) (Procdesc.get_locals curr_f) in
let names_of_locals' = let names_of_locals' =
match !Config.curr_language with match !Language.curr_language with
| Config.Clang -> | Language.Clang ->
(* in ObjC to deal with block we need to remove static locals *) (* in ObjC to deal with block we need to remove static locals *)
let names_of_static_locals = get_name_of_objc_static_locals curr_f p in let names_of_static_locals = get_name_of_objc_static_locals curr_f p in
let names_of_block_locals = get_name_of_objc_block_locals p in let names_of_block_locals = get_name_of_objc_block_locals p in

@ -1090,7 +1090,7 @@ let check_junk ?original_prop pname tenv prop =
let ml_bucket_opt = let ml_bucket_opt =
match resource with match resource with
| (PredSymb.Rmemory PredSymb.Mnew | PredSymb.Rmemory PredSymb.Mnew_array) | (PredSymb.Rmemory PredSymb.Mnew | PredSymb.Rmemory PredSymb.Mnew_array)
when Config.curr_language_is Config.Clang -> when Language.curr_language_is Clang ->
Mleak_buckets.should_raise_cpp_leak Mleak_buckets.should_raise_cpp_leak
| _ -> | _ ->
None None
@ -1115,10 +1115,10 @@ let check_junk ?original_prop pname tenv prop =
| None -> | None ->
(true, exn_leak) ) (true, exn_leak) )
| (Some _, Rmemory Mnew | Some _, Rmemory Mnew_array) | (Some _, Rmemory Mnew | Some _, Rmemory Mnew_array)
when Config.curr_language_is Config.Clang -> when Language.curr_language_is Clang ->
(is_none ml_bucket_opt, exn_leak) (is_none ml_bucket_opt, exn_leak)
| Some _, Rmemory _ -> | Some _, Rmemory _ ->
(Config.curr_language_is Config.Java, exn_leak) (Language.curr_language_is Java, exn_leak)
| Some _, Rignore -> | Some _, Rignore ->
(true, exn_leak) (true, exn_leak)
| Some _, Rfile when Config.tracing -> | Some _, Rfile when Config.tracing ->
@ -1137,9 +1137,9 @@ let check_junk ?original_prop pname tenv prop =
| Some exn -> | Some exn ->
(false, exn) (false, exn)
| None -> | None ->
(Config.curr_language_is Config.Java, exn_leak) ) (Language.curr_language_is Java, exn_leak) )
| _ -> | _ ->
(Config.curr_language_is Config.Java, exn_leak) (Language.curr_language_is Java, exn_leak)
in in
let already_reported () = let already_reported () =
let attr_opt_equal ao1 ao2 = let attr_opt_equal ao1 ao2 =
@ -1158,7 +1158,7 @@ let check_junk ?original_prop pname tenv prop =
let ignore_leak = let ignore_leak =
!Config.allow_leak || ignore_resource || is_undefined || already_reported () !Config.allow_leak || ignore_resource || is_undefined || already_reported ()
in in
let report_and_continue = Config.curr_language_is Config.Java || !Config.footprint in let report_and_continue = Language.curr_language_is Java || !Config.footprint in
let report_leak () = let report_leak () =
if not report_and_continue then raise exn if not report_and_continue then raise exn
else ( else (

@ -81,7 +81,7 @@ let check_access access_opt de_opt =
let formal_ids = ref [] in let formal_ids = ref [] in
let process_formal_letref = function let process_formal_letref = function
| Sil.Load (id, Exp.Lvar pvar, _, _) -> | Sil.Load (id, Exp.Lvar pvar, _, _) ->
let is_java_this = Config.curr_language_is Config.Java && Pvar.is_this pvar in let is_java_this = Language.curr_language_is Java && Pvar.is_this pvar in
if not is_java_this && is_formal pvar then formal_ids := id :: !formal_ids if not is_java_this && is_formal pvar then formal_ids := id :: !formal_ids
| _ -> | _ ->
() ()

@ -46,13 +46,15 @@ let get_procedure_definition exe_env proc_name =
Option.map ~f:(fun proc_desc -> (tenv, proc_desc)) (Exe_env.get_proc_desc exe_env proc_name) Option.map ~f:(fun proc_desc -> (tenv, proc_desc)) (Exe_env.get_proc_desc exe_env proc_name)
let get_language proc_name = if Typ.Procname.is_java proc_name then Config.Java else Config.Clang let get_language proc_name =
if Typ.Procname.is_java proc_name then Language.Java else Language.Clang
(** Invoke all registered procedure callbacks on the given procedure. *) (** Invoke all registered procedure callbacks on the given procedure. *)
let iterate_procedure_callbacks get_proc_desc exe_env summary proc_desc = let iterate_procedure_callbacks get_proc_desc exe_env summary proc_desc =
let proc_name = Procdesc.get_proc_name proc_desc in let proc_name = Procdesc.get_proc_name proc_desc in
let procedure_language = get_language proc_name in let procedure_language = get_language proc_name in
Config.curr_language := procedure_language ; Language.curr_language := procedure_language ;
let get_procs_in_file proc_name = let get_procs_in_file proc_name =
match Exe_env.get_cfg exe_env proc_name with match Exe_env.get_cfg exe_env proc_name with
| Some cfg -> | Some cfg ->
@ -64,7 +66,7 @@ let iterate_procedure_callbacks get_proc_desc exe_env summary proc_desc =
let is_specialized = Procdesc.is_specialized proc_desc in let is_specialized = Procdesc.is_specialized proc_desc in
List.fold ~init:summary List.fold ~init:summary
~f:(fun summary (language, resolved, proc_callback) -> ~f:(fun summary (language, resolved, proc_callback) ->
if Config.equal_language language procedure_language && (resolved || not is_specialized) then if Language.equal language procedure_language && (resolved || not is_specialized) then
proc_callback {get_proc_desc; get_procs_in_file; tenv; summary; proc_desc} proc_callback {get_proc_desc; get_procs_in_file; tenv; summary; proc_desc}
else summary ) else summary )
!procedure_callbacks !procedure_callbacks
@ -77,7 +79,7 @@ let iterate_cluster_callbacks all_procs exe_env get_proc_desc =
let language_matches language = let language_matches language =
match procedures with match procedures with
| (_, pdesc) :: _ -> | (_, pdesc) :: _ ->
Config.equal_language language (get_language (Procdesc.get_proc_name pdesc)) Language.equal language (get_language (Procdesc.get_proc_name pdesc))
| _ -> | _ ->
true true
in in
@ -118,7 +120,7 @@ let dump_duplicate_procs (exe_env: Exe_env.t) procs =
(** Invoke all procedure and cluster callbacks on a given environment. *) (** Invoke all procedure and cluster callbacks on a given environment. *)
let iterate_callbacks (exe_env: Exe_env.t) = let iterate_callbacks (exe_env: Exe_env.t) =
let saved_language = !Config.curr_language in let saved_language = !Language.curr_language in
let get_proc_desc proc_name = let get_proc_desc proc_name =
match Exe_env.get_proc_desc exe_env proc_name with match Exe_env.get_proc_desc exe_env proc_name with
| Some _ as pdesc_opt -> | Some _ as pdesc_opt ->
@ -146,4 +148,4 @@ let iterate_callbacks (exe_env: Exe_env.t) =
iterate_cluster_callbacks procs_to_analyze exe_env get_proc_desc ; iterate_cluster_callbacks procs_to_analyze exe_env get_proc_desc ;
(* Unregister callbacks *) (* Unregister callbacks *)
Ondemand.unset_callbacks () ; Ondemand.unset_callbacks () ;
Config.curr_language := saved_language Language.curr_language := saved_language

@ -30,11 +30,10 @@ type cluster_callback_args =
type cluster_callback_t = cluster_callback_args -> unit type cluster_callback_t = cluster_callback_args -> unit
val register_procedure_callback : val register_procedure_callback : ?dynamic_dispath:bool -> Language.t -> proc_callback_t -> unit
?dynamic_dispath:bool -> Config.language -> proc_callback_t -> unit
(** register a procedure callback *) (** register a procedure callback *)
val register_cluster_callback : Config.language -> cluster_callback_t -> unit val register_cluster_callback : Language.t -> cluster_callback_t -> unit
(** register a cluster callback *) (** register a cluster callback *)
val iterate_callbacks : Exe_env.t -> unit val iterate_callbacks : Exe_env.t -> unit

@ -729,7 +729,7 @@ let access_opt ?(is_nullable= false) inst =
Some (Localise.Last_accessed (n, is_nullable)) Some (Localise.Last_accessed (n, is_nullable))
| Sil.Ireturn_from_call n -> | Sil.Ireturn_from_call n ->
Some (Localise.Returned_from_call n) Some (Localise.Returned_from_call n)
| Sil.Ialloc when Config.curr_language_is Config.Java -> | Sil.Ialloc when Language.curr_language_is Java ->
Some Localise.Initialized_automatically Some Localise.Initialized_automatically
| inst -> | inst ->
if verbose then if verbose then
@ -913,7 +913,7 @@ let create_dereference_desc proc_name tenv ?(use_buckets= false) ?(outermost_arr
in in
let desc = Localise.dereference_string proc_name deref_str value_str access_opt' loc in let desc = Localise.dereference_string proc_name deref_str value_str access_opt' loc in
let desc = let desc =
if Config.curr_language_is Config.Clang && not is_premature_nil then if Language.curr_language_is Clang && not is_premature_nil then
match de_opt with match de_opt with
| Some DExp.Dpvar pvar | Some DExp.Dpvaraddr pvar -> ( | Some DExp.Dpvar pvar | Some DExp.Dpvaraddr pvar -> (
match Attribute.get_objc_null tenv prop (Exp.Lvar pvar) with match Attribute.get_objc_null tenv prop (Exp.Lvar pvar) with

@ -48,7 +48,7 @@ let is_matching patterns source_file =
(** Check if a proc name is matching the name given as string. *) (** Check if a proc name is matching the name given as string. *)
let match_method language proc_name method_name = let match_method language proc_name method_name =
not (BuiltinDecl.is_declared proc_name) not (BuiltinDecl.is_declared proc_name)
&& Config.equal_language (Typ.Procname.get_language proc_name) language && Language.equal (Typ.Procname.get_language proc_name) language
&& String.equal (Typ.Procname.get_method proc_name) method_name && String.equal (Typ.Procname.get_method proc_name) method_name
@ -89,8 +89,8 @@ type method_pattern =
{class_name: string; method_name: string option; parameters: string list option} {class_name: string; method_name: string option; parameters: string list option}
type pattern = type pattern =
| Method_pattern of Config.language * method_pattern | Method_pattern of Language.t * method_pattern
| Source_contains of Config.language * string | Source_contains of Language.t * string
(* Module to create matcher based on source file names or class names and method names *) (* Module to create matcher based on source file names or class names and method names *)
module FileOrProcMatcher = struct module FileOrProcMatcher = struct
@ -163,12 +163,10 @@ module FileOrProcMatcher = struct
and pp_source_contains fmt sc = Format.fprintf fmt " pattern: %s@\n" sc in and pp_source_contains fmt sc = Format.fprintf fmt " pattern: %s@\n" sc in
match pattern with match pattern with
| Method_pattern (language, mp) -> | Method_pattern (language, mp) ->
Format.fprintf fmt "Method pattern (%s) {@\n%a}@\n" Format.fprintf fmt "Method pattern (%s) {@\n%a}@\n" (Language.to_string language)
(Config.string_of_language language)
pp_method_pattern mp pp_method_pattern mp
| Source_contains (language, sc) -> | Source_contains (language, sc) ->
Format.fprintf fmt "Source contains (%s) {@\n%a}@\n" Format.fprintf fmt "Source contains (%s) {@\n%a}@\n" (Language.to_string language)
(Config.string_of_language language)
pp_source_contains sc pp_source_contains sc
end end
@ -189,11 +187,12 @@ end
let patterns_of_json_with_key (json_key, json) = let patterns_of_json_with_key (json_key, json) =
let default_method_pattern = {class_name= ""; method_name= None; parameters= None} in let default_method_pattern = {class_name= ""; method_name= None; parameters= None} in
let default_source_contains = "" in let default_source_contains = "" in
let language_of_string = function let language_of_string s =
| "Java" -> match Language.of_string s with
Ok Config.Java | Some Language.Java ->
| l -> Ok Language.Java
Error ("JSON key " ^ json_key ^ " not supported for language " ^ l) | _ ->
Error ("JSON key " ^ json_key ^ " not supported for language " ^ s)
in in
let rec detect_language = function let rec detect_language = function
| [] -> | [] ->

@ -674,7 +674,7 @@ let extract_specs tenv pdesc pathset : Prop.normal Specs.spec list =
let prop'' = Abs.abstract pname tenv prop' in let prop'' = Abs.abstract pname tenv prop' in
let pre, post = Prop.extract_spec prop'' in let pre, post = Prop.extract_spec prop'' in
let pre' = Prop.normalize tenv (Prop.prop_sub (`Exp sub) pre) in let pre' = Prop.normalize tenv (Prop.prop_sub (`Exp sub) pre) in
if Config.curr_language_is Config.Java && Procdesc.get_access pdesc <> PredSymb.Private then if Language.curr_language_is Java && Procdesc.get_access pdesc <> PredSymb.Private then
report_context_leaks pname post.Prop.sigma tenv ; report_context_leaks pname post.Prop.sigma tenv ;
let post' = let post' =
if Prover.check_inconsistency_base tenv prop then None if Prover.check_inconsistency_base tenv prop then None
@ -782,12 +782,12 @@ let prop_init_formals_seed tenv new_formals (prop: 'a Prop.t) : Prop.exposed Pro
let sigma_new_formals = let sigma_new_formals =
let do_formal (pv, typ) = let do_formal (pv, typ) =
let texp = let texp =
match !Config.curr_language with match !Language.curr_language with
| Config.Clang -> | Clang ->
Exp.Sizeof {typ; nbytes= None; dynamic_length= None; subtype= Subtype.exact} Exp.Sizeof {typ; nbytes= None; dynamic_length= None; subtype= Subtype.exact}
| Config.Java -> | Java ->
Exp.Sizeof {typ; nbytes= None; dynamic_length= None; subtype= Subtype.subtypes} Exp.Sizeof {typ; nbytes= None; dynamic_length= None; subtype= Subtype.subtypes}
| Config.Python -> | Python ->
L.die InternalError "prop_init_formals_seed not implemented for Python" L.die InternalError "prop_init_formals_seed not implemented for Python"
in in
Prop.mk_ptsto_lvar tenv Prop.Fld_init Sil.inst_formal (pv, texp, None) Prop.mk_ptsto_lvar tenv Prop.Fld_init Sil.inst_formal (pv, texp, None)
@ -991,7 +991,7 @@ let perform_analysis_phase tenv (summary: Specs.summary) (proc_cfg: ProcCfg.Exce
let set_current_language proc_desc = let set_current_language proc_desc =
let language = Typ.Procname.get_language (Procdesc.get_proc_name proc_desc) in let language = Typ.Procname.get_language (Procdesc.get_proc_name proc_desc) in
Config.curr_language := language Language.curr_language := language
(** reset global values before analysing a procedure *) (** reset global values before analysing a procedure *)
@ -1038,7 +1038,7 @@ let custom_error_preconditions summary =
let remove_this_not_null tenv prop = let remove_this_not_null tenv prop =
let collect_hpred (var_option, hpreds) = function let collect_hpred (var_option, hpreds) = function
| Sil.Hpointsto (Exp.Lvar pvar, Sil.Eexp (Exp.Var var, _), _) | Sil.Hpointsto (Exp.Lvar pvar, Sil.Eexp (Exp.Var var, _), _)
when Config.curr_language_is Config.Java && Pvar.is_this pvar -> when Language.curr_language_is Java && Pvar.is_this pvar ->
(Some var, hpreds) (Some var, hpreds)
| hpred -> | hpred ->
(var_option, hpred :: hpreds) (var_option, hpred :: hpreds)
@ -1212,9 +1212,9 @@ let analyze_proc tenv proc_cfg : Specs.summary =
let res = Timeout.exe_timeout go () in let res = Timeout.exe_timeout go () in
let specs, phase = get_results () in let specs, phase = get_results () in
let updated_summary = update_summary tenv summary specs phase res in let updated_summary = update_summary tenv summary specs phase res in
if Config.curr_language_is Config.Clang && Config.report_custom_error then if Language.curr_language_is Clang && Config.report_custom_error then
report_custom_errors tenv updated_summary ; report_custom_errors tenv updated_summary ;
if Config.curr_language_is Config.Java && Config.tracing then if Language.curr_language_is Java && Config.tracing then
report_runtime_exceptions tenv proc_desc updated_summary ; report_runtime_exceptions tenv proc_desc updated_summary ;
updated_summary updated_summary

@ -455,7 +455,7 @@ let rec create_strexp_of_type ~path tenv struct_init_mode (typ: Typ.t) len inst
in in
Exp.Var fresh_id Exp.Var fresh_id
in in
if Config.curr_language_is Config.Java && Sil.equal_inst inst Sil.Ialloc then if Language.curr_language_is Java && Sil.equal_inst inst Sil.Ialloc then
match typ.desc with Tfloat _ -> Exp.Const (Cfloat 0.0) | _ -> Exp.zero match typ.desc with Tfloat _ -> Exp.Const (Cfloat 0.0) | _ -> Exp.zero
else create_fresh_var () else create_fresh_var ()
in in
@ -724,10 +724,10 @@ module Normalize = struct
| Sizeof {nbytes= Some n} when destructive -> | Sizeof {nbytes= Some n} when destructive ->
Exp.Const (Const.Cint (IntLit.of_int n)) Exp.Const (Const.Cint (IntLit.of_int n))
| Sizeof {typ= {desc= Tarray ({desc= Tint ik}, _, _)}; dynamic_length= Some l} | Sizeof {typ= {desc= Tarray ({desc= Tint ik}, _, _)}; dynamic_length= Some l}
when Typ.ikind_is_char ik && Config.curr_language_is Config.Clang -> when Typ.ikind_is_char ik && Language.curr_language_is Clang ->
eval l eval l
| Sizeof {typ= {desc= Tarray ({desc= Tint ik}, Some l, _)}} | Sizeof {typ= {desc= Tarray ({desc= Tint ik}, Some l, _)}}
when Typ.ikind_is_char ik && Config.curr_language_is Config.Clang -> when Typ.ikind_is_char ik && Language.curr_language_is Clang ->
Const (Cint l) Const (Cint l)
| Sizeof _ -> | Sizeof _ ->
e e

@ -992,14 +992,14 @@ let check_inconsistency_base tenv prop =
| Some (_, _, pdesc) -> | Some (_, _, pdesc) ->
let procedure_attr = Procdesc.get_attributes pdesc in let procedure_attr = Procdesc.get_attributes pdesc in
let language = Typ.Procname.get_language (Procdesc.get_proc_name pdesc) in let language = Typ.Procname.get_language (Procdesc.get_proc_name pdesc) in
let is_java_this pvar = Config.equal_language language Config.Java && Pvar.is_this pvar in let is_java_this pvar = Language.equal language Java && Pvar.is_this pvar in
let is_objc_instance_self pvar = let is_objc_instance_self pvar =
Config.equal_language language Config.Clang Language.equal language Clang
&& Mangled.equal (Pvar.get_name pvar) (Mangled.from_string "self") && Mangled.equal (Pvar.get_name pvar) (Mangled.from_string "self")
&& procedure_attr.ProcAttributes.is_objc_instance_method && procedure_attr.ProcAttributes.is_objc_instance_method
in in
let is_cpp_this pvar = let is_cpp_this pvar =
Config.equal_language language Config.Clang && Pvar.is_this pvar Language.equal language Clang && Pvar.is_this pvar
&& procedure_attr.ProcAttributes.is_cpp_instance_method && procedure_attr.ProcAttributes.is_cpp_instance_method
in in
let do_hpred = function let do_hpred = function
@ -2329,10 +2329,10 @@ and sigma_imply tenv calc_index_frame calc_missing subs prop1 sigma2 : subst2 *
let root = Exp.Const (Const.Cstr s) in let root = Exp.Const (Const.Cstr s) in
let sexp = let sexp =
let index = Exp.int (IntLit.of_int (String.length s)) in let index = Exp.int (IntLit.of_int (String.length s)) in
match !Config.curr_language with match !Language.curr_language with
| Config.Clang -> | Clang ->
Sil.Earray (Exp.int len, [(index, Sil.Eexp (Exp.zero, Sil.inst_none))], Sil.inst_none) Sil.Earray (Exp.int len, [(index, Sil.Eexp (Exp.zero, Sil.inst_none))], Sil.inst_none)
| Config.Java -> | Java ->
let mk_fld_sexp s = let mk_fld_sexp s =
let fld = Typ.Fieldname.Java.from_string s in let fld = Typ.Fieldname.Java.from_string s in
let se = Sil.Eexp (Exp.Var (Ident.create_fresh Ident.kprimed), Sil.Inone) in let se = Sil.Eexp (Exp.Var (Ident.create_fresh Ident.kprimed), Sil.Inone) in
@ -2345,25 +2345,25 @@ and sigma_imply tenv calc_index_frame calc_missing subs prop1 sigma2 : subst2 *
; "java.lang.String.value" ] ; "java.lang.String.value" ]
in in
Sil.Estruct (List.map ~f:mk_fld_sexp fields, Sil.inst_none) Sil.Estruct (List.map ~f:mk_fld_sexp fields, Sil.inst_none)
| Config.Python -> | Python ->
L.die InternalError "mk_constant_string_hpred not implemented for Python" L.die InternalError "mk_constant_string_hpred not implemented for Python"
in in
let const_string_texp = let const_string_texp =
match !Config.curr_language with match !Language.curr_language with
| Config.Clang -> | Clang ->
Exp.Sizeof Exp.Sizeof
{ typ= Typ.mk (Tarray (Typ.mk (Tint Typ.IChar), Some len, Some (IntLit.of_int 1))) { typ= Typ.mk (Tarray (Typ.mk (Tint Typ.IChar), Some len, Some (IntLit.of_int 1)))
; nbytes= None ; nbytes= None
; dynamic_length= None ; dynamic_length= None
; subtype= Subtype.exact } ; subtype= Subtype.exact }
| Config.Java -> | Java ->
let object_type = Typ.Name.Java.from_string "java.lang.String" in let object_type = Typ.Name.Java.from_string "java.lang.String" in
Exp.Sizeof Exp.Sizeof
{ typ= Typ.mk (Tstruct object_type) { typ= Typ.mk (Tstruct object_type)
; nbytes= None ; nbytes= None
; dynamic_length= None ; dynamic_length= None
; subtype= Subtype.exact } ; subtype= Subtype.exact }
| Config.Python -> | Python ->
L.die InternalError "const_string_texp not implemented for Python" L.die InternalError "const_string_texp not implemented for Python"
in in
Sil.Hpointsto (root, sexp, const_string_texp) Sil.Hpointsto (root, sexp, const_string_texp)

@ -471,12 +471,12 @@ let mk_ptsto_exp_footprint pname tenv orig_prop (lexp, typ) max_stamp inst
raise (Exceptions.Dangling_pointer_dereference (None, err_desc, __POS__)) ) ; raise (Exceptions.Dangling_pointer_dereference (None, err_desc, __POS__)) ) ;
let off_foot, eqs = laundry_offset_for_footprint max_stamp off in let off_foot, eqs = laundry_offset_for_footprint max_stamp off in
let subtype = let subtype =
match !Config.curr_language with match !Language.curr_language with
| Config.Clang -> | Clang ->
Subtype.exact Subtype.exact
| Config.Java -> | Java ->
Subtype.subtypes Subtype.subtypes
| Config.Python -> | Python ->
L.die InternalError "Subtypes for Python not implemented" L.die InternalError "Subtypes for Python not implemented"
in in
let create_ptsto footprint_part off0 = let create_ptsto footprint_part off0 =
@ -1719,8 +1719,7 @@ let check_call_to_objc_block_error tenv pdesc prop fun_exp loc =
| _ -> | _ ->
(None, false) (None, false)
in in
if Config.curr_language_is Config.Clang && fun_exp_may_be_null () if Language.curr_language_is Clang && fun_exp_may_be_null () && not (is_fun_exp_captured_var ())
&& not (is_fun_exp_captured_var ())
then then
let deref_str = Localise.deref_str_null None in let deref_str = Localise.deref_str_null None in
let err_desc_nobuckets = let err_desc_nobuckets =

@ -46,7 +46,7 @@ let log_issue_from_summary err_kind summary ?loc ?node_id ?session ?ltr ?linters
false false
in in
let should_suppress_lint = let should_suppress_lint =
Config.curr_language_is Config.Java Language.curr_language_is Java
&& Annotations.ia_is_suppress_lint && Annotations.ia_is_suppress_lint
(fst (Specs.get_attributes summary).ProcAttributes.method_annotation) (fst (Specs.get_attributes summary).ProcAttributes.method_annotation)
in in

@ -514,7 +514,7 @@ let check_deallocate_static_memory prop_after =
let method_exists right_proc_name methods = let method_exists right_proc_name methods =
if Config.curr_language_is Config.Java then if Language.curr_language_is Java then
List.exists ~f:(fun meth_name -> Typ.Procname.equal right_proc_name meth_name) methods List.exists ~f:(fun meth_name -> Typ.Procname.equal right_proc_name meth_name) methods
else else
(* ObjC/C++ case : The attribute map will only exist when we have code for the method or (* ObjC/C++ case : The attribute map will only exist when we have code for the method or
@ -611,7 +611,7 @@ let resolve_virtual_pname tenv prop actuals callee_pname call_flags : Typ.Procna
[callee_pname] [callee_pname]
| (receiver_exp, actual_receiver_typ) :: _ | (receiver_exp, actual_receiver_typ) :: _
-> ( -> (
if !Config.curr_language <> Config.Java then if !Language.curr_language <> Language.Java then
(* default mode for Obj-C/C++/Java virtual calls: resolution only *) (* default mode for Obj-C/C++/Java virtual calls: resolution only *)
[do_resolve callee_pname receiver_exp actual_receiver_typ] [do_resolve callee_pname receiver_exp actual_receiver_typ]
else else
@ -1135,7 +1135,8 @@ let rec sym_exec tenv current_pdesc instr_ (prop_: Prop.normal Prop.t) path
| Sil.Prune (cond, loc, true_branch, ik) -> | Sil.Prune (cond, loc, true_branch, ik) ->
let prop__ = Attribute.nullify_exp_with_objc_null tenv prop_ cond in let prop__ = Attribute.nullify_exp_with_objc_null tenv prop_ cond in
let check_condition_always_true_false () = let check_condition_always_true_false () =
if !Config.curr_language <> Config.Clang || Config.report_condition_always_true_in_clang if !Language.curr_language <> Language.Clang
|| Config.report_condition_always_true_in_clang
then then
let report_condition_always_true_false i = let report_condition_always_true_false i =
let skip_loop = let skip_loop =
@ -1256,7 +1257,7 @@ let rec sym_exec tenv current_pdesc instr_ (prop_: Prop.normal Prop.t) path
let callee_pdesc_opt = Ondemand.get_proc_desc resolved_pname in let callee_pdesc_opt = Ondemand.get_proc_desc resolved_pname in
let ret_typ_opt = Option.map ~f:Procdesc.get_ret_type callee_pdesc_opt in let ret_typ_opt = Option.map ~f:Procdesc.get_ret_type callee_pdesc_opt in
let sentinel_result = let sentinel_result =
if Config.curr_language_is Config.Clang then if Language.curr_language_is Clang then
check_variadic_sentinel_if_present check_variadic_sentinel_if_present
(call_args prop_r callee_pname actual_params ret_id loc) (call_args prop_r callee_pname actual_params ret_id loc)
else [(prop_r, path)] else [(prop_r, path)]
@ -1746,7 +1747,7 @@ and proc_call callee_summary
(* In case we call an objc instance method we add and extra spec *) (* In case we call an objc instance method we add and extra spec *)
(* were the receiver is null and the semantics of the call is nop*) (* were the receiver is null and the semantics of the call is nop*)
(* let callee_attrs = Specs.get_attributes callee_summary in *) (* let callee_attrs = Specs.get_attributes callee_summary in *)
if !Config.curr_language <> Config.Java if !Language.curr_language <> Language.Java
&& (Specs.get_attributes callee_summary).ProcAttributes.is_objc_instance_method && (Specs.get_attributes callee_summary).ProcAttributes.is_objc_instance_method
then then
handle_objc_instance_method_call actual_pars actual_params pre tenv ret_id pdesc callee_pname handle_objc_instance_method_call actual_pars actual_params pre tenv ret_id pdesc callee_pname

@ -985,8 +985,7 @@ let mk_posts tenv ret_id_opt prop callee_pname posts =
List.filter ~f:(fun (prop, _) -> not (returns_null prop)) posts List.filter ~f:(fun (prop, _) -> not (returns_null prop)) posts
else posts else posts
in in
if Config.idempotent_getters && Config.curr_language_is Config.Java then if Config.idempotent_getters && Language.curr_language_is Java then mk_getter_idempotent posts
mk_getter_idempotent posts
else posts else posts
@ -1327,8 +1326,7 @@ let exe_call_postprocess tenv ret_id trace_call callee_pname callee_attrs loc re
| _ -> | _ ->
false false
in in
Config.idempotent_getters && Config.curr_language_is Config.Java Config.idempotent_getters && Language.curr_language_is Java && is_likely_getter callee_pname
&& is_likely_getter callee_pname
|| returns_nullable ret_annot || returns_nullable ret_annot
in in
match ret_id with match ret_id with

@ -45,12 +45,6 @@ let clang_frontend_action_symbols =
[("lint", `Lint); ("capture", `Capture); ("lint_and_capture", `Lint_and_capture)] [("lint", `Lint); ("capture", `Capture); ("lint_and_capture", `Lint_and_capture)]
type language = Clang | Java | Python [@@deriving compare]
let equal_language = [%compare.equal : language]
let string_of_language = function Java -> "Java" | Clang -> "C/C++/ObjC" | Python -> "python"
let ml_bucket_symbols = let ml_bucket_symbols =
[ ("all", `MLeak_all) [ ("all", `MLeak_all)
; ("cf", `MLeak_cf) ; ("cf", `MLeak_cf)
@ -2738,11 +2732,6 @@ let set_reference_and_call_function reference value f x =
(** Current Objective-C Automatic Reference Counting (ARC) mode *) (** Current Objective-C Automatic Reference Counting (ARC) mode *)
let arc_mode = ref false let arc_mode = ref false
(** Current language *)
let curr_language = ref Clang
let curr_language_is lang = equal_language !curr_language lang
(** Flag for footprint discovery mode *) (** Flag for footprint discovery mode *)
let footprint = ref true let footprint = ref true

@ -29,12 +29,6 @@ val string_to_analyzer : (string * analyzer) list
val string_of_analyzer : analyzer -> string val string_of_analyzer : analyzer -> string
type language = Clang | Java | Python [@@deriving compare]
val equal_language : language -> language -> bool
val string_of_language : language -> string
type os_type = Unix | Win32 | Cygwin type os_type = Unix | Win32 | Cygwin
type compilation_database_dependencies = type compilation_database_dependencies =
@ -648,10 +642,6 @@ val xcpretty : bool
val arc_mode : bool ref val arc_mode : bool ref
val curr_language : language ref
val curr_language_is : language -> bool
val footprint : bool ref val footprint : bool ref
val run_in_footprint_mode : ('a -> 'b) -> 'a -> 'b val run_in_footprint_mode : ('a -> 'b) -> 'a -> 'b

@ -0,0 +1,24 @@
(*
* Copyright (c) 2018 - 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! IStd
type t = Clang | Java | Python [@@deriving compare]
let equal = [%compare.equal : t]
let language_to_string = [(Clang, "C/C++/ObjC"); (Java, "Java"); (Python, "python")]
let to_string lang = List.Assoc.find_exn language_to_string ~equal lang
let of_string s = List.Assoc.find (List.Assoc.inverse language_to_string) ~equal:String.equal s
(** Current language *)
let curr_language = ref Clang
let curr_language_is lang = equal !curr_language lang

@ -0,0 +1,22 @@
(*
* Copyright (c) 2018 - 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! IStd
type t = Clang | Java | Python [@@deriving compare]
val equal : t -> t -> bool
val to_string : t -> string
val of_string : string -> t option
val curr_language : t ref
val curr_language_is : t -> bool

@ -22,7 +22,7 @@ type callback_fun =
| DynamicDispatch of Callbacks.proc_callback_t | DynamicDispatch of Callbacks.proc_callback_t
| Cluster of Callbacks.cluster_callback_t | Cluster of Callbacks.cluster_callback_t
type callback = callback_fun * Config.language type callback = callback_fun * Language.t
type checker = {name: string; active: bool; callbacks: callback list} type checker = {name: string; active: bool; callbacks: callback list}
@ -31,58 +31,58 @@ let all_checkers =
Currently, the checkers are run in the reverse order *) Currently, the checkers are run in the reverse order *)
[ { name= "annotation reachability" [ { name= "annotation reachability"
; active= Config.annotation_reachability ; active= Config.annotation_reachability
; callbacks= [(Procedure AnnotationReachability.checker, Config.Java)] } ; callbacks= [(Procedure AnnotationReachability.checker, Language.Java)] }
; { name= "nullable checks" ; { name= "nullable checks"
; active= Config.check_nullable ; active= Config.check_nullable
; callbacks= ; callbacks=
[ (Procedure NullabilityCheck.checker, Config.Clang) [ (Procedure NullabilityCheck.checker, Language.Clang)
; (Procedure NullabilityCheck.checker, Config.Java) ] } ; (Procedure NullabilityCheck.checker, Language.Java) ] }
; { name= "biabduction" ; { name= "biabduction"
; active= Config.biabduction ; active= Config.biabduction
; callbacks= ; callbacks=
[ (Procedure Interproc.analyze_procedure, Config.Clang) [ (Procedure Interproc.analyze_procedure, Language.Clang)
; (DynamicDispatch Interproc.analyze_procedure, Config.Java) ] } ; (DynamicDispatch Interproc.analyze_procedure, Language.Java) ] }
; { name= "buffer overrun" ; { name= "buffer overrun"
; active= Config.bufferoverrun ; active= Config.bufferoverrun
; callbacks= ; callbacks=
[ (Procedure BufferOverrunChecker.checker, Config.Clang) [ (Procedure BufferOverrunChecker.checker, Language.Clang)
; (Procedure BufferOverrunChecker.checker, Config.Java) ] } ; (Procedure BufferOverrunChecker.checker, Language.Java) ] }
; { name= "crashcontext" ; { name= "crashcontext"
; active= Config.crashcontext ; active= Config.crashcontext
; callbacks= [(Procedure BoundedCallTree.checker, Config.Java)] } ; callbacks= [(Procedure BoundedCallTree.checker, Language.Java)] }
; { name= "eradicate" ; { name= "eradicate"
; active= Config.eradicate ; active= Config.eradicate
; callbacks= [(Procedure Eradicate.callback_eradicate, Config.Java)] } ; callbacks= [(Procedure Eradicate.callback_eradicate, Language.Java)] }
; { name= "fragment retains view" ; { name= "fragment retains view"
; active= Config.fragment_retains_view ; active= Config.fragment_retains_view
; callbacks= ; callbacks=
[(Procedure FragmentRetainsViewChecker.callback_fragment_retains_view, Config.Java)] } [(Procedure FragmentRetainsViewChecker.callback_fragment_retains_view, Language.Java)] }
; { name= "immutable cast" ; { name= "immutable cast"
; active= Config.immutable_cast ; active= Config.immutable_cast
; callbacks= [(Procedure ImmutableChecker.callback_check_immutable_cast, Config.Java)] } ; callbacks= [(Procedure ImmutableChecker.callback_check_immutable_cast, Language.Java)] }
; { name= "liveness" ; { name= "liveness"
; active= Config.liveness ; active= Config.liveness
; callbacks= [(Procedure Liveness.checker, Config.Clang)] } ; callbacks= [(Procedure Liveness.checker, Language.Clang)] }
; { name= "printf args" ; { name= "printf args"
; active= Config.printf_args ; active= Config.printf_args
; callbacks= [(Procedure PrintfArgs.callback_printf_args, Config.Java)] } ; callbacks= [(Procedure PrintfArgs.callback_printf_args, Language.Java)] }
; { name= "nullable suggestion" ; { name= "nullable suggestion"
; active= Config.suggest_nullable ; active= Config.suggest_nullable
; callbacks= ; callbacks=
[ (Procedure NullabilitySuggest.checker, Config.Java) [ (Procedure NullabilitySuggest.checker, Language.Java)
; (Procedure NullabilitySuggest.checker, Config.Clang) ] } ; (Procedure NullabilitySuggest.checker, Language.Clang) ] }
; { name= "quandary" ; { name= "quandary"
; active= Config.quandary ; active= Config.quandary
; callbacks= ; callbacks=
[ (Procedure JavaTaintAnalysis.checker, Config.Java) [ (Procedure JavaTaintAnalysis.checker, Language.Java)
; (Procedure ClangTaintAnalysis.checker, Config.Clang) ] } ; (Procedure ClangTaintAnalysis.checker, Language.Clang) ] }
; { name= "RacerD" ; { name= "RacerD"
; active= Config.racerd ; active= Config.racerd
; callbacks= ; callbacks=
[ (Procedure RacerD.analyze_procedure, Config.Clang) [ (Procedure RacerD.analyze_procedure, Language.Clang)
; (Procedure RacerD.analyze_procedure, Config.Java) ; (Procedure RacerD.analyze_procedure, Language.Java)
; (Cluster RacerD.file_analysis, Config.Clang) ; (Cluster RacerD.file_analysis, Language.Clang)
; (Cluster RacerD.file_analysis, Config.Java) ] } ; (Cluster RacerD.file_analysis, Language.Java) ] }
(* toy resource analysis to use in the infer lab, see the lab/ directory *) (* toy resource analysis to use in the infer lab, see the lab/ directory *)
; { name= "resource leak" ; { name= "resource leak"
; active= Config.resource_leak ; active= Config.resource_leak
@ -90,12 +90,12 @@ let all_checkers =
[ ( (* the checked-in version is intraprocedural, but the lab asks to make it [ ( (* the checked-in version is intraprocedural, but the lab asks to make it
interprocedural later on *) interprocedural later on *)
Procedure ResourceLeaks.checker Procedure ResourceLeaks.checker
, Config.Java ) ] } , Language.Java ) ] }
; {name= "litho"; active= Config.litho; callbacks= [(Procedure Litho.checker, Config.Java)]} ; {name= "litho"; active= Config.litho; callbacks= [(Procedure Litho.checker, Language.Java)]}
; {name= "SIOF"; active= Config.siof; callbacks= [(Procedure Siof.checker, Config.Clang)]} ; {name= "SIOF"; active= Config.siof; callbacks= [(Procedure Siof.checker, Language.Clang)]}
; { name= "uninitialized variables" ; { name= "uninitialized variables"
; active= Config.uninit ; active= Config.uninit
; callbacks= [(Procedure Uninit.checker, Config.Clang)] } ] ; callbacks= [(Procedure Uninit.checker, Language.Clang)] } ]
let get_active_checkers () = let get_active_checkers () =
@ -119,11 +119,7 @@ let register checkers =
List.iter ~f:register_one checkers List.iter ~f:register_one checkers
module LanguageSet = Caml.Set.Make (struct module LanguageSet = Caml.Set.Make (Language)
type t = Config.language
let compare = Config.compare_language
end)
let pp_checker fmt {name; callbacks} = let pp_checker fmt {name; callbacks} =
let langs_of_callbacks = let langs_of_callbacks =
@ -132,5 +128,5 @@ let pp_checker fmt {name; callbacks} =
|> LanguageSet.elements |> LanguageSet.elements
in in
F.fprintf fmt "%s (%a)" name F.fprintf fmt "%s (%a)" name
(Pp.seq ~sep:", " (Pp.to_string ~f:Config.string_of_language)) (Pp.seq ~sep:", " (Pp.to_string ~f:Language.to_string))
langs_of_callbacks langs_of_callbacks

@ -34,7 +34,7 @@ let register_perf_stats_report source_file =
let init_global_state_for_capture_and_linters source_file = let init_global_state_for_capture_and_linters source_file =
L.(debug Capture Medium) "Processing %s" (Filename.basename (SourceFile.to_abs_path source_file)) ; L.(debug Capture Medium) "Processing %s" (Filename.basename (SourceFile.to_abs_path source_file)) ;
if Config.developer_mode then register_perf_stats_report source_file ; if Config.developer_mode then register_perf_stats_report source_file ;
Config.curr_language := Config.Clang ; Language.curr_language := Language.Clang ;
if Config.capture then DB.Results_dir.init source_file ; if Config.capture then DB.Results_dir.init source_file ;
CFrontend_config.reset_global_state () CFrontend_config.reset_global_state ()

@ -22,7 +22,7 @@ let register_perf_stats_report source_file =
let init_global_state source_file = let init_global_state source_file =
if Config.developer_mode then register_perf_stats_report source_file ; if Config.developer_mode then register_perf_stats_report source_file ;
Config.curr_language := Config.Java ; Language.curr_language := Language.Java ;
DB.Results_dir.init source_file ; DB.Results_dir.init source_file ;
Ident.NameGenerator.reset () ; Ident.NameGenerator.reset () ;
JContext.reset_exn_node_table () JContext.reset_exn_node_table ()

Loading…
Cancel
Save