You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.4 KiB
117 lines
4.4 KiB
(*
|
|
* 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.
|
|
*)
|
|
|
|
open! IStd
|
|
|
|
let is_modelled_static_function name =
|
|
let modelled_functions = ["_dispatch_once"; "CFAutorelease"; "CFBridgingRelease"] in
|
|
List.mem ~equal:String.equal modelled_functions name
|
|
|
|
|
|
let class_equal class_typename class_name = String.equal (Typ.Name.name class_typename) class_name
|
|
|
|
let is_builtin_expect pname =
|
|
String.equal (Typ.Procname.to_string pname) CFrontend_config.builtin_expect
|
|
|
|
|
|
let is_builtin_object_size pname =
|
|
String.equal (Typ.Procname.to_string pname) CFrontend_config.builtin_object_size
|
|
|
|
|
|
let is_std_addressof pname =
|
|
(* since std_addressof is a template function, matching it requires QualifiedCppName *)
|
|
QualifiedCppName.Match.match_qualifiers CFrontend_config.std_addressof
|
|
(Typ.Procname.get_qualifiers pname)
|
|
|
|
|
|
let is_replace_with_deref_first_arg pname =
|
|
String.equal (Typ.Procname.to_string pname) CFrontend_config.replace_with_deref_first_arg_attr
|
|
|
|
|
|
let is_modeled_builtin funct = String.equal funct CFrontend_config.builtin_memset_chk
|
|
|
|
let is_modeled_attribute attr_name =
|
|
List.mem ~equal:String.equal CFrontend_config.modeled_function_attributes attr_name
|
|
|
|
|
|
let is_assert_log_s funct =
|
|
String.equal funct CFrontend_config.assert_rtn || String.equal funct CFrontend_config.assert_fail
|
|
|| String.equal funct CFrontend_config.fbAssertWithSignalAndLogFunctionHelper
|
|
|| String.is_substring ~substring:CFrontend_config.google_MakeCheckOpString funct
|
|
|
|
|
|
let is_assert_log_method m = String.equal m CFrontend_config.google_LogMessageFatal
|
|
|
|
let is_handleFailureInMethod funct =
|
|
String.equal funct CFrontend_config.handleFailureInMethod
|
|
|| String.equal funct CFrontend_config.handleFailureInFunction
|
|
|
|
|
|
(** If the function is a builtin model, return the model, otherwise return the function *)
|
|
let is_assert_log pname =
|
|
match pname with
|
|
| Typ.Procname.ObjC_Cpp _ ->
|
|
is_assert_log_method (Typ.Procname.to_string pname)
|
|
| Typ.Procname.C _ ->
|
|
is_assert_log_s (Typ.Procname.to_string pname)
|
|
| _ ->
|
|
false
|
|
|
|
|
|
let get_predefined_ms_method condition class_name method_name method_kind mk_procname arguments
|
|
return_type attributes builtin =
|
|
if condition then
|
|
let procname =
|
|
match builtin with
|
|
| Some procname ->
|
|
procname
|
|
| None ->
|
|
mk_procname class_name method_name method_kind
|
|
in
|
|
let ms =
|
|
CMethodSignature.mk procname None arguments return_type attributes
|
|
(CAst_utils.dummy_source_range ())
|
|
ProcAttributes.C_FUNCTION None None None `None
|
|
in
|
|
Some ms
|
|
else None
|
|
|
|
|
|
let get_predefined_ms_stringWithUTF8String class_name method_name mk_procname =
|
|
let condition =
|
|
class_equal class_name CFrontend_config.nsstring_cl
|
|
&& String.equal method_name CFrontend_config.string_with_utf8_m
|
|
in
|
|
let id_type = CType_to_sil_type.type_of_builtin_type_kind `ObjCId in
|
|
let char_star_type =
|
|
let char_type = CType_to_sil_type.type_of_builtin_type_kind ~is_const:true `Char_S in
|
|
Typ.Tptr (char_type, Typ.Pk_pointer) |> Typ.mk ~quals:(Typ.mk_type_quals ())
|
|
in
|
|
let param_name = Mangled.from_string "x" in
|
|
let params = [CMethodSignature.mk_param_type param_name char_star_type] in
|
|
get_predefined_ms_method condition class_name method_name Typ.Procname.ObjC_Cpp.ObjCClassMethod
|
|
mk_procname params (id_type, Annot.Item.empty) [] None
|
|
|
|
|
|
let get_predefined_ms_is_kind_of_class class_name method_name mk_procname =
|
|
let condition = String.equal method_name CFrontend_config.is_kind_of_class in
|
|
let class_type = CType_to_sil_type.type_of_builtin_type_kind `ObjCClass in
|
|
let name = Mangled.from_string CFrontend_config.self in
|
|
let params = [CMethodSignature.mk_param_type name class_type] in
|
|
let bool_type = CType_to_sil_type.type_of_builtin_type_kind `Bool in
|
|
get_predefined_ms_method condition class_name method_name
|
|
Typ.Procname.ObjC_Cpp.ObjCInstanceMethod mk_procname params (bool_type, Annot.Item.empty) []
|
|
(Some BuiltinDecl.__instanceof)
|
|
|
|
|
|
let get_predefined_model_method_signature class_name method_name mk_procname =
|
|
let next_predefined f = function Some _ as x -> x | None -> f method_name mk_procname in
|
|
None |> next_predefined (get_predefined_ms_stringWithUTF8String class_name)
|
|
|> next_predefined (get_predefined_ms_is_kind_of_class class_name)
|