Skip to content

Commit

Permalink
[clang] Add function prototype to Objective-C blocks
Browse files Browse the repository at this point in the history
Summary:
We were passing `attr_info` too much incorrectly. Now only passing it in the few places where it's needed to go from AttributedType to BlockPointerType.

Now also passing ?from_block to only translate the function prototype for blocks and not for other function pointers, since that's not required at the moment.

Translating the function prototype of blocks including its annotations helped handle correctly the example from the test in the parameter not null checked checker.

Reviewed By: ngorogiannis

Differential Revision: D64107506

fbshipit-source-id: 6980396bb01db7ac6bc70fadcae9de161e9fbe1e
  • Loading branch information
dulmarod authored and facebook-github-bot committed Oct 10, 2024
1 parent 648ef5e commit 6d5bc2b
Show file tree
Hide file tree
Showing 12 changed files with 90 additions and 77 deletions.
69 changes: 41 additions & 28 deletions infer/src/clang/cType_to_sil_type.ml
Original file line number Diff line number Diff line change
Expand Up @@ -132,37 +132,37 @@ let add_protocols_to_desc tenv desc protocol_desc_list =
if List.is_empty protocol_desc_list then desc else add_nonempty_protocol desc


let rec build_array_type ?attr_info translate_decl tenv (qual_type : Clang_ast_t.qual_type)
length_opt stride_opt =
let array_type = qual_type_to_sil_type ?attr_info translate_decl tenv qual_type in
let rec build_array_type translate_decl tenv (qual_type : Clang_ast_t.qual_type) length_opt
stride_opt =
let array_type = qual_type_to_sil_type translate_decl tenv qual_type in
let length = Option.map ~f:IntLit.of_int length_opt in
let stride = Option.map ~f:IntLit.of_int stride_opt in
Typ.Tarray {elt= array_type; length; stride}


and type_desc_of_attr_type ~attr_info translate_decl tenv type_info =
and type_desc_of_attr_type ~attr_info ?from_block translate_decl tenv type_info =
let open Clang_ast_t in
match type_info.ti_desugared_type with
| Some type_ptr -> (
match CAst_utils.get_type type_ptr with
| Some (ObjCObjectPointerType (_, qual_type)) ->
let typ = qual_type_to_sil_type ~attr_info translate_decl tenv qual_type in
let typ = qual_type_to_sil_type ?from_block translate_decl tenv qual_type in
Typ.Tptr (typ, pointer_attribute_of_objc_attribute ~attr_info)
| _ ->
type_ptr_to_type_desc translate_decl tenv type_ptr ~attr_info )
type_ptr_to_type_desc ~attr_info translate_decl tenv type_ptr )
| None ->
Typ.Tvoid


and type_desc_of_c_type ?attr_info translate_decl tenv c_type : Typ.desc =
and type_desc_of_c_type ?attr_info ?from_block translate_decl tenv c_type : Typ.desc =
let open Clang_ast_t in
match c_type with
| NoneType _ ->
Tvoid
| BuiltinType (_, builtin_type_kind) ->
type_desc_of_builtin_type_kind builtin_type_kind
| PointerType (_, qual_type) | ObjCObjectPointerType (_, qual_type) ->
let typ = qual_type_to_sil_type ?attr_info translate_decl tenv qual_type in
let typ = qual_type_to_sil_type ?from_block translate_decl tenv qual_type in
let desc = typ.Typ.desc in
if Typ.equal_desc desc (get_builtin_objc_type `ObjCClass) then desc
else Typ.Tptr (typ, Typ.Pk_pointer)
Expand All @@ -173,51 +173,63 @@ and type_desc_of_c_type ?attr_info translate_decl tenv c_type : Typ.desc =
decl_ptr_to_type_desc translate_decl tenv pointer )
in
let type_ptr = objc_object_type_info.Clang_ast_t.ooti_base_type in
let desc = type_ptr_to_type_desc ?attr_info translate_decl tenv type_ptr in
let desc = type_ptr_to_type_desc ?from_block translate_decl tenv type_ptr in
add_protocols_to_desc tenv desc protocol_desc_list
| BlockPointerType (_, qual_type) ->
let typ = qual_type_to_sil_type ?attr_info translate_decl tenv qual_type in
let typ = qual_type_to_sil_type ~from_block:true translate_decl tenv qual_type in
Typ.Tptr (typ, block_pointer_attr_of_attr_info attr_info)
| IncompleteArrayType (_, {arti_element_type; arti_stride})
| DependentSizedArrayType (_, {arti_element_type; arti_stride}) ->
build_array_type ?attr_info translate_decl tenv arti_element_type None arti_stride
build_array_type translate_decl tenv arti_element_type None arti_stride
| VariableArrayType (_, {arti_element_type; arti_stride}, _) ->
build_array_type ?attr_info translate_decl tenv arti_element_type None arti_stride
build_array_type translate_decl tenv arti_element_type None arti_stride
| ConstantArrayType (_, {arti_element_type; arti_stride}, n) ->
build_array_type ?attr_info translate_decl tenv arti_element_type (Some n) arti_stride
build_array_type translate_decl tenv arti_element_type (Some n) arti_stride
| FunctionProtoType (_type_info, function_type_info, params_type_info)
when Option.value ~default:false from_block ->
Typ.Tfun
(Some
{ Typ.params_type=
List.map
~f:(fun param_type ->
qual_type_to_sil_type ?from_block translate_decl tenv param_type )
params_type_info.Clang_ast_t.pti_params_type
; return_type=
qual_type_to_sil_type ?from_block translate_decl tenv
function_type_info.Clang_ast_t.fti_return_type } )
| FunctionProtoType _ | FunctionNoProtoType _ ->
Typ.Tfun None
| ParenType (_, qual_type) ->
(qual_type_to_sil_type ?attr_info translate_decl tenv qual_type).Typ.desc
(qual_type_to_sil_type ?attr_info ?from_block translate_decl tenv qual_type).Typ.desc
| DecayedType (_, qual_type) ->
(qual_type_to_sil_type ?attr_info translate_decl tenv qual_type).Typ.desc
(qual_type_to_sil_type ?from_block translate_decl tenv qual_type).Typ.desc
| RecordType (_, pointer) | EnumType (_, pointer) ->
decl_ptr_to_type_desc translate_decl tenv pointer
| ElaboratedType type_info -> (
match type_info.Clang_ast_t.ti_desugared_type with
(* TODO desugar to qualtype *)
| Some type_ptr ->
type_ptr_to_type_desc ?attr_info translate_decl tenv type_ptr
type_ptr_to_type_desc translate_decl tenv type_ptr
| None ->
Typ.Tvoid )
| ObjCInterfaceType (_, pointer) ->
decl_ptr_to_type_desc translate_decl tenv pointer
| RValueReferenceType (_, qual_type) ->
let typ = qual_type_to_sil_type ?attr_info translate_decl tenv qual_type in
let typ = qual_type_to_sil_type ?from_block translate_decl tenv qual_type in
Typ.Tptr (typ, Typ.Pk_rvalue_reference)
| LValueReferenceType (_, qual_type) ->
let typ = qual_type_to_sil_type ?attr_info translate_decl tenv qual_type in
let typ = qual_type_to_sil_type ?from_block translate_decl tenv qual_type in
Typ.Tptr (typ, Typ.Pk_lvalue_reference)
| AttributedType (type_info, attr_info) ->
(* TODO desugar to qualtyp *)
type_desc_of_attr_type ~attr_info translate_decl tenv type_info
type_desc_of_attr_type ~attr_info ?from_block translate_decl tenv type_info
| _ -> (
(* TypedefType, etc *)
let type_info = Clang_ast_proj.get_type_tuple c_type in
match type_info.Clang_ast_t.ti_desugared_type with
(* TODO desugar typedeftype to qualtype *)
| Some typ ->
type_ptr_to_type_desc ?attr_info translate_decl tenv typ
type_ptr_to_type_desc translate_decl tenv typ
| None ->
Typ.Tvoid )

Expand Down Expand Up @@ -250,29 +262,29 @@ and decl_ptr_to_type_desc translate_decl tenv decl_ptr : Typ.desc =
Typ.Tvoid )


and clang_type_ptr_to_type_desc ?attr_info translate_decl tenv type_ptr =
and clang_type_ptr_to_type_desc ?attr_info ?from_block translate_decl tenv type_ptr =
try Clang_ast_extend.TypePointerMap.find type_ptr !CFrontend_config.sil_types_map
with Caml.Not_found -> (
match CAst_utils.get_type type_ptr with
| Some c_type ->
let type_desc = type_desc_of_c_type ?attr_info translate_decl tenv c_type in
let type_desc = type_desc_of_c_type ?attr_info ?from_block translate_decl tenv c_type in
CAst_utils.update_sil_types_map type_ptr type_desc ;
type_desc
| _ ->
Typ.Tvoid )


and type_ptr_to_type_desc ?attr_info translate_decl tenv type_ptr : Typ.desc =
and type_ptr_to_type_desc ?attr_info ?from_block translate_decl tenv type_ptr : Typ.desc =
match type_ptr with
| Clang_ast_types.TypePtr.Ptr _ ->
clang_type_ptr_to_type_desc ?attr_info translate_decl tenv type_ptr
clang_type_ptr_to_type_desc ?attr_info ?from_block translate_decl tenv type_ptr
| Clang_ast_extend.Builtin kind ->
type_desc_of_builtin_type_kind kind
| Clang_ast_extend.PointerOf typ ->
let sil_typ = qual_type_to_sil_type ?attr_info translate_decl tenv typ in
let sil_typ = qual_type_to_sil_type ?from_block translate_decl tenv typ in
Typ.Tptr (sil_typ, Pk_pointer)
| Clang_ast_extend.ReferenceOf typ ->
let sil_typ = qual_type_to_sil_type ?attr_info translate_decl tenv typ in
let sil_typ = qual_type_to_sil_type ?from_block translate_decl tenv typ in
let pk_ref =
match CAst_utils.get_desugared_type typ.Clang_ast_t.qt_type_ptr with
| Some (Clang_ast_t.RValueReferenceType _) ->
Expand All @@ -291,9 +303,10 @@ and type_ptr_to_type_desc ?attr_info translate_decl tenv type_ptr : Typ.desc =
L.(die InternalError) "unknown variant for type_ptr"


and qual_type_to_sil_type ?attr_info translate_decl tenv qual_type =
and qual_type_to_sil_type ?attr_info ?from_block translate_decl tenv qual_type =
let desc =
type_ptr_to_type_desc ?attr_info translate_decl tenv qual_type.Clang_ast_t.qt_type_ptr
type_ptr_to_type_desc ?attr_info ?from_block translate_decl tenv
qual_type.Clang_ast_t.qt_type_ptr
in
let is_reference = CType.is_reference_type qual_type in
let quals = Typ.mk_type_quals ~is_reference ~is_const:qual_type.Clang_ast_t.qt_is_const () in
Expand Down
1 change: 1 addition & 0 deletions infer/src/clang/cType_to_sil_type.mli
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ val type_of_builtin_type_kind : ?is_const:bool -> Clang_ast_t.builtin_type_kind

val qual_type_to_sil_type :
?attr_info:Clang_ast_t.attr_type_info
-> ?from_block:bool
-> (Tenv.t -> Clang_ast_t.decl -> Typ.desc)
-> Tenv.t
-> Clang_ast_t.qual_type
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ digraph cfg {
"capture#A#[instance].ca0ec9307f9d5110_2" [label="2: Exit A.capture \n " color=yellow style=filled]


"capture#A#[instance].ca0ec9307f9d5110_3" [label="3: Compound statement \n n$3=*&self:A* [line 45, column 4]\n n$4=*n$3._b:B* [line 45, column 4]\n n$0=*&self:A* [line 45, column 16]\n n$5=_fun_B.sHandler:(n$4:B*,(_fun_objc_block_retain_cycle.m:45,([by value]n$0 &self:A*)):_fn_(*)) virtual [line 45, column 3]\n " shape="box"]
"capture#A#[instance].ca0ec9307f9d5110_3" [label="3: Compound statement \n n$3=*&self:A* [line 45, column 4]\n n$4=*n$3._b:B* [line 45, column 4]\n n$0=*&self:A* [line 45, column 16]\n n$5=_fun_B.sHandler:(n$4:B*,(_fun_objc_block_retain_cycle.m:45,([by value]n$0 &self:A*)):(_fn_ [D*] -> void)(*)) virtual [line 45, column 3]\n " shape="box"]


"capture#A#[instance].ca0ec9307f9d5110_3" -> "capture#A#[instance].ca0ec9307f9d5110_2" ;
Expand All @@ -78,14 +78,14 @@ digraph cfg {
"dealloc#B#[instance].62d516b6d74de70c_2" [label="2: Exit B.dealloc \n " color=yellow style=filled]


"sHandler:#B#[instance].2c9d8ca3b6059922_1" [label="1: Start B.sHandler:\nFormals: self:B* h:_fn_(*)\nLocals: \n " color=yellow style=filled]
"sHandler:#B#[instance].2c9d8ca3b6059922_1" [label="1: Start B.sHandler:\nFormals: self:B* h:(_fn_ [D*] -> void)(*)\nLocals: \n " color=yellow style=filled]


"sHandler:#B#[instance].2c9d8ca3b6059922_1" -> "sHandler:#B#[instance].2c9d8ca3b6059922_3" ;
"sHandler:#B#[instance].2c9d8ca3b6059922_2" [label="2: Exit B.sHandler: \n " color=yellow style=filled]


"sHandler:#B#[instance].2c9d8ca3b6059922_3" [label="3: BinaryOperatorStmt: Assign \n n$1=*&h:_fn_(*) [line 28, column 14]\n n$0=*&self:B* [line 28, column 3]\n *n$0._h:_fn_(*)=n$1 [line 28, column 3]\n " shape="box"]
"sHandler:#B#[instance].2c9d8ca3b6059922_3" [label="3: BinaryOperatorStmt: Assign \n n$1=*&h:(_fn_ [D*] -> void)(*) [line 28, column 14]\n n$0=*&self:B* [line 28, column 3]\n *n$0._h:(_fn_ [D*] -> void)(*)=n$1 [line 28, column 3]\n " shape="box"]


"sHandler:#B#[instance].2c9d8ca3b6059922_3" -> "sHandler:#B#[instance].2c9d8ca3b6059922_2" ;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,14 @@ digraph cfg {


"objc_block_specialized_method_wit.982152dd64690368_3" -> "objc_block_specialized_method_wit.982152dd64690368_2" ;
"foo.acbd18db4cc2f85c_1" [label="1: Start foo\nFormals: <_Nullable> my_block1:_fn_(_Nullable *) <_Nullable> my_block2:_fn_(_Nullable *) <_Nonnull> a:A*\nLocals: \n " color=yellow style=filled]
"foo.acbd18db4cc2f85c_1" [label="1: Start foo\nFormals: <_Nullable> my_block1:(_fn_ [int] -> void)(_Nullable *) <_Nullable> my_block2:(_fn_ [int] -> void)(_Nullable *) <_Nonnull> a:A*\nLocals: \n " color=yellow style=filled]


"foo.acbd18db4cc2f85c_1" -> "foo.acbd18db4cc2f85c_3" ;
"foo.acbd18db4cc2f85c_2" [label="2: Exit foo \n " color=yellow style=filled]


"foo.acbd18db4cc2f85c_3" [label="3: Call n$0 \n n$0=*&my_block1:_fn_(_Nullable *) [line 16, column 3]\n n$1=_fun___call_objc_block(n$0:_fn_,22:int) objc_block [line 16, column 3]\n " shape="box"]
"foo.acbd18db4cc2f85c_3" [label="3: Call n$0 \n n$0=*&my_block1:(_fn_ [int] -> void)(_Nullable *) [line 16, column 3]\n n$1=_fun___call_objc_block(n$0:_fn_,22:int) objc_block [line 16, column 3]\n " shape="box"]


"foo.acbd18db4cc2f85c_3" -> "foo.acbd18db4cc2f85c_2" ;
Expand Down Expand Up @@ -92,7 +92,7 @@ digraph cfg {


"bar2#A#[instance].2f0519276ed04788_4" -> "bar2#A#[instance].2f0519276ed04788_2" ;
"bar2#A#[instance].2f0519276ed04788_5" [label="5: Compound statement \n n$14=*&self:A* [line 40, column 7]\n n$16=*&self:A* [line 43, column 7]\n n$18=*&self:A* [line 46, column 7]\n n$19=_fun_foo((_fun_objc_block_specialized_method_with_block_params.m:40,([by value]n$14 &self:A*)):_fn_(*),(_fun_objc_block_specialized_method_with_block_params.m:43,([by value]n$16 &self:A*)):_fn_(*),n$18:A*) [line 39, column 3]\n " shape="box"]
"bar2#A#[instance].2f0519276ed04788_5" [label="5: Compound statement \n n$14=*&self:A* [line 40, column 7]\n n$16=*&self:A* [line 43, column 7]\n n$18=*&self:A* [line 46, column 7]\n n$19=_fun_foo((_fun_objc_block_specialized_method_with_block_params.m:40,([by value]n$14 &self:A*)):(_fn_ [int] -> void)(*),(_fun_objc_block_specialized_method_with_block_params.m:43,([by value]n$16 &self:A*)):(_fn_ [int] -> void)(*),n$18:A*) [line 39, column 3]\n " shape="box"]


"bar2#A#[instance].2f0519276ed04788_5" -> "bar2#A#[instance].2f0519276ed04788_3" ;
Expand All @@ -115,15 +115,15 @@ digraph cfg {


"bar:#A(class A)#[instance].8e6cfff8b86359b6_5" -> "bar:#A(class A)#[instance].8e6cfff8b86359b6_3" ;
"bar:#A(class A)#[instance].8e6cfff8b86359b6_6" [label="6: Compound statement \n n$3=*&self:A* [line 27, column 7]\n n$4=*&x:int [line 27, column 7]\n n$7=*&self:A* [line 30, column 7]\n n$10=*&a:A* [line 33, column 7]\n n$11=_fun_foo((_fun_objc_block_specialized_method_with_block_params.m:27,([by value]n$3 &self:A*),([by value]n$4 &x:int)):_fn_(*),(_fun_objc_block_specialized_method_with_block_params.m:30,([by value]n$7 &self:A*)):_fn_(*),n$10:A*) [line 26, column 3]\n " shape="box"]
"bar:#A(class A)#[instance].8e6cfff8b86359b6_6" [label="6: Compound statement \n n$3=*&self:A* [line 27, column 7]\n n$4=*&x:int [line 27, column 7]\n n$7=*&self:A* [line 30, column 7]\n n$10=*&a:A* [line 33, column 7]\n n$11=_fun_foo((_fun_objc_block_specialized_method_with_block_params.m:27,([by value]n$3 &self:A*),([by value]n$4 &x:int)):(_fn_ [int] -> void)(*),(_fun_objc_block_specialized_method_with_block_params.m:30,([by value]n$7 &self:A*)):(_fn_ [int] -> void)(*),n$10:A*) [line 26, column 3]\n " shape="box"]


"bar:#A(class A)#[instance].8e6cfff8b86359b6_6" -> "bar:#A(class A)#[instance].8e6cfff8b86359b6_5" ;
"bar:#A(class A)#[instance].8e6cfff8b86359b6_7" [label="7: DeclStmt \n VARIABLE_DECLARED(x:int); [line 25, column 3]\n *&x:int=0 [line 25, column 3]\n " shape="box"]


"bar:#A(class A)#[instance].8e6cfff8b86359b6_7" -> "bar:#A(class A)#[instance].8e6cfff8b86359b6_6" ;
"call_foo_with_same_param#A#[insta.0f7e046192340a49_1" [label="1: Start A.call_foo_with_same_param\nFormals: self:A*\nLocals: b:_fn_(_Nullable *) \n " color=yellow style=filled]
"call_foo_with_same_param#A#[insta.0f7e046192340a49_1" [label="1: Start A.call_foo_with_same_param\nFormals: self:A*\nLocals: b:(_fn_ [int] -> void)(_Nullable *) \n " color=yellow style=filled]


"call_foo_with_same_param#A#[insta.0f7e046192340a49_1" -> "call_foo_with_same_param#A#[insta.0f7e046192340a49_7" ;
Expand All @@ -138,15 +138,15 @@ digraph cfg {


"call_foo_with_same_param#A#[insta.0f7e046192340a49_4" -> "call_foo_with_same_param#A#[insta.0f7e046192340a49_2" ;
"call_foo_with_same_param#A#[insta.0f7e046192340a49_5" [label="5: Call _fun_foo \n n$22=*&b:_fn_(_Nullable *) [line 55, column 7]\n n$23=*&b:_fn_(_Nullable *) [line 55, column 10]\n n$24=*&self:A* [line 55, column 13]\n n$25=_fun_foo(n$22:_fn_(_Nullable *),n$23:_fn_(_Nullable *),n$24:A*) [line 55, column 3]\n " shape="box"]
"call_foo_with_same_param#A#[insta.0f7e046192340a49_5" [label="5: Call _fun_foo \n n$22=*&b:(_fn_ [int] -> void)(_Nullable *) [line 55, column 7]\n n$23=*&b:(_fn_ [int] -> void)(_Nullable *) [line 55, column 10]\n n$24=*&self:A* [line 55, column 13]\n n$25=_fun_foo(n$22:(_fn_ [int] -> void)(_Nullable *),n$23:(_fn_ [int] -> void)(_Nullable *),n$24:A*) [line 55, column 3]\n " shape="box"]


"call_foo_with_same_param#A#[insta.0f7e046192340a49_5" -> "call_foo_with_same_param#A#[insta.0f7e046192340a49_3" ;
"call_foo_with_same_param#A#[insta.0f7e046192340a49_6" [label="6: Call _fun_foo \n n$26=*&b:_fn_(_Nullable *) [line 54, column 7]\n n$27=*&b:_fn_(_Nullable *) [line 54, column 10]\n n$28=*&self:A* [line 54, column 13]\n n$29=_fun_foo(n$26:_fn_(_Nullable *),n$27:_fn_(_Nullable *),n$28:A*) [line 54, column 3]\n " shape="box"]
"call_foo_with_same_param#A#[insta.0f7e046192340a49_6" [label="6: Call _fun_foo \n n$26=*&b:(_fn_ [int] -> void)(_Nullable *) [line 54, column 7]\n n$27=*&b:(_fn_ [int] -> void)(_Nullable *) [line 54, column 10]\n n$28=*&self:A* [line 54, column 13]\n n$29=_fun_foo(n$26:(_fn_ [int] -> void)(_Nullable *),n$27:(_fn_ [int] -> void)(_Nullable *),n$28:A*) [line 54, column 3]\n " shape="box"]


"call_foo_with_same_param#A#[insta.0f7e046192340a49_6" -> "call_foo_with_same_param#A#[insta.0f7e046192340a49_5" ;
"call_foo_with_same_param#A#[insta.0f7e046192340a49_7" [label="7: DeclStmt \n VARIABLE_DECLARED(b:_fn_(_Nullable *)); [line 51, column 3]\n n$30=*&self:A* [line 51, column 20]\n *&b:_fn_(*)=(_fun_objc_block_specialized_method_with_block_params.m:51,([by value]n$30 &self:A*)) [line 51, column 3]\n " shape="box"]
"call_foo_with_same_param#A#[insta.0f7e046192340a49_7" [label="7: DeclStmt \n VARIABLE_DECLARED(b:(_fn_ [int] -> void)(_Nullable *)); [line 51, column 3]\n n$30=*&self:A* [line 51, column 20]\n *&b:(_fn_ [int] -> void)(*)=(_fun_objc_block_specialized_method_with_block_params.m:51,([by value]n$30 &self:A*)) [line 51, column 3]\n " shape="box"]


"call_foo_with_same_param#A#[insta.0f7e046192340a49_7" -> "call_foo_with_same_param#A#[insta.0f7e046192340a49_6" ;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ typedef void (^_Nullable NewAnnotateSyncBlock)(

void MarkerAnnotateSync(NS_NOESCAPE _Nullable NewAnnotateSyncBlock block) {}

void LoadAndAnnotateOk_FP(NSString* composerSessionID) {
void LoadAndAnnotateOk(NSString* composerSessionID) {
MarkerAnnotateSync(^(NewAnnotateBlock annotate) {
annotate("composer_session_id", composerSessionID);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,3 @@ codetoanalyze/objc/parameter-not-null-checked/Blocks_as_parameters.m, Blocks_as_
codetoanalyze/objc/parameter-not-null-checked/Blocks_as_parameters.m, Blocks_as_parameters.nonnullBlockTwoBlocksBad:and:and:, 4, BLOCK_PARAMETER_NOT_NULL_CHECKED, no_bucket, WARNING, [Parameter `block2` of Blocks_as_parameters.nonnullBlockTwoBlocksBad:and:and:,Executing `block2`], "block2("=>"BLOCK_CALL_SAFE(block2"
codetoanalyze/objc/parameter-not-null-checked/Blocks_as_parameters.m, Blocks_as_parameters.blockCheckedAssignNULLBad:and:, 3, BLOCK_PARAMETER_NOT_NULL_CHECKED, no_bucket, WARNING, [Parameter `block` of Blocks_as_parameters.blockCheckedAssignNULLBad:and:,Checking `block` for nil,Assigned,Executing `block`], "block("=>"BLOCK_CALL_SAFE(block"
codetoanalyze/objc/parameter-not-null-checked/Blocks_as_parameters.m, objc_block_Blocks_as_parameters.m:109, 1, BLOCK_PARAMETER_NOT_NULL_CHECKED, no_bucket, WARNING, [Parameter `completion` of Blocks_as_parameters.uploadTaskWithRequestBad:fromFile:delegate:delegateQueue:completion:,Executing `completion`], "completion("=>"BLOCK_CALL_SAFE(completion"
codetoanalyze/objc/parameter-not-null-checked/Blocks_as_parameters.m, objc_block_Blocks_as_parameters.m:201, 1, BLOCK_PARAMETER_NOT_NULL_CHECKED, no_bucket, WARNING, [Parameter `annotate` of objc_block_Blocks_as_parameters.m:201,Executing `annotate`], "annotate("=>"BLOCK_CALL_SAFE(annotate, "
Loading

0 comments on commit 6d5bc2b

Please sign in to comment.