diff --git a/infer/src/IR/ProcAttributes.ml b/infer/src/IR/ProcAttributes.ml index 39aac9c7d..c75070a13 100644 --- a/infer/src/IR/ProcAttributes.ml +++ b/infer/src/IR/ProcAttributes.ml @@ -36,6 +36,12 @@ type objc_accessor_type = | Objc_setter of Typ.Struct.field [@@deriving compare] +type var_attribute = Modify_in_block [@@deriving compare] + +let var_attribute_equal = [%compare.equal : var_attribute] + +type var_data = {name: Mangled.t; typ: Typ.t; attributes: var_attribute list} [@@deriving compare] + type t = { access: PredSymb.access (** visibility access *) ; captured: (Mangled.t * Typ.t) list (** name and type of variables captured in blocks *) @@ -59,8 +65,8 @@ type t = ; is_synthetic_method: bool (** the procedure is a synthetic method *) ; loc: Location.t (** location of this procedure in the source code *) ; translation_unit: SourceFile.t option (** translation unit to which the procedure belongs *) - ; mutable locals: (Mangled.t * Typ.t) list (** name and type of local variables *) - ; method_annotation: Annot.Method.t (** annotations for java methods *) + ; mutable locals: var_data list (** name, type and attributes of local variables *) + ; method_annotation: Annot.Method.t (** annotations for all methods *) ; objc_accessor: objc_accessor_type option (** type of ObjC accessor, if any *) ; proc_flags: proc_flags (** flags of the procedure *) ; proc_name: Typ.Procname.t (** name of the procedure *) diff --git a/infer/src/IR/ProcAttributes.mli b/infer/src/IR/ProcAttributes.mli index 1adcf01ec..142af761d 100644 --- a/infer/src/IR/ProcAttributes.mli +++ b/infer/src/IR/ProcAttributes.mli @@ -33,6 +33,16 @@ type objc_accessor_type = | Objc_setter of Typ.Struct.field [@@deriving compare] +type var_attribute = + | Modify_in_block + (* __block attribute of Objective-C variables, means that it will be modified inside a block *) + [@@deriving compare] + +val var_attribute_equal : var_attribute -> var_attribute -> bool +(** Equality for var_attribute *) + +type var_data = {name: Mangled.t; typ: Typ.t; attributes: var_attribute list} [@@deriving compare] + type t = { access: PredSymb.access (** visibility access *) ; captured: (Mangled.t * Typ.t) list (** name and type of variables captured in blocks *) @@ -56,8 +66,8 @@ type t = ; is_synthetic_method: bool (** the procedure is a synthetic method *) ; loc: Location.t (** location of this procedure in the source code *) ; translation_unit: SourceFile.t option (** translation unit to which the procedure belongs *) - ; mutable locals: (Mangled.t * Typ.t) list (** name and type of local variables *) - ; method_annotation: Annot.Method.t (** annotations for java methods *) + ; mutable locals: var_data list (** name, type and attributes of local variables *) + ; method_annotation: Annot.Method.t (** annotations for all methods *) ; objc_accessor: objc_accessor_type option (** type of ObjC accessor, if any *) ; proc_flags: proc_flags (** flags of the procedure *) ; proc_name: Typ.Procname.t (** name of the procedure *) diff --git a/infer/src/IR/Procdesc.ml b/infer/src/IR/Procdesc.ml index 4996b40be..e70bc3587 100644 --- a/infer/src/IR/Procdesc.ml +++ b/infer/src/IR/Procdesc.ml @@ -191,7 +191,9 @@ module Node = struct let ret_type = proc_attributes.ret_type in (Pvar.get_ret_pvar pname, ret_type) in - let construct_decl (x, typ) = (Pvar.mk x pname, typ) in + let construct_decl (var_data: ProcAttributes.var_data) = + (Pvar.mk var_data.name pname, var_data.typ) + in let ptl = ret_var :: List.map ~f:construct_decl locals in let instr = Sil.Declare_locals (ptl, loc) in prepend_instrs node [instr] @@ -504,6 +506,22 @@ let is_loop_head pdesc (node: Node.t) = NodeSet.mem node lh +let pp_var_attributes fmt attrs = + let pp_attribute fmt attr = + match attr with ProcAttributes.Modify_in_block -> Format.fprintf fmt "__block" + in + if List.is_empty attrs then () else F.fprintf fmt "(%a)" (Pp.seq ~sep:"," pp_attribute) attrs + + +let pp_local fmt (var_data: ProcAttributes.var_data) = + Format.fprintf fmt " %a:%a%a" Mangled.pp var_data.name (Typ.pp_full Pp.text) var_data.typ + pp_var_attributes var_data.attributes + + +let pp_locals_list fmt etl = + if List.is_empty etl then Format.fprintf fmt "None" else List.iter ~f:(pp_local fmt) etl + + let pp_variable_list fmt etl = if List.is_empty etl then Format.fprintf fmt "None" else @@ -531,7 +549,7 @@ let pp_signature fmt pdesc = defined_string (Typ.to_string (get_ret_type pdesc)) pp_objc_accessor attributes.ProcAttributes.objc_accessor pp_variable_list (get_formals pdesc) - pp_variable_list (get_locals pdesc) ; + pp_locals_list (get_locals pdesc) ; if not (List.is_empty (get_captured pdesc)) then Format.fprintf fmt ", Captured: %a" pp_variable_list (get_captured pdesc) ; let method_annotation = attributes.ProcAttributes.method_annotation in @@ -549,12 +567,15 @@ let is_specialized pdesc = let is_captured_var procdesc pvar = let procname = get_proc_name procdesc in let pvar_name = Pvar.get_name pvar in + let pvar_local_matches (var_data: ProcAttributes.var_data) = + Mangled.equal var_data.name pvar_name + in let pvar_matches (name, _) = Mangled.equal name pvar_name in let is_captured_var_cpp_lambda = (* var is captured if the procedure is a lambda and the var is not in the locals or formals *) Typ.Procname.is_cpp_lambda procname && not - ( List.exists ~f:pvar_matches (get_locals procdesc) + ( List.exists ~f:pvar_local_matches (get_locals procdesc) || List.exists ~f:pvar_matches (get_formals procdesc) ) in let is_captured_var_objc_block = @@ -562,3 +583,14 @@ let is_captured_var procdesc pvar = Typ.Procname.is_objc_block procname && List.exists ~f:pvar_matches (get_captured procdesc) in is_captured_var_cpp_lambda || is_captured_var_objc_block + + +let has_modify_in_block_attr procdesc pvar = + let pvar_name = Pvar.get_name pvar in + let pvar_local_matches (var_data: ProcAttributes.var_data) = + Mangled.equal var_data.name pvar_name + && List.exists var_data.attributes ~f:(fun attr -> + ProcAttributes.var_attribute_equal attr ProcAttributes.Modify_in_block ) + in + List.exists ~f:pvar_local_matches (get_locals procdesc) + diff --git a/infer/src/IR/Procdesc.mli b/infer/src/IR/Procdesc.mli index 951bf3a6e..d10eed080 100644 --- a/infer/src/IR/Procdesc.mli +++ b/infer/src/IR/Procdesc.mli @@ -41,7 +41,7 @@ module Node : sig val throw_kind : nodekind (** kind of Stmt_node for a throw instruction. *) - val add_locals_ret_declaration : t -> ProcAttributes.t -> (Mangled.t * Typ.t) list -> unit + val add_locals_ret_declaration : t -> ProcAttributes.t -> ProcAttributes.var_data list -> unit (** Add declarations for local variables and return variable to the node *) val append_instrs : t -> Sil.instr list -> unit @@ -136,7 +136,7 @@ module NodeSet : Caml.Set.S with type elt = Node.t (** proc description *) type t [@@deriving compare] -val append_locals : t -> (Mangled.t * Typ.t) list -> unit +val append_locals : t -> ProcAttributes.var_data list -> unit (** append a list of new local variables to the existing list of local variables *) val compute_distance_to_exit_node : t -> unit @@ -183,8 +183,8 @@ val get_formals : t -> (Mangled.t * Typ.t) list val get_loc : t -> Location.t (** Return loc information for the procedure *) -val get_locals : t -> (Mangled.t * Typ.t) list -(** Return name and type of local variables *) +val get_locals : t -> ProcAttributes.var_data list +(** Return name and type and attributes of local variables *) val get_nodes : t -> Node.t list @@ -248,8 +248,12 @@ val is_loop_head : t -> Node.t -> bool val pp_signature : Format.formatter -> t -> unit +val pp_local : Format.formatter -> ProcAttributes.var_data -> unit + val is_specialized : t -> bool (* true if pvar is a captred variable of a cpp lambda or obcj block *) val is_captured_var : t -> Pvar.t -> bool + +val has_modify_in_block_attr : t -> Pvar.t -> bool diff --git a/infer/src/backend/PropUtil.ml b/infer/src/backend/PropUtil.ml index b32deceb2..af9fe6d19 100644 --- a/infer/src/backend/PropUtil.ml +++ b/infer/src/backend/PropUtil.ml @@ -8,7 +8,9 @@ *) open! IStd -let get_name_of_local (curr_f: Procdesc.t) (x, _) = Pvar.mk x (Procdesc.get_proc_name curr_f) +let get_name_of_local (curr_f: Procdesc.t) (var_data: ProcAttributes.var_data) = + Pvar.mk var_data.name (Procdesc.get_proc_name curr_f) + (* returns a list of local static variables (ie local variables defined static) in a proposition *) let get_name_of_objc_static_locals (curr_f: Procdesc.t) p = diff --git a/infer/src/backend/dotty.ml b/infer/src/backend/dotty.ml index ce018aad8..5da6d6710 100644 --- a/infer/src/backend/dotty.ml +++ b/infer/src/backend/dotty.ml @@ -1152,12 +1152,14 @@ let pp_etlist byvals fmt etl = etl -let pp_local_list fmt etl = +let pp_var_list fmt etl = List.iter ~f:(fun (id, ty) -> Format.fprintf fmt " %a:%a" Mangled.pp id (Typ.pp_full Pp.text) ty) etl +let pp_local_list fmt etl = List.iter ~f:(Procdesc.pp_local fmt) etl + let pp_cfgnodelabel pdesc fmt (n: Procdesc.Node.t) = let pp_label fmt n = match Procdesc.Node.get_kind n with @@ -1168,7 +1170,7 @@ let pp_cfgnodelabel pdesc fmt (n: Procdesc.Node.t) = Format.fprintf fmt "Start %s\\nFormals: %a\\nLocals: %a" pname_string (pp_etlist byvals) (Procdesc.get_formals pdesc) pp_local_list (Procdesc.get_locals pdesc) ; if List.length (Procdesc.get_captured pdesc) <> 0 then - Format.fprintf fmt "\\nCaptured: %a" pp_local_list (Procdesc.get_captured pdesc) ; + Format.fprintf fmt "\\nCaptured: %a" pp_var_list (Procdesc.get_captured pdesc) ; let method_annotation = attributes.ProcAttributes.method_annotation in if not (Annot.Method.is_empty method_annotation) then Format.fprintf fmt "\\nAnnotation: %a" (Annot.Method.pp pname_string) method_annotation diff --git a/infer/src/checkers/uninit.ml b/infer/src/checkers/uninit.ml index 78740f598..e352da93d 100644 --- a/infer/src/checkers/uninit.ml +++ b/infer/src/checkers/uninit.ml @@ -207,10 +207,10 @@ module Analyzer = let get_locals cfg tenv pdesc = List.fold - ~f:(fun acc (name, t) -> - let pvar = Pvar.mk name (Procdesc.get_proc_name pdesc) in - let base_ap = ((Var.of_pvar pvar, t), []) in - match t.Typ.desc with + ~f:(fun acc (var_data: ProcAttributes.var_data) -> + let pvar = Pvar.mk var_data.name (Procdesc.get_proc_name pdesc) in + let base_ap = ((Var.of_pvar pvar, var_data.typ), []) in + match var_data.typ.Typ.desc with | Typ.Tstruct qual_name -> ( match Tenv.lookup tenv qual_name with | Some {fields} -> diff --git a/infer/src/clang/cTrans.ml b/infer/src/clang/cTrans.ml index 871b49492..3836cdb2c 100644 --- a/infer/src/clang/cTrans.ml +++ b/infer/src/clang/cTrans.ml @@ -210,7 +210,8 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s let context = trans_state.context in let procdesc = context.CContext.procdesc in let pvar, typ = mk_temp_sil_var_for_expr context.CContext.tenv procdesc var_name expr_info in - Procdesc.append_locals procdesc [(Pvar.get_name pvar, typ)] ; + let var_data : ProcAttributes.var_data = {name= Pvar.get_name pvar; typ; attributes= []} in + Procdesc.append_locals procdesc [var_data] ; (Exp.Lvar pvar, typ) @@ -231,7 +232,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s | _ -> let procdesc = trans_state.context.CContext.procdesc in let pvar = mk_temp_sil_var procdesc "__temp_return_" in - Procdesc.append_locals procdesc [(Pvar.get_name pvar, return_type)] ; + let var_data : ProcAttributes.var_data = + {name= Pvar.get_name pvar; typ= return_type; attributes= []} + in + Procdesc.append_locals procdesc [var_data] ; Exp.Lvar pvar in (* It is very confusing - same expression has two different types in two contexts:*) @@ -1083,7 +1087,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s let procdesc = trans_state.context.CContext.procdesc in let pvar = Pvar.mk_tmp "__temp_construct_" (Procdesc.get_proc_name procdesc) in let class_type = CType_decl.get_type_from_expr_info ei context.CContext.tenv in - Procdesc.append_locals procdesc [(Pvar.get_name pvar, class_type)] ; + let var_data : ProcAttributes.var_data = + {name= Pvar.get_name pvar; typ= class_type; attributes= []} + in + Procdesc.append_locals procdesc [var_data] ; (Exp.Lvar pvar, class_type) in let this_type = CType.add_pointer_to_typ class_type in @@ -1461,7 +1468,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s let join_node = create_node Procdesc.Node.Join_node [] sil_loc context in Procdesc.node_set_succs_exn context.procdesc join_node succ_nodes [] ; let pvar = mk_temp_sil_var procdesc "SIL_temp_conditional___" in - Procdesc.append_locals procdesc [(Pvar.get_name pvar, var_typ)] ; + let var_data : ProcAttributes.var_data = + {name= Pvar.get_name pvar; typ= var_typ; attributes= []} + in + Procdesc.append_locals procdesc [var_data] ; let continuation' = mk_cond_continuation trans_state.continuation in let trans_state' = {trans_state with continuation= continuation'; succ_nodes= []} in let res_trans_cond = @@ -2781,7 +2791,8 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s let var_exp_typ = (Exp.Lvar pvar, typ_tmp) in let res_trans = init_expr_trans trans_state var_exp_typ stmt_info (Some temp_exp) in let _, typ = extract_exp_from_list res_trans.exps "MaterializeExpr initializer missing@\n" in - Procdesc.append_locals procdesc [(Pvar.get_name pvar, typ)] ; + let var_data : ProcAttributes.var_data = {name= Pvar.get_name pvar; typ; attributes= []} in + Procdesc.append_locals procdesc [var_data] ; res_trans diff --git a/infer/src/clang/cVar_decl.ml b/infer/src/clang/cVar_decl.ml index 034b2aeb4..f53885aab 100644 --- a/infer/src/clang/cVar_decl.ml +++ b/infer/src/clang/cVar_decl.ml @@ -59,12 +59,23 @@ let sil_var_of_decl_ref context decl_ref procname = decl_ref -let add_var_to_locals procdesc var_decl sil_typ pvar = +let get_var_attribute decl_info = + let open Clang_ast_t in + let has_block_attribute = + List.exists decl_info.Clang_ast_t.di_attributes ~f:(fun attr -> + match attr with BlocksAttr _ -> true | _ -> false ) + in + if has_block_attribute then [ProcAttributes.Modify_in_block] else [] + + +let add_var_to_locals procdesc var_decl typ pvar = let open Clang_ast_t in match var_decl with - | VarDecl (_, _, _, vdi) -> + | VarDecl (decl_info, _, _, vdi) -> if not vdi.Clang_ast_t.vdi_is_global then - Procdesc.append_locals procdesc [(Pvar.get_name pvar, sil_typ)] + let attributes = get_var_attribute decl_info in + let var_data : ProcAttributes.var_data = {name= Pvar.get_name pvar; typ; attributes} in + Procdesc.append_locals procdesc [var_data] | _ -> assert false diff --git a/infer/src/concurrency/RacerD.ml b/infer/src/concurrency/RacerD.ml index a554b4828..53eb11d16 100644 --- a/infer/src/concurrency/RacerD.ml +++ b/infer/src/concurrency/RacerD.ml @@ -925,9 +925,9 @@ let analyze_procedure {Callbacks.proc_desc; get_proc_desc; tenv; summary} = then ThreadsDomain.AnyThread else ThreadsDomain.NoThread in - let add_owned_local acc (name, typ) = - let pvar = Pvar.mk name (Procdesc.get_proc_name proc_desc) in - let base = AccessPath.base_of_pvar pvar typ in + let add_owned_local acc (var_data: ProcAttributes.var_data) = + let pvar = Pvar.mk var_data.name (Procdesc.get_proc_name proc_desc) in + let base = AccessPath.base_of_pvar pvar var_data.typ in OwnershipDomain.add (base, []) OwnershipAbstractValue.owned acc in (* Add ownership to local variables. In cpp, stack-allocated local diff --git a/infer/src/java/jTrans.ml b/infer/src/java/jTrans.ml index f5ce07f1c..56ee28e34 100644 --- a/infer/src/java/jTrans.ml +++ b/infer/src/java/jTrans.ml @@ -358,7 +358,11 @@ let create_cm_procdesc source_file program linereader icfg cm proc_name skip_imp let bytecode, jbir_code = get_implementation cm in let procdesc = let formals = translate_formals program tenv cn jbir_code in - let locals = translate_locals program tenv formals bytecode jbir_code in + let locals_ = translate_locals program tenv formals bytecode jbir_code in + let locals = + List.map locals_ ~f:(fun (name, typ) -> + ({name; typ; attributes= []} : ProcAttributes.var_data) ) + in let loc_start = let loc = get_location source_file jbir_code 0 in fix_method_definition_line linereader proc_name loc diff --git a/infer/tests/codetoanalyze/objc/shared/block/dispatch.m b/infer/tests/codetoanalyze/objc/shared/block/dispatch.m index d2b123074..0a7227dc1 100644 --- a/infer/tests/codetoanalyze/objc/shared/block/dispatch.m +++ b/infer/tests/codetoanalyze/objc/shared/block/dispatch.m @@ -33,6 +33,15 @@ return sharedInstance; } ++ (int)block_attribute { + static dispatch_once_t once; + __block DispatchA* a = [DispatchA new]; + dispatch_once(&once, ^{ + a->_x = 10; + }); + return a->_x; +} + + (instancetype)trans { static id sharedInstance; void (^dummy_block)() = ^{ diff --git a/infer/tests/codetoanalyze/objc/shared/block/dispatch.m.dot b/infer/tests/codetoanalyze/objc/shared/block/dispatch.m.dot index 37bb393ec..98b381cfd 100644 --- a/infer/tests/codetoanalyze/objc/shared/block/dispatch.m.dot +++ b/infer/tests/codetoanalyze/objc/shared/block/dispatch.m.dot @@ -26,120 +26,139 @@ digraph iCFG { "objc_blockDispatchA_sharedInstance_1.0b8803e75b6a82e1a4530bcb953490e2_3" -> "objc_blockDispatchA_sharedInstance_1.0b8803e75b6a82e1a4530bcb953490e2_2" ; -"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_1" [label="1: Start DispatchA_trans\nFormals: \nLocals: dummy_block:_fn_(*) \n DECLARE_LOCALS(&return,&dummy_block); [line 36, column 1]\n " color=yellow style=filled] +"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_1" [label="1: Start DispatchA_block_attribute\nFormals: \nLocals: a:DispatchA*(__block) \n DECLARE_LOCALS(&return,&a); [line 36, column 1]\n " color=yellow style=filled] + + + "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_1" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_5" ; +"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_2" [label="2: Exit DispatchA_block_attribute \n " color=yellow style=filled] + + +"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_3" [label="3: Return Stmt \n n$4=*&a:DispatchA* [line 42, column 10]\n n$5=*n$4._x:int [line 42, column 10]\n *&return:int=n$5 [line 42, column 3]\n " shape="box"] + + + "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_3" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_2" ; +"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_4" [label="4: Call _fun__dispatch_once \n n$6=*&a:DispatchA* [line 39, column 24]\n _fun__dispatch_once(&#GB$DispatchA_block_attribute_once:long*,(_fun_objc_blockDispatchA_block_attribute_2,n$6):_fn_(*)) block_params [line 39, column 3]\n " shape="box"] + + + "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_4" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_3" ; +"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_5" [label="5: DeclStmt \n n$8=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 38, column 26]\n n$9=_fun_NSObject_init(n$8:DispatchA*) virtual [line 38, column 26]\n *&a:DispatchA*=n$9 [line 38, column 3]\n " shape="box"] + + + "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_5" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_4" ; +"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_1" [label="1: Start DispatchA_trans\nFormals: \nLocals: dummy_block:_fn_(*) \n DECLARE_LOCALS(&return,&dummy_block); [line 45, column 1]\n " color=yellow style=filled] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_1" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" ; "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_2" [label="2: Exit DispatchA_trans \n " color=yellow style=filled] -"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" [label="3: Return Stmt \n n$4=*&#GB$DispatchA_trans_sharedInstance:objc_object* [line 42, column 10]\n *&return:objc_object*=n$4 [line 42, column 3]\n " shape="box"] +"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" [label="3: Return Stmt \n n$10=*&#GB$DispatchA_trans_sharedInstance:objc_object* [line 51, column 10]\n *&return:objc_object*=n$10 [line 51, column 3]\n " shape="box"] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_2" ; -"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" [label="4: Call n$5 \n n$5=*&dummy_block:_fn_(*) [line 41, column 3]\n n$5() [line 41, column 3]\n " shape="box"] +"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" [label="4: Call n$11 \n n$11=*&dummy_block:_fn_(*) [line 50, column 3]\n n$11() [line 50, column 3]\n " shape="box"] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" ; -"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" [label="5: DeclStmt \n *&dummy_block:_fn_(*)=(_fun_objc_blockDispatchA_trans_2) [line 38, column 3]\n " shape="box"] +"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" [label="5: DeclStmt \n *&dummy_block:_fn_(*)=(_fun_objc_blockDispatchA_trans_3) [line 47, column 3]\n " shape="box"] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" ; -"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_1" [label="1: Start objc_blockDispatchA_trans_2\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 38, column 27]\n " color=yellow style=filled] +"objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_1" [label="1: Start objc_blockDispatchA_trans_3\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 47, column 27]\n " color=yellow style=filled] - "objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_1" -> "objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_3" ; -"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_2" [label="2: Exit objc_blockDispatchA_trans_2 \n " color=yellow style=filled] + "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_1" -> "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_3" ; +"objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_2" [label="2: Exit objc_blockDispatchA_trans_3 \n " color=yellow style=filled] -"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_3" [label="3: BinaryOperatorStmt: Assign \n n$6=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 39, column 23]\n n$7=_fun_DispatchA_init(n$6:DispatchA*) virtual [line 39, column 22]\n *&#GB$DispatchA_trans_sharedInstance:objc_object*=n$7 [line 39, column 5]\n " shape="box"] +"objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_3" [label="3: BinaryOperatorStmt: Assign \n n$12=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 48, column 23]\n n$13=_fun_DispatchA_init(n$12:DispatchA*) virtual [line 48, column 22]\n *&#GB$DispatchA_trans_sharedInstance:objc_object*=n$13 [line 48, column 5]\n " shape="box"] - "objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_3" -> "objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_2" ; -"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_1" [label="1: Start DispatchA_dispatch_a_block_variable\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 45, column 1]\n " color=yellow style=filled] + "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_3" -> "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_2" ; +"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_1" [label="1: Start DispatchA_dispatch_a_block_variable\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 54, column 1]\n " color=yellow style=filled] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_1" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" ; "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_2" [label="2: Exit DispatchA_dispatch_a_block_variable \n " color=yellow style=filled] -"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" [label="3: Return Stmt \n n$8=*&#GB$DispatchA_dispatch_a_block_variable_static_storage__:objc_object* [line 52, column 10]\n *&return:objc_object*=n$8 [line 52, column 3]\n " shape="box"] +"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" [label="3: Return Stmt \n n$14=*&#GB$DispatchA_dispatch_a_block_variable_static_storage__:objc_object* [line 61, column 10]\n *&return:objc_object*=n$14 [line 61, column 3]\n " shape="box"] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_2" ; -"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" [label="4: Call _fun__dispatch_once \n n$9=*&initialization_block__:_fn_(*) [line 51, column 32]\n _fun__dispatch_once(&#GB$DispatchA_dispatch_a_block_variable_once_token__:long*,n$9:_fn_(*)) [line 51, column 3]\n " shape="box"] +"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" [label="4: Call _fun__dispatch_once \n n$15=*&initialization_block__:_fn_(*) [line 60, column 32]\n _fun__dispatch_once(&#GB$DispatchA_dispatch_a_block_variable_once_token__:long*,n$15:_fn_(*)) [line 60, column 3]\n " shape="box"] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" ; -"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_3) [line 47, column 3]\n " shape="box"] +"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_4) [line 56, column 3]\n " shape="box"] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" ; -"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_3\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 47, column 38]\n " color=yellow style=filled] +"objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_4\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 56, column 38]\n " color=yellow style=filled] - "objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_1" -> "objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_3" ; -"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_3 \n " color=yellow style=filled] + "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_1" -> "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_3" ; +"objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_4 \n " color=yellow style=filled] -"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_3" [label="3: BinaryOperatorStmt: Assign \n n$10=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 48, column 25]\n n$11=_fun_DispatchA_init(n$10:DispatchA*) virtual [line 48, column 25]\n *&#GB$DispatchA_dispatch_a_block_variable_static_storage__:objc_object*=n$11 [line 48, column 5]\n " shape="box"] +"objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_3" [label="3: BinaryOperatorStmt: Assign \n n$16=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 57, column 25]\n n$17=_fun_DispatchA_init(n$16:DispatchA*) virtual [line 57, column 25]\n *&#GB$DispatchA_dispatch_a_block_variable_static_storage__:objc_object*=n$17 [line 57, column 5]\n " shape="box"] - "objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_3" -> "objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_2" ; -"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 55, column 1]\n " color=yellow style=filled] + "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_3" -> "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_2" ; +"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 64, column 1]\n " color=yellow style=filled] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_1" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" ; "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_2" [label="2: Exit DispatchA_dispatch_a_block_variable_from_macro \n " color=yellow style=filled] -"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" [label="3: Fallback node \n n$12=*&#GB$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object* [line 63, column 5]\n " shape="box"] +"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" [label="3: Fallback node \n n$18=*&#GB$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object* [line 72, column 5]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" ; -"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" [label="4: Call _fun__dispatch_once \n n$13=*&initialization_block__:_fn_(*) [line 62, column 34]\n _fun__dispatch_once(&#GB$DispatchA_dispatch_a_block_variable_from_macro_once_token__:long*,n$13:_fn_(*)) [line 62, column 5]\n " shape="box"] +"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" [label="4: Call _fun__dispatch_once \n n$19=*&initialization_block__:_fn_(*) [line 71, column 34]\n _fun__dispatch_once(&#GB$DispatchA_dispatch_a_block_variable_from_macro_once_token__:long*,n$19:_fn_(*)) [line 71, column 5]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" ; -"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_from_macro_4) [line 58, column 5]\n " shape="box"] +"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_from_macro_5) [line 67, column 5]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" ; -"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" [label="6: Return Stmt \n *&return:objc_object*=n$12 [line 56, column 3]\n " shape="box"] +"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" [label="6: Return Stmt \n *&return:objc_object*=n$18 [line 65, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_2" ; -"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_from_macro_4\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 58, column 40]\n " color=yellow style=filled] +"objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_from_macro_5\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 67, column 40]\n " color=yellow style=filled] - "objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_1" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_3" ; -"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_from_macro_4 \n " color=yellow style=filled] + "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_1" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_3" ; +"objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_from_macro_5 \n " color=yellow style=filled] -"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_3" [label="3: BinaryOperatorStmt: Assign \n n$14=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 59, column 27]\n n$15=_fun_DispatchA_init(n$14:DispatchA*) virtual [line 59, column 27]\n *&#GB$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object*=n$15 [line 59, column 7]\n " shape="box"] +"objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_3" [label="3: BinaryOperatorStmt: Assign \n n$20=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 68, column 27]\n n$21=_fun_DispatchA_init(n$20:DispatchA*) virtual [line 68, column 27]\n *&#GB$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object*=n$21 [line 68, column 7]\n " shape="box"] - "objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_3" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_2" ; -"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro_delivers_initialised_object\nFormals: \nLocals: a:DispatchA* \n DECLARE_LOCALS(&return,&a); [line 67, column 1]\n " color=yellow style=filled] + "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_3" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_2" ; +"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro_delivers_initialised_object\nFormals: \nLocals: a:DispatchA* \n DECLARE_LOCALS(&return,&a); [line 76, column 1]\n " color=yellow style=filled] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_1" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" ; "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_2" [label="2: Exit DispatchA_dispatch_a_block_variable_from_macro_delivers_initialised_object \n " color=yellow style=filled] -"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" [label="3: Return Stmt \n n$16=*&a:DispatchA* [line 70, column 15]\n n$17=*n$16._x:int [line 70, column 15]\n *&return:int=(1 / (n$17 - 5)) [line 70, column 3]\n " shape="box"] +"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" [label="3: Return Stmt \n n$22=*&a:DispatchA* [line 79, column 15]\n n$23=*n$22._x:int [line 79, column 15]\n *&return:int=(1 / (n$23 - 5)) [line 79, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_2" ; -"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" [label="4: BinaryOperatorStmt: Assign \n n$18=*&a:DispatchA* [line 69, column 3]\n *n$18._x:int=5 [line 69, column 3]\n " shape="box"] +"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" [label="4: BinaryOperatorStmt: Assign \n n$24=*&a:DispatchA* [line 78, column 3]\n *n$24._x:int=5 [line 78, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" ; -"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" [label="5: DeclStmt \n n$19=_fun_DispatchA_dispatch_a_block_variable_from_macro() [line 68, column 18]\n *&a:DispatchA*=n$19 [line 68, column 3]\n " shape="box"] +"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" [label="5: DeclStmt \n n$25=_fun_DispatchA_dispatch_a_block_variable_from_macro() [line 77, column 18]\n *&a:DispatchA*=n$25 [line 77, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_1" [label="1: Start DispatchMain\nFormals: \nLocals: p:int* b:DispatchA* \n DECLARE_LOCALS(&return,&p,&b); [line 75, column 1]\n " color=yellow style=filled] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_1" [label="1: Start DispatchMain\nFormals: \nLocals: p:int* b:DispatchA* \n DECLARE_LOCALS(&return,&p,&b); [line 84, column 1]\n " color=yellow style=filled] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_1" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" ; @@ -154,32 +173,32 @@ digraph iCFG { "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_4" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" [label="5: BinaryOperatorStmt: EQ \n n$0=*&b:DispatchA* [line 78, column 7]\n " shape="box"] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" [label="5: BinaryOperatorStmt: EQ \n n$0=*&b:DispatchA* [line 87, column 7]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" [label="6: Prune (true branch) \n PRUNE((n$0 == null), true); [line 78, column 7]\n " shape="invhouse"] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" [label="6: Prune (true branch) \n PRUNE((n$0 == null), true); [line 87, column 7]\n " shape="invhouse"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" [label="7: Prune (false branch) \n PRUNE(!(n$0 == null), false); [line 78, column 7]\n " shape="invhouse"] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" [label="7: Prune (false branch) \n PRUNE(!(n$0 == null), false); [line 87, column 7]\n " shape="invhouse"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" [label="8: Return Stmt \n n$1=*&p:int* [line 79, column 13]\n n$2=*n$1:int [line 79, column 12]\n *&return:int=n$2 [line 79, column 5]\n " shape="box"] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" [label="8: Return Stmt \n n$1=*&p:int* [line 88, column 13]\n n$2=*n$1:int [line 88, column 12]\n *&return:int=n$2 [line 88, column 5]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" [label="9: Return Stmt \n *&return:int=0 [line 81, column 5]\n " shape="box"] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" [label="9: Return Stmt \n *&return:int=0 [line 90, column 5]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" [label="10: DeclStmt \n *&p:int*=null [line 77, column 3]\n " shape="box"] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" [label="10: DeclStmt \n *&p:int*=null [line 86, column 3]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" ; -"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" [label="11: DeclStmt \n n$3=_fun_DispatchA_sharedInstance() [line 76, column 18]\n *&b:DispatchA*=n$3 [line 76, column 3]\n " shape="box"] +"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" [label="11: DeclStmt \n n$3=_fun_DispatchA_sharedInstance() [line 85, column 18]\n *&b:DispatchA*=n$3 [line 85, column 3]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" ; @@ -194,4 +213,15 @@ digraph iCFG { "init#DispatchA#instance.ff6c7b9a5a49bb46493519a4290a6582_3" -> "init#DispatchA#instance.ff6c7b9a5a49bb46493519a4290a6582_2" ; +"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_1" [label="1: Start objc_blockDispatchA_block_attribute_2\nFormals: a:DispatchA*\nLocals: \nCaptured: a:DispatchA* \n DECLARE_LOCALS(&return); [line 39, column 24]\n " color=yellow style=filled] + + + "objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_1" -> "objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_3" ; +"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_2" [label="2: Exit objc_blockDispatchA_block_attribute_2 \n " color=yellow style=filled] + + +"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_3" [label="3: BinaryOperatorStmt: Assign \n n$7=*&a:DispatchA* [line 40, column 5]\n *n$7._x:int=10 [line 40, column 5]\n " shape="box"] + + + "objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_3" -> "objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_2" ; }