From 08c4c33e7d2f1b6d000a2f9ca30bd1d4dadc93ee Mon Sep 17 00:00:00 2001 From: Dulma Churchill Date: Tue, 24 Oct 2017 08:02:15 -0700 Subject: [PATCH] [clang] Remove the translation of enumerateWithBlocks that causes FPs dead store. Reviewed By: ddino Differential Revision: D6135127 fbshipit-source-id: 0ae52e2 --- infer/src/clang/ast_expressions.ml | 391 ------------------ infer/src/clang/ast_expressions.mli | 4 - infer/src/clang/cTrans.ml | 16 +- infer/src/clang/cVar_decl.ml | 1 - .../objc/shared/block/block-it.m.dot | 118 ++---- 5 files changed, 27 insertions(+), 503 deletions(-) diff --git a/infer/src/clang/ast_expressions.ml b/infer/src/clang/ast_expressions.ml index 574e2d07d..80961ae89 100644 --- a/infer/src/clang/ast_expressions.ml +++ b/infer/src/clang/ast_expressions.ml @@ -30,33 +30,6 @@ let fresh_decl_info decl_info = {decl_info with Clang_ast_t.di_pointer= CAst_utils.get_fresh_pointer ()} -let empty_decl_info = - { Clang_ast_t.di_pointer= CAst_utils.get_invalid_pointer () - ; di_parent_pointer= None - ; di_source_range= dummy_source_range () - ; di_owning_module= None - ; di_is_hidden= false - ; di_is_implicit= false - ; di_is_used= true - ; di_is_this_declaration_referenced= true - ; di_is_invalid_decl= false - ; di_attributes= [] - ; di_full_comment= None - ; di_access= `None } - - -let empty_var_decl_info = - { Clang_ast_t.vdi_storage_class= None - ; vdi_tls_kind= `Tls_none - ; vdi_is_global= false - ; vdi_is_static_local= false - ; vdi_is_module_private= false - ; vdi_is_nrvo_variable= false - ; vdi_is_const_expr= false - ; vdi_init_expr= None - ; vdi_parm_index_in_function= None } - - let stmt_info_with_fresh_pointer stmt_info = { Clang_ast_t.si_pointer= CAst_utils.get_fresh_pointer () ; si_source_range= stmt_info.Clang_ast_t.si_source_range } @@ -94,12 +67,6 @@ let create_char_star_type ?quals () = create_pointer_qual_type ?quals create_cha let create_BOOL_type = builtin_to_qual_type `SChar -let create_unsigned_long_type = builtin_to_qual_type `ULong - -let create_void_unsigned_long_type = function_type_ptr create_void_type - -let create_void_void_type = function_type_ptr create_void_type - let create_class_qual_type ?quals typename = create_qual_type ?quals (Clang_ast_extend.ClassType typename) @@ -168,13 +135,6 @@ let make_expr_info qt vk objc_kind = let make_expr_info_with_objc_kind qt objc_kind = make_expr_info qt `LValue objc_kind -let make_decl_ref_exp stmt_info expr_info drei = - let stmt_info = - { Clang_ast_t.si_pointer= CAst_utils.get_fresh_pointer () - ; si_source_range= stmt_info.Clang_ast_t.si_source_range } - in - Clang_ast_t.DeclRefExpr (stmt_info, [], expr_info, drei) - let make_obj_c_message_expr_info_instance sel = { Clang_ast_t.omei_selector= sel @@ -204,10 +164,6 @@ let make_decl_ref_qt k decl_ptr name is_hidden qt = let make_decl_ref_no_qt k decl_ptr name is_hidden = make_decl_ref k decl_ptr name is_hidden None -let make_decl_ref_invalid k name is_hidden qt = - make_decl_ref k (CAst_utils.get_invalid_pointer ()) name is_hidden (Some qt) - - let make_decl_ref_expr_info decl_ref = {Clang_ast_t.drti_decl_ref= Some decl_ref; drti_found_decl_ref= None} @@ -220,11 +176,6 @@ let make_general_expr_info qt vk ok = {Clang_ast_t.ei_qual_type= qt; ei_value_kind= vk; ei_object_kind= ok} -let make_ObjCBoolLiteralExpr stmt_info value = - let ei = make_expr_info create_BOOL_type in - Clang_ast_t.ObjCBoolLiteralExpr (fresh_stmt_info stmt_info, [], ei, value) - - let make_message_expr param_qt selector decl_ref_exp stmt_info add_cast = let stmt_info = stmt_info_with_fresh_pointer stmt_info in let parameters = @@ -292,22 +243,6 @@ let translate_dispatch_function stmt_info stmt_list n = assert false -(* Create declaration statement: qt vname = iexp *) -let make_DeclStmt stmt_info di qt vname old_vdi iexp = - let init_expr_opt, init_expr_l = - match iexp with - | Some iexp' -> - let ie = create_implicit_cast_expr stmt_info [iexp'] qt `IntegralCast in - (Some ie, [ie]) - | None -> - (None, []) - in - let var_decl_info = {old_vdi with Clang_ast_t.vdi_init_expr= init_expr_opt} in - let di = fresh_decl_info di in - let var_decl = Clang_ast_t.VarDecl (di, vname, qt, var_decl_info) in - Clang_ast_t.DeclStmt (stmt_info, init_expr_l, [var_decl]) - - let build_OpaqueValueExpr si source_expr ei = let opaque_value_expr_info = {Clang_ast_t.ovei_source_expr= Some source_expr} in Clang_ast_t.OpaqueValueExpr (si, [], ei, opaque_value_expr_info) @@ -315,331 +250,6 @@ let build_OpaqueValueExpr si source_expr ei = let pseudo_object_qt = make_objc_class_qual_type CFrontend_config.pseudo_object_type -(* Create expression PseudoObjectExpr for 'o.m' *) -let build_PseudoObjectExpr qt_m o_cast_decl_ref_exp mname = - match o_cast_decl_ref_exp with - | Clang_ast_t.ImplicitCastExpr (si, _, ei, _) -> - let ove = build_OpaqueValueExpr si o_cast_decl_ref_exp ei in - let ei_opre = make_expr_info pseudo_object_qt in - let count_name = CAst_utils.make_name_decl CFrontend_config.count in - let pointer = si.Clang_ast_t.si_pointer in - let obj_c_property_ref_expr_info = - { Clang_ast_t.oprei_kind= - `PropertyRef (make_decl_ref_no_qt `ObjCProperty pointer count_name false) - ; oprei_is_super_receiver= false - ; oprei_is_messaging_getter= true - ; oprei_is_messaging_setter= false } - in - let opre = - Clang_ast_t.ObjCPropertyRefExpr (si, [ove], ei_opre, obj_c_property_ref_expr_info) - in - let ome = make_message_expr qt_m mname o_cast_decl_ref_exp si false in - let poe_ei = make_general_expr_info qt_m `LValue `Ordinary in - Clang_ast_t.PseudoObjectExpr (si, [opre; ove; ome], poe_ei) - | _ -> - assert false - - -let create_call stmt_info decl_pointer function_name qt parameters = - let expr_info_call = - { Clang_ast_t.ei_qual_type= create_void_star_type - ; ei_value_kind= `XValue - ; ei_object_kind= `Ordinary } - in - let expr_info_dre = make_expr_info_with_objc_kind qt `Ordinary in - let decl_ref = make_decl_ref_qt `Function decl_pointer function_name false qt in - let decl_ref_info = make_decl_ref_expr_info decl_ref in - let decl_ref_exp = Clang_ast_t.DeclRefExpr (stmt_info, [], expr_info_dre, decl_ref_info) in - let cast = - create_implicit_cast_expr (fresh_stmt_info stmt_info) [decl_ref_exp] qt `FunctionToPointerDecay - in - Clang_ast_t.CallExpr (stmt_info, cast :: parameters, expr_info_call) - - -(* For a of type NSArray* Translate - [a enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL * stop) { - body_block - }; - ]; - - as follows: - - NSArray *objects = a; - void (^enumerateObjectsUsingBlock)(id, NSUInteger, BOOL* ) = - ^(id object, NSUInteger idx, BOOL* stop) { - body_block - }; - BOOL *stop = malloc(sizeof(BOOL)); - *stop = NO; - - for (NSUInteger idx=0; idx - [] - | (Clang_ast_t.ParmVarDecl (di, name, qt, _)) :: lp' -> - (name.Clang_ast_t.ni_name, di.Clang_ast_t.di_pointer, qt) :: get_name_pointers lp' - | _ -> - assert false - in - let build_idx_decl pidx = - match pidx with - | Clang_ast_t.ParmVarDecl (di_idx, name_idx, qt_idx, vdi) -> - let zero = create_integer_literal "0" in - (* qt_idx idx = 0; *) - let idx_decl_stmt = - make_DeclStmt (fresh_stmt_info stmt_info) di_idx qt_idx name_idx vdi (Some zero) - in - let idx_ei = make_expr_info qt_idx in - let pointer = di_idx.Clang_ast_t.di_pointer in - let idx_decl_ref = make_decl_ref_qt `Var pointer name_idx false qt_idx in - let idx_drei = make_decl_ref_expr_info idx_decl_ref in - let idx_decl_ref_exp = make_decl_ref_exp stmt_info idx_ei idx_drei in - let idx_cast = - create_implicit_cast_expr (fresh_stmt_info stmt_info) [idx_decl_ref_exp] qt_idx - `LValueToRValue - in - (idx_decl_stmt, idx_decl_ref_exp, idx_cast, qt_idx) - | _ -> - assert false - in - let cast_expr decl_ref qt = - let ei = make_expr_info qt in - let drei = make_decl_ref_expr_info decl_ref in - let decl_ref_exp = make_decl_ref_exp (fresh_stmt_info stmt_info) ei drei in - create_implicit_cast_expr (fresh_stmt_info stmt_info) [decl_ref_exp] qt `LValueToRValue - in - (* build statement BOOL *stop = malloc(sizeof(BOOL)); *) - let build_stop pstop = - match pstop with - | Clang_ast_t.ParmVarDecl (di, name, qt, vdi) -> - let qt_fun = create_void_unsigned_long_type in - let type_opt = Some create_BOOL_type in - let parameter = - Clang_ast_t.UnaryExprOrTypeTraitExpr - ( fresh_stmt_info stmt_info - , [] - , make_general_expr_info create_unsigned_long_type `RValue `Ordinary - , {Clang_ast_t.uttei_kind= `SizeOfWithSize 1; Clang_ast_t.uttei_qual_type= type_opt} ) - in - let pointer = di.Clang_ast_t.di_pointer in - let stmt_info = fresh_stmt_info stmt_info in - let malloc_name = CAst_utils.make_name_decl CFrontend_config.malloc in - let malloc = create_call stmt_info pointer malloc_name qt_fun [parameter] in - let init_exp = - create_implicit_cast_expr (fresh_stmt_info stmt_info) [malloc] qt `BitCast - in - make_DeclStmt (fresh_stmt_info stmt_info) di qt name vdi (Some init_exp) - | _ -> - assert false - in - (* BOOL *stop =NO; *) - let stop_equal_no pstop = - match pstop with - | Clang_ast_t.ParmVarDecl (di, name, qt, _) -> - let decl_ref = make_decl_ref_qt `Var di.Clang_ast_t.di_pointer name false qt in - let cast = cast_expr decl_ref qt in - let postfix_deref = {Clang_ast_t.uoi_kind= `Deref; uoi_is_postfix= true} in - let lhs = - Clang_ast_t.UnaryOperator (fresh_stmt_info stmt_info, [cast], ei, postfix_deref) - in - let bool_NO = make_ObjCBoolLiteralExpr stmt_info 0 in - let assign = {Clang_ast_t.boi_kind= `Assign} in - Clang_ast_t.BinaryOperator (fresh_stmt_info stmt_info, [lhs; bool_NO], ei, assign) - | _ -> - assert false - in - (* build statement free(stop); *) - let free_stop pstop = - match pstop with - | Clang_ast_t.ParmVarDecl (di, name, qt, _) -> - let qt_fun = create_void_void_type in - let decl_ref = make_decl_ref_qt `Var di.Clang_ast_t.di_pointer name false qt in - let cast = cast_expr decl_ref qt in - let free_name = CAst_utils.make_name_decl CFrontend_config.free in - let parameter = - create_implicit_cast_expr (fresh_stmt_info stmt_info) [cast] create_void_star_type - `BitCast - in - let pointer = di.Clang_ast_t.di_pointer in - create_call (fresh_stmt_info stmt_info) pointer free_name qt_fun [parameter] - | _ -> - assert false - in - (* idx ei | _ -> assert false - in - (* id object = objects[idx]; *) - let build_object_DeclStmt pobj decl_ref_expr_array decl_ref_expr_idx = - let open Clang_ast_t in - match pobj with - | ParmVarDecl (di_obj, name_obj, qt_obj, _) -> - let poe_ei = make_general_expr_info qt_obj `RValue `Ordinary in - let ei_array = get_ei_from_cast decl_ref_expr_array in - let ove_array = - build_OpaqueValueExpr (fresh_stmt_info stmt_info) decl_ref_expr_array ei_array - in - let ei_idx = get_ei_from_cast decl_ref_expr_idx in - let ove_idx = build_OpaqueValueExpr (fresh_stmt_info stmt_info) decl_ref_expr_idx ei_idx in - let objc_sre = - ObjCSubscriptRefExpr - ( fresh_stmt_info stmt_info - , [ove_array; ove_idx] - , make_expr_info pseudo_object_qt - , {osrei_kind= `ArraySubscript; osrei_getter= None; osrei_setter= None} ) - in - let obj_c_message_expr_info = - make_obj_c_message_expr_info_instance CFrontend_config.object_at_indexed_subscript_m - in - let ome = - ObjCMessageExpr - (fresh_stmt_info stmt_info, [ove_array; ove_idx], poe_ei, obj_c_message_expr_info) - in - let pseudo_obj_expr = - PseudoObjectExpr (fresh_stmt_info stmt_info, [objc_sre; ove_array; ove_idx; ome], poe_ei) - in - let vdi = {empty_var_decl_info with vdi_init_expr= Some pseudo_obj_expr} in - let var_decl = VarDecl (di_obj, name_obj, qt_obj, vdi) in - DeclStmt (fresh_stmt_info stmt_info, [pseudo_obj_expr], [var_decl]) - | _ -> - assert false - in - (* NSArray *objects = a *) - let objects_array_DeclStmt init = - let di = {empty_decl_info with Clang_ast_t.di_pointer= CAst_utils.get_fresh_pointer ()} in - let qt = create_pointer_qual_type (make_objc_class_qual_type CFrontend_config.nsarray_cl) in - (* init should be ImplicitCastExpr of array a *) - let vdi = {empty_var_decl_info with Clang_ast_t.vdi_init_expr= Some init} in - let objects_name = CAst_utils.make_name_decl CFrontend_config.objects in - let var_decl = Clang_ast_t.VarDecl (di, objects_name, qt, vdi) in - ( Clang_ast_t.DeclStmt (fresh_stmt_info stmt_info, [init], [var_decl]) - , [(CFrontend_config.objects, di.Clang_ast_t.di_pointer, qt)] ) - in - let make_object_cast_decl_ref_expr objects = - match objects with - | Clang_ast_t.DeclStmt (si, _, [(Clang_ast_t.VarDecl (_, name, qt, _))]) -> - let decl_ref = make_decl_ref_qt `Var si.Clang_ast_t.si_pointer name false qt in - cast_expr decl_ref qt - | _ -> - assert false - in - let build_cast_decl_ref_expr_from_parm p = - match p with - | Clang_ast_t.ParmVarDecl (di, name, qt, _) -> - let decl_ref = make_decl_ref_qt `Var di.Clang_ast_t.di_pointer name false qt in - cast_expr decl_ref qt - | _ -> - assert false - in - let qual_block_name = CAst_utils.make_name_decl block_name in - let make_block_decl be = - match be with - | Clang_ast_t.BlockExpr (bsi, _, bei, _) -> - let di = {empty_decl_info with di_pointer= CAst_utils.get_fresh_pointer ()} in - let vdi = {empty_var_decl_info with Clang_ast_t.vdi_init_expr= Some be} in - let qt = bei.Clang_ast_t.ei_qual_type in - let var_decl = Clang_ast_t.VarDecl (di, qual_block_name, qt, vdi) in - ( Clang_ast_t.DeclStmt (bsi, [be], [var_decl]) - , [(block_name, di.Clang_ast_t.di_pointer, qt)] ) - | _ -> - assert false - in - let make_block_call block_qt object_cast idx_cast stop_cast = - let decl_ref = make_decl_ref_invalid `Var qual_block_name false block_qt in - let fun_cast = cast_expr decl_ref block_qt in - let ei_call = make_expr_info create_void_star_type in - Clang_ast_t.CallExpr - (fresh_stmt_info stmt_info, [fun_cast; object_cast; idx_cast; stop_cast], ei_call) - in - (* build statement "if (stop) break;" *) - let build_if_stop stop_cast = - let bool_qt = create_BOOL_type in - let ei = make_expr_info bool_qt in - let unary_op = - Clang_ast_t.UnaryOperator - ( fresh_stmt_info stmt_info - , [stop_cast] - , ei - , {Clang_ast_t.uoi_kind= `Deref; uoi_is_postfix= true} ) - in - let cond = - create_implicit_cast_expr (fresh_stmt_info stmt_info) [unary_op] bool_qt `LValueToRValue - in - let break_stmt = Clang_ast_t.BreakStmt (fresh_stmt_info stmt_info, []) in - Clang_ast_t.IfStmt - (fresh_stmt_info stmt_info, [dummy_stmt (); dummy_stmt (); cond; break_stmt; dummy_stmt ()]) - in - let translate params array_cast_decl_ref_exp block_decl block_qt = - match params with - | [pobj; pidx; pstop] -> - let objects_decl, op = objects_array_DeclStmt array_cast_decl_ref_exp in - let decl_stop = build_stop pstop in - let assign_stop = stop_equal_no pstop in - let objects = make_object_cast_decl_ref_expr objects_decl in - let idx_decl_stmt, idx_decl_ref_exp, idx_cast, qt_idx = build_idx_decl pidx in - let guard = bin_op pidx objects in - let incr = un_op idx_decl_ref_exp qt_idx in - let obj_assignment = build_object_DeclStmt pobj objects idx_cast in - let object_cast = build_cast_decl_ref_expr_from_parm pobj in - let stop_cast = build_cast_decl_ref_expr_from_parm pstop in - let call_block = make_block_call block_qt object_cast idx_cast stop_cast in - let if_stop = build_if_stop stop_cast in - let free_stop = free_stop pstop in - ( [ objects_decl - ; block_decl - ; decl_stop - ; assign_stop - ; Clang_ast_t.ForStmt - ( stmt_info - , [ idx_decl_stmt - ; dummy_stmt () - ; guard - ; incr - ; Clang_ast_t.CompoundStmt (stmt_info, [obj_assignment; call_block; if_stop]) ] ) - ; free_stop ] - , op ) - | _ -> - (* FIXME(t21762295) this is reachable *) - CFrontend_config.incorrect_assumption "wrong params in block enumerate translation: %a" - (Pp.seq (Pp.to_string ~f:Clang_ast_j.string_of_decl)) - params - in - let open Clang_ast_t in - match stmt_list with - | [s; (BlockExpr (_, _, bei, BlockDecl (_, bdi)) as be)] -> - let block_decl, bv = make_block_decl be in - let vars_to_register = get_name_pointers bdi.bdi_parameters in - let translated_stmt, op = translate bdi.bdi_parameters s block_decl bei.ei_qual_type in - (CompoundStmt (stmt_info, translated_stmt), vars_to_register @ op @ bv) - | _ -> - (* When it is not the method we expect with only one parameter, we don't translate *) - L.(debug Capture Verbose) - "WARNING: Block Enumeration called at %s not translated." - (Clang_ast_j.string_of_stmt_info stmt_info) ; - (CompoundStmt (stmt_info, stmt_list), []) - - (* We translate an expression with a conditional*) (* x <=> x?1:0 *) let trans_with_conditional stmt_info expr_info stmt_list = @@ -652,4 +262,3 @@ let trans_with_conditional stmt_info expr_info stmt_list = let trans_negation_with_conditional stmt_info expr_info stmt_list = let stmt_list_cond = stmt_list @ [create_integer_literal "0"] @ [create_integer_literal "1"] in Clang_ast_t.ConditionalOperator (stmt_info, stmt_list_cond, expr_info) - diff --git a/infer/src/clang/ast_expressions.mli b/infer/src/clang/ast_expressions.mli index 7d9794ddf..3eb737b96 100644 --- a/infer/src/clang/ast_expressions.mli +++ b/infer/src/clang/ast_expressions.mli @@ -56,10 +56,6 @@ val make_obj_c_message_expr_info_instance : string -> obj_c_message_expr_info val translate_dispatch_function : stmt_info -> stmt list -> int -> stmt -val translate_block_enumerate : - string -> stmt_info -> stmt list -> expr_info - -> stmt * (string * Clang_ast_t.pointer * qual_type) list - (* We translate an expression with a conditional*) (* x <=> x?1:0 *) diff --git a/infer/src/clang/cTrans.ml b/infer/src/clang/cTrans.ml index 88ba6f762..b00edd2d5 100644 --- a/infer/src/clang/cTrans.ml +++ b/infer/src/clang/cTrans.ml @@ -1352,17 +1352,6 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s instruction trans_state transformed_stmt - and block_enumeration_trans trans_state stmt_info stmt_list ei = - L.(debug Capture Verbose) - "@\n Call to a block enumeration function treated as special case...@\n@." ; - let procname = Procdesc.get_proc_name trans_state.context.CContext.procdesc in - let pvar = CProcname.get_next_block_pvar procname in - let transformed_stmt, _ = - Ast_expressions.translate_block_enumerate (Pvar.to_string pvar) stmt_info stmt_list ei - in - instruction trans_state transformed_stmt - - and compute_this_for_destructor_calls trans_state stmt_info class_ptr = let context = trans_state.context in let sil_loc = CLocation.get_sil_location stmt_info context in @@ -3162,10 +3151,7 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s | CXXTemporaryObjectExpr (stmt_info, stmt_list, expr_info, cxx_constr_info) -> cxxConstructExpr_trans trans_state stmt_info stmt_list expr_info cxx_constr_info | ObjCMessageExpr (stmt_info, stmt_list, expr_info, obj_c_message_expr_info) -> - if is_block_enumerate_function obj_c_message_expr_info then - block_enumeration_trans trans_state stmt_info stmt_list expr_info - else - objCMessageExpr_trans trans_state stmt_info obj_c_message_expr_info stmt_list expr_info + objCMessageExpr_trans trans_state stmt_info obj_c_message_expr_info stmt_list expr_info | CompoundStmt (stmt_info, stmt_list) -> (* No node for this statement. We just collect its statement list*) compoundStmt_trans trans_state stmt_info stmt_list diff --git a/infer/src/clang/cVar_decl.ml b/infer/src/clang/cVar_decl.ml index 034b2aeb4..26b07908a 100644 --- a/infer/src/clang/cVar_decl.ml +++ b/infer/src/clang/cVar_decl.ml @@ -119,4 +119,3 @@ let captured_vars_from_block_info context cvl = assert false in List.fold_right ~f:sil_var_of_captured_var cvl ~init:[] - diff --git a/infer/tests/codetoanalyze/objc/shared/block/block-it.m.dot b/infer/tests/codetoanalyze/objc/shared/block/block-it.m.dot index 916dc711f..74d953f96 100644 --- a/infer/tests/codetoanalyze/objc/shared/block/block-it.m.dot +++ b/infer/tests/codetoanalyze/objc/shared/block/block-it.m.dot @@ -16,15 +16,15 @@ digraph iCFG { "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_4" -> "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_2" ; -"objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_5" [label="5: Prune (true branch) \n n$19=*&ShouldStop:int [line 26, column 9]\n PRUNE(n$19, true); [line 26, column 9]\n " shape="invhouse"] +"objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_5" [label="5: Prune (true branch) \n n$1=*&ShouldStop:int [line 26, column 9]\n PRUNE(n$1, true); [line 26, column 9]\n " shape="invhouse"] "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_5" -> "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_7" ; -"objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_6" [label="6: Prune (false branch) \n n$19=*&ShouldStop:int [line 26, column 9]\n PRUNE(!n$19, false); [line 26, column 9]\n " shape="invhouse"] +"objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_6" [label="6: Prune (false branch) \n n$1=*&ShouldStop:int [line 26, column 9]\n PRUNE(!n$1, false); [line 26, column 9]\n " shape="invhouse"] "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_6" -> "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_3" ; -"objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_7" [label="7: BinaryOperatorStmt: Assign \n n$20=*&stop:_Bool* [line 27, column 8]\n *n$20:_Bool=1 [line 27, column 7]\n " shape="box"] +"objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_7" [label="7: BinaryOperatorStmt: Assign \n n$2=*&stop:_Bool* [line 27, column 8]\n *n$2:_Bool=1 [line 27, column 7]\n " shape="box"] "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_7" -> "objc_blockMyBlock_array_1.876ea7470c254ef92f8b4921d5f810e1_3" ; @@ -44,99 +44,33 @@ digraph iCFG { "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_4" -> "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_2" ; -"objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_5" [label="5: Prune (true branch) \n n$42=*&ShouldStop:int [line 44, column 13]\n PRUNE(n$42, true); [line 44, column 13]\n " shape="invhouse"] +"objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_5" [label="5: Prune (true branch) \n n$24=*&ShouldStop:int [line 44, column 13]\n PRUNE(n$24, true); [line 44, column 13]\n " shape="invhouse"] "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_5" -> "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_7" ; -"objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_6" [label="6: Prune (false branch) \n n$42=*&ShouldStop:int [line 44, column 13]\n PRUNE(!n$42, false); [line 44, column 13]\n " shape="invhouse"] +"objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_6" [label="6: Prune (false branch) \n n$24=*&ShouldStop:int [line 44, column 13]\n PRUNE(!n$24, false); [line 44, column 13]\n " shape="invhouse"] "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_6" -> "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_3" ; -"objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_7" [label="7: BinaryOperatorStmt: Assign \n n$43=*&stop:_Bool* [line 45, column 12]\n *n$43:_Bool=1 [line 45, column 11]\n " shape="box"] +"objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_7" [label="7: BinaryOperatorStmt: Assign \n n$25=*&stop:_Bool* [line 45, column 12]\n *n$25:_Bool=1 [line 45, column 11]\n " shape="box"] "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_7" -> "objc_blockMyBlock_array_trans_2.5153520a659dce1fe6582bd44cf47e84_3" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_1" [label="1: Start MyBlock_array\nFormals: self:MyBlock*\nLocals: idx:unsigned long object:objc_object* stop:_Bool* 0$?%__sil_tmpobjc_blockMyBlock_array_1n$0:_fn_(*) objects:NSArray* a:NSArray* \n DECLARE_LOCALS(&return,&idx,&object,&stop,&0$?%__sil_tmpobjc_blockMyBlock_array_1n$0,&objects,&a); [line 18, column 1]\n " color=yellow style=filled] +"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_1" [label="1: Start MyBlock_array\nFormals: self:MyBlock*\nLocals: a:NSArray* \n DECLARE_LOCALS(&return,&a); [line 18, column 1]\n " color=yellow style=filled] - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_1" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_20" ; + "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_1" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_4" ; "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_2" [label="2: Exit MyBlock_array \n " color=yellow style=filled] -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_3" [label="3: Call _fun_free \n n$1=*&stop:_Bool* [line 21, column 3]\n n$2=_fun_free(n$1:void*) [line 21, column 3]\n " shape="box"] +"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_3" [label="3: Message Call: enumerateObjectsUsingBlock: \n n$0=*&a:NSArray* [line 21, column 4]\n DECLARE_LOCALS(&0$?%__sil_tmp_block_heap_var_n$4); [line 21, column 33]\n n$3=_fun___objc_alloc_no_fail(sizeof(t=Objc_blockMyBlock_array_1Class):unsigned long) [line 21, column 33]\n *&0$?%__sil_tmp_block_heap_var_n$4:Objc_blockMyBlock_array_1Class=n$3 [line 21, column 33]\n n$5=*&objc_blockMyBlock_array_1:_fn_(*) [line 21, column 3]\n _fun_NSArray_enumerateObjectsUsingBlock:(n$0:NSArray*,n$5:_fn_(*)) virtual [line 21, column 3]\n " shape="box"] "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_3" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_2" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_4" [label="4: + \n " ] +"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_4" [label="4: DeclStmt \n n$6=_fun___objc_alloc_no_fail(sizeof(t=NSArray):unsigned long) [line 20, column 17]\n n$7=_fun_NSArray_init(n$6:NSArray*) virtual [line 20, column 16]\n *&a:NSArray*=n$7 [line 20, column 3]\n " shape="box"] - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_4" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_7" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_5" [label="5: DeclStmt \n *&idx:unsigned long=0 [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_5" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_4" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_6" [label="6: UnaryOperator \n n$3=*&idx:unsigned long [line 21, column 3]\n *&idx:unsigned long=(n$3 + 1) [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_6" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_4" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_7" [label="7: BinaryOperatorStmt: LT \n n$4=*&idx:unsigned long [line 21, column 3]\n n$5=*&objects:NSArray* [line 21, column 3]\n n$6=_fun_NSArray_count(n$5:NSArray*) virtual [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_7" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_8" ; - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_7" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_9" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_8" [label="8: Prune (true branch) \n PRUNE((n$4 < n$6), true); [line 21, column 3]\n " shape="invhouse"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_8" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_15" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_9" [label="9: Prune (false branch) \n PRUNE(!(n$4 < n$6), false); [line 21, column 3]\n " shape="invhouse"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_9" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_3" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_10" [label="10: + \n " ] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_10" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_6" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_11" [label="11: UnaryOperator \n n$7=*&stop:_Bool* [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_11" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_12" ; - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_11" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_13" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_12" [label="12: Prune (true branch) \n n$8=*n$7:signed char [line 21, column 3]\n PRUNE(n$8, true); [line 21, column 3]\n " shape="invhouse"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_12" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_3" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_13" [label="13: Prune (false branch) \n n$8=*n$7:signed char [line 21, column 3]\n PRUNE(!n$8, false); [line 21, column 3]\n " shape="invhouse"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_13" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_10" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_14" [label="14: Call n$9 \n n$9=*&0$?%__sil_tmpobjc_blockMyBlock_array_1n$0:_fn_(*) [line 21, column 3]\n n$10=*&object:objc_object* [line 21, column 3]\n n$11=*&idx:unsigned long [line 21, column 3]\n n$12=*&stop:_Bool* [line 21, column 3]\n n$13=n$9(n$10:objc_object*,n$11:unsigned long,n$12:_Bool*) [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_14" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_11" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_15" [label="15: DeclStmt \n n$14=*&objects:NSArray* [line 21, column 3]\n n$15=*&idx:unsigned long [line 21, column 3]\n n$16=_fun_NSArray_objectAtIndexedSubscript:(n$14:NSArray*,n$15:unsigned long) virtual [line 21, column 3]\n *&object:objc_object*=n$16 [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_15" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_14" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_16" [label="16: BinaryOperatorStmt: Assign \n n$17=*&stop:_Bool* [line 21, column 3]\n *n$17:void=0 [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_16" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_5" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_17" [label="17: DeclStmt \n n$18=_fun_malloc_no_fail(sizeof(t=signed char;nbytes=1):signed char) [line 21, column 3]\n *&stop:_Bool*=n$18 [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_17" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_16" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_18" [label="18: DeclStmt \n DECLARE_LOCALS(&0$?%__sil_tmp_block_heap_var_n$22); [line 21, column 33]\n n$21=_fun___objc_alloc_no_fail(sizeof(t=Objc_blockMyBlock_array_1Class):unsigned long) [line 21, column 33]\n *&0$?%__sil_tmp_block_heap_var_n$22:Objc_blockMyBlock_array_1Class=n$21 [line 21, column 33]\n *&0$?%__sil_tmpobjc_blockMyBlock_array_1n$0:_fn_(*)=(_fun_objc_blockMyBlock_array_1) [line 21, column 33]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_18" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_17" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_19" [label="19: DeclStmt \n n$23=*&a:NSArray* [line 21, column 4]\n *&objects:NSArray*=n$23 [line 21, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_19" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_18" ; -"array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_20" [label="20: DeclStmt \n n$24=_fun___objc_alloc_no_fail(sizeof(t=NSArray):unsigned long) [line 20, column 17]\n n$25=_fun_NSArray_init(n$24:NSArray*) virtual [line 20, column 16]\n *&a:NSArray*=n$25 [line 20, column 3]\n " shape="box"] - - - "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_20" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_19" ; + "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_4" -> "array#MyBlock#instance.8be6e5b5e968d186440e1931c9eb40de_3" ; "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_1" [label="1: Start MyBlock_array_trans\nFormals: self:MyBlock*\nLocals: idx:unsigned long object:objc_object* stop:_Bool* enumerateObjectsUsingBlock:_fn_(*) objects:NSArray* a:NSArray* \n DECLARE_LOCALS(&return,&idx,&object,&stop,&enumerateObjectsUsingBlock,&objects,&a); [line 32, column 1]\n " color=yellow style=filled] @@ -144,7 +78,7 @@ digraph iCFG { "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_2" [label="2: Exit MyBlock_array_trans \n " color=yellow style=filled] -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_3" [label="3: Call _fun_free \n n$26=*&stop:_Bool* [line 58, column 8]\n _fun_free(n$26:void*) [line 58, column 3]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_3" [label="3: Call _fun_free \n n$8=*&stop:_Bool* [line 58, column 8]\n _fun_free(n$8:void*) [line 58, column 3]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_3" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_2" ; @@ -156,20 +90,20 @@ digraph iCFG { "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_5" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_4" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_6" [label="6: UnaryOperator \n n$27=*&idx:unsigned long [line 51, column 49]\n *&idx:unsigned long=(n$27 + 1) [line 51, column 49]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_6" [label="6: UnaryOperator \n n$9=*&idx:unsigned long [line 51, column 49]\n *&idx:unsigned long=(n$9 + 1) [line 51, column 49]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_6" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_4" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_7" [label="7: BinaryOperatorStmt: LT \n n$28=*&idx:unsigned long [line 51, column 28]\n n$29=*&objects:NSArray* [line 51, column 34]\n n$30=_fun_NSArray_count(n$29:NSArray*) [line 51, column 42]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_7" [label="7: BinaryOperatorStmt: LT \n n$10=*&idx:unsigned long [line 51, column 28]\n n$11=*&objects:NSArray* [line 51, column 34]\n n$12=_fun_NSArray_count(n$11:NSArray*) [line 51, column 42]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_7" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_8" ; "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_7" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_9" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_8" [label="8: Prune (true branch) \n PRUNE((n$28 < n$30), true); [line 51, column 28]\n " shape="invhouse"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_8" [label="8: Prune (true branch) \n PRUNE((n$10 < n$12), true); [line 51, column 28]\n " shape="invhouse"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_8" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_15" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_9" [label="9: Prune (false branch) \n PRUNE(!(n$28 < n$30), false); [line 51, column 28]\n " shape="invhouse"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_9" [label="9: Prune (false branch) \n PRUNE(!(n$10 < n$12), false); [line 51, column 28]\n " shape="invhouse"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_9" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_3" ; @@ -177,44 +111,44 @@ digraph iCFG { "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_10" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_6" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_11" [label="11: BinaryOperatorStmt: EQ \n n$31=*&stop:_Bool* [line 55, column 10]\n n$32=*n$31:_Bool [line 55, column 9]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_11" [label="11: BinaryOperatorStmt: EQ \n n$13=*&stop:_Bool* [line 55, column 10]\n n$14=*n$13:_Bool [line 55, column 9]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_11" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_12" ; "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_11" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_13" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_12" [label="12: Prune (true branch) \n PRUNE((n$32 == 1), true); [line 55, column 9]\n " shape="invhouse"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_12" [label="12: Prune (true branch) \n PRUNE((n$14 == 1), true); [line 55, column 9]\n " shape="invhouse"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_12" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_3" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_13" [label="13: Prune (false branch) \n PRUNE(!(n$32 == 1), false); [line 55, column 9]\n " shape="invhouse"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_13" [label="13: Prune (false branch) \n PRUNE(!(n$14 == 1), false); [line 55, column 9]\n " shape="invhouse"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_13" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_10" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_14" [label="14: Call n$33 \n n$33=*&enumerateObjectsUsingBlock:_fn_(*) [line 54, column 5]\n n$34=*&object:objc_object* [line 54, column 32]\n n$35=*&idx:unsigned long [line 54, column 40]\n n$36=*&stop:_Bool* [line 54, column 45]\n n$33(n$34:objc_object*,n$35:unsigned long,n$36:_Bool*) [line 54, column 5]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_14" [label="14: Call n$15 \n n$15=*&enumerateObjectsUsingBlock:_fn_(*) [line 54, column 5]\n n$16=*&object:objc_object* [line 54, column 32]\n n$17=*&idx:unsigned long [line 54, column 40]\n n$18=*&stop:_Bool* [line 54, column 45]\n n$15(n$16:objc_object*,n$17:unsigned long,n$18:_Bool*) [line 54, column 5]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_14" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_11" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_15" [label="15: DeclStmt \n n$37=*&objects:NSArray* [line 53, column 17]\n n$38=*&idx:unsigned long [line 53, column 25]\n n$39=_fun_NSArray_objectAtIndexedSubscript:(n$37:NSArray*,n$38:unsigned long) virtual [line 53, column 17]\n *&object:objc_object*=n$39 [line 53, column 5]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_15" [label="15: DeclStmt \n n$19=*&objects:NSArray* [line 53, column 17]\n n$20=*&idx:unsigned long [line 53, column 25]\n n$21=_fun_NSArray_objectAtIndexedSubscript:(n$19:NSArray*,n$20:unsigned long) virtual [line 53, column 17]\n *&object:objc_object*=n$21 [line 53, column 5]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_15" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_14" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_16" [label="16: BinaryOperatorStmt: Assign \n n$40=*&stop:_Bool* [line 49, column 4]\n *n$40:_Bool=0 [line 49, column 3]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_16" [label="16: BinaryOperatorStmt: Assign \n n$22=*&stop:_Bool* [line 49, column 4]\n *n$22:_Bool=0 [line 49, column 3]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_16" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_5" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_17" [label="17: DeclStmt \n n$41=_fun_malloc_no_fail(sizeof(t=_Bool;nbytes=1):_Bool) [line 48, column 16]\n *&stop:_Bool*=n$41 [line 48, column 3]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_17" [label="17: DeclStmt \n n$23=_fun_malloc_no_fail(sizeof(t=_Bool;nbytes=1):_Bool) [line 48, column 16]\n *&stop:_Bool*=n$23 [line 48, column 3]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_17" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_16" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_18" [label="18: DeclStmt \n DECLARE_LOCALS(&0$?%__sil_tmp_block_heap_var_n$45); [line 40, column 7]\n n$44=_fun___objc_alloc_no_fail(sizeof(t=Objc_blockMyBlock_array_trans_2Class):unsigned long) [line 40, column 7]\n *&0$?%__sil_tmp_block_heap_var_n$45:Objc_blockMyBlock_array_trans_2Class=n$44 [line 40, column 7]\n *&enumerateObjectsUsingBlock:_fn_(*)=(_fun_objc_blockMyBlock_array_trans_2) [line 39, column 3]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_18" [label="18: DeclStmt \n DECLARE_LOCALS(&0$?%__sil_tmp_block_heap_var_n$27); [line 40, column 7]\n n$26=_fun___objc_alloc_no_fail(sizeof(t=Objc_blockMyBlock_array_trans_2Class):unsigned long) [line 40, column 7]\n *&0$?%__sil_tmp_block_heap_var_n$27:Objc_blockMyBlock_array_trans_2Class=n$26 [line 40, column 7]\n *&enumerateObjectsUsingBlock:_fn_(*)=(_fun_objc_blockMyBlock_array_trans_2) [line 39, column 3]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_18" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_17" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_19" [label="19: DeclStmt \n n$46=*&a:NSArray* [line 36, column 22]\n *&objects:NSArray*=n$46 [line 36, column 3]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_19" [label="19: DeclStmt \n n$28=*&a:NSArray* [line 36, column 22]\n *&objects:NSArray*=n$28 [line 36, column 3]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_19" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_18" ; -"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_20" [label="20: DeclStmt \n n$47=_fun___objc_alloc_no_fail(sizeof(t=NSArray):unsigned long) [line 34, column 17]\n n$48=_fun_NSArray_init(n$47:NSArray*) virtual [line 34, column 16]\n *&a:NSArray*=n$48 [line 34, column 3]\n " shape="box"] +"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_20" [label="20: DeclStmt \n n$29=_fun___objc_alloc_no_fail(sizeof(t=NSArray):unsigned long) [line 34, column 17]\n n$30=_fun_NSArray_init(n$29:NSArray*) virtual [line 34, column 16]\n *&a:NSArray*=n$30 [line 34, column 3]\n " shape="box"] "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_20" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_19" ;