From 925d73efce5f60b6c14e1bdec8e3714578eba25b Mon Sep 17 00:00:00 2001 From: Andrzej Kotulski Date: Fri, 10 Mar 2017 03:59:36 -0800 Subject: [PATCH] [clang] Add template instantiation info into Procname.t Reviewed By: jberdine Differential Revision: D4634826 fbshipit-source-id: 3fdfb80 --- infer/src/IR/BuiltinDecl.ml | 3 ++- infer/src/IR/Typ.re | 38 ++++++++++++++++++++++++------------ infer/src/IR/Typ.rei | 4 ++-- infer/src/backend/taint.ml | 2 +- infer/src/clang/CProcname.ml | 6 +++--- 5 files changed, 34 insertions(+), 19 deletions(-) diff --git a/infer/src/IR/BuiltinDecl.ml b/infer/src/IR/BuiltinDecl.ml index 0178d2787..622fbbbad 100644 --- a/infer/src/IR/BuiltinDecl.ml +++ b/infer/src/IR/BuiltinDecl.ml @@ -24,7 +24,8 @@ let create_procname name = let create_objc_class_method class_name method_name = let method_kind = Typ.Procname.ObjCClassMethod in let tname = Typename.Objc.from_string class_name in - let pname = Typ.Procname.ObjC_Cpp (Typ.Procname.objc_cpp tname method_name method_kind) in + let pname = Typ.Procname.ObjC_Cpp + (Typ.Procname.objc_cpp tname method_name method_kind Typ.NoTemplate) in register pname; pname diff --git a/infer/src/IR/Typ.re b/infer/src/IR/Typ.re index 3cf897267..9b6643bb9 100644 --- a/infer/src/IR/Typ.re +++ b/infer/src/IR/Typ.re @@ -319,7 +319,7 @@ let module Procname = { [@@deriving compare]; /** Type of c procedure names. */ - type c = (string, option string) [@@deriving compare]; + type c = (string, option string, template_spec_info) [@@deriving compare]; type objc_cpp_method_kind = | CPPMethod (option string) /** with mangling */ | CPPConstructor (option string, bool) /** with mangling + is it constexpr? */ @@ -329,7 +329,12 @@ let module Procname = { [@@deriving compare]; /** Type of Objective C and C++ procedure names: method signatures. */ - type objc_cpp = {method_name: string, class_name: Typename.t, kind: objc_cpp_method_kind} + type objc_cpp = { + method_name: string, + class_name: Typename.t, + kind: objc_cpp_method_kind, + template_args: template_spec_info + } [@@deriving compare]; /** Type of Objective C block names. */ @@ -398,8 +403,12 @@ let module Procname = { | None => (None, package_classname) }; let split_typename typename => split_classname (Typename.name typename); - let from_string_c_fun (s: string) => C (s, None); - let c (plain: string) (mangled: string) => (plain, Some mangled); + let from_string_c_fun (s: string) => C (s, None, NoTemplate); + let c (plain: string) (mangled: string) (template_args: template_spec_info) => ( + plain, + Some mangled, + template_args + ); let java class_name return_type method_name parameters kind => { class_name, return_type, @@ -409,9 +418,14 @@ let module Procname = { }; /** Create an objc procedure name from a class_name and method_name. */ - let objc_cpp class_name method_name kind => {class_name, method_name, kind}; + let objc_cpp class_name method_name kind template_args => { + class_name, + method_name, + kind, + template_args + }; let get_default_objc_class_method objc_class => { - let objc_cpp = objc_cpp objc_class "__find_class_" ObjCInternalMethod; + let objc_cpp = objc_cpp objc_class "__find_class_" ObjCInternalMethod NoTemplate; ObjC_Cpp objc_cpp }; @@ -473,7 +487,7 @@ let module Procname = { let get_method = fun | ObjC_Cpp name => name.method_name - | C (name, _) => name + | C (name, _, _) => name | Block name => name | Java j => j.method_name | Linters_dummy_method => "Linters_dummy_method"; @@ -676,7 +690,7 @@ let module Procname = { }; let get_global_name_of_initializer = fun - | C (name, _) when String.is_prefix prefix::Config.clang_initializer_prefix name => { + | C (name, _, _) when String.is_prefix prefix::Config.clang_initializer_prefix name => { let prefix_len = String.length Config.clang_initializer_prefix; Some (String.sub name pos::prefix_len len::(String.length name - prefix_len)) } @@ -729,7 +743,7 @@ let module Procname = { let to_unique_id pn => switch pn { | Java j => java_to_string j Verbose - | C (c1, c2) => to_readable_string (c1, c2) true + | C (c1, c2, _) => to_readable_string (c1, c2) true | ObjC_Cpp osig => c_method_to_string osig Verbose | Block name => name | Linters_dummy_method => "Linters_dummy_method" @@ -739,7 +753,7 @@ let module Procname = { let to_string p => switch p { | Java j => java_to_string j Non_verbose - | C (c1, c2) => to_readable_string (c1, c2) false + | C (c1, c2, _) => to_readable_string (c1, c2) false | ObjC_Cpp osig => c_method_to_string osig Non_verbose | Block name => name | Linters_dummy_method => to_unique_id p @@ -749,7 +763,7 @@ let module Procname = { let to_simplified_string withclass::withclass=false p => switch p { | Java j => java_to_string withclass::withclass j Simple - | C (c1, c2) => to_readable_string (c1, c2) false ^ "()" + | C (c1, c2, _) => to_readable_string (c1, c2) false ^ "()" | ObjC_Cpp osig => c_method_to_string osig Simple | Block _ => "block" | Linters_dummy_method => to_unique_id p @@ -782,7 +796,7 @@ let module Procname = { let pp_set fmt set => Set.iter (fun pname => F.fprintf fmt "%a " pp pname) set; let get_qualifiers pname => switch pname { - | C c => fst c |> QualifiedCppName.qualifiers_of_qual_name + | C c => fst3 c |> QualifiedCppName.qualifiers_of_qual_name | ObjC_Cpp objc_cpp => List.append (QualifiedCppName.qualifiers_of_qual_name (Typename.name objc_cpp.class_name)) diff --git a/infer/src/IR/Typ.rei b/infer/src/IR/Typ.rei index 029a596df..614990cf8 100644 --- a/infer/src/IR/Typ.rei +++ b/infer/src/IR/Typ.rei @@ -204,7 +204,7 @@ let module Procname: { let module Set: Caml.Set.S with type elt = t; /** Create a C procedure name from plain and mangled name. */ - let c: string => string => c; + let c: string => string => template_spec_info => c; /** Empty block name. */ let empty_block: t; @@ -259,7 +259,7 @@ let module Procname: { let mangled_objc_block: string => t; /** Create an objc procedure name from a class_name and method_name. */ - let objc_cpp: Typename.t => string => objc_cpp_method_kind => objc_cpp; + let objc_cpp: Typename.t => string => objc_cpp_method_kind => template_spec_info => objc_cpp; let get_default_objc_class_method: Typename.t => t; /** Get the class name of a Objective-C/C++ procedure name. */ diff --git a/infer/src/backend/taint.ml b/infer/src/backend/taint.ml index 093021383..1dcf46790 100644 --- a/infer/src/backend/taint.ml +++ b/infer/src/backend/taint.ml @@ -275,7 +275,7 @@ let objc_method_to_procname objc_method = let method_kind = Typ.Procname.objc_method_kind_of_bool (not objc_method.is_static) in let typename = Typename.Objc.from_string objc_method.classname in Typ.Procname.ObjC_Cpp - (Typ.Procname.objc_cpp typename objc_method.method_name method_kind) + (Typ.Procname.objc_cpp typename objc_method.method_name method_kind Typ.NoTemplate) let taint_spec_to_taint_info taint_spec = let taint_source = diff --git a/infer/src/clang/CProcname.ml b/infer/src/clang/CProcname.ml index a96beb2e0..b3ad61669 100644 --- a/infer/src/clang/CProcname.ml +++ b/infer/src/clang/CProcname.ml @@ -49,7 +49,7 @@ let mk_c_function translation_unit_context name function_decl_info_opt = if String.is_empty file && String.is_empty mangled_name then Typ.Procname.from_string_c_fun name else - Typ.Procname.C (Typ.Procname.c name mangled) + Typ.Procname.C (Typ.Procname.c name mangled Typ.NoTemplate) let mk_cpp_method class_name method_name ?meth_decl mangled = let method_kind = match meth_decl with @@ -58,11 +58,11 @@ let mk_cpp_method class_name method_name ?meth_decl mangled = | _ -> Typ.Procname.CPPMethod mangled in Typ.Procname.ObjC_Cpp - (Typ.Procname.objc_cpp class_name method_name method_kind) + (Typ.Procname.objc_cpp class_name method_name method_kind Typ.NoTemplate) let mk_objc_method class_typename method_name method_kind = Typ.Procname.ObjC_Cpp - (Typ.Procname.objc_cpp class_typename method_name method_kind) + (Typ.Procname.objc_cpp class_typename method_name method_kind Typ.NoTemplate) let block_procname_with_index defining_proc i = Config.anonymous_block_prefix ^