Adding builtins for getters and calling them by skip

Summary: public
We were generating getters and setters in the frontend, and then removing them if they were not needed
in the preanalysis. This diff adds a builtin getter that gets called if we are going to skip the function. That
means, if there was a getter written by the developers we still use that one rather than the builtin.
Code for setter and cleanup of preanalysis will come in a next diff.

Reviewed By: jvillard

Differential Revision: D2702890

fb-gh-sync-id: d65f25e
master
Dulma Rodriguez 9 years ago committed by facebook-github-bot-5
parent 1349492e57
commit 12d21c73dd

@ -13,6 +13,11 @@ module L = Logging
module F = Format module F = Format
open Utils open Utils
(** Type for ObjC accessors *)
type objc_accessor_type =
| Objc_getter of Ident.fieldname
| Objc_setter of Ident.fieldname
type t = type t =
{ {
access : Sil.access; (** visibility access *) access : Sil.access; (** visibility access *)
@ -27,6 +32,7 @@ type t =
is_generated : bool; (** the procedure has been generated *) is_generated : bool; (** the procedure has been generated *)
is_objc_instance_method : bool; (** the procedure is an objective-C instance method *) is_objc_instance_method : bool; (** the procedure is an objective-C instance method *)
is_cpp_instance_method : bool; (** the procedure is an C++ instance method *) is_cpp_instance_method : bool; (** the procedure is an C++ instance method *)
objc_accessor : objc_accessor_type option; (** the proc is ObjC accessor *)
mutable is_synthetic_method : bool; (** the procedure is a synthetic method *) mutable is_synthetic_method : bool; (** the procedure is a synthetic method *)
language : Config.language; (** language of the procedure *) language : Config.language; (** language of the procedure *)
loc : Location.t; (** location of this procedure in the source code *) loc : Location.t; (** location of this procedure in the source code *)
@ -51,6 +57,7 @@ let copy pa =
is_generated = pa.is_generated; is_generated = pa.is_generated;
is_objc_instance_method = pa.is_objc_instance_method; is_objc_instance_method = pa.is_objc_instance_method;
is_cpp_instance_method = pa.is_cpp_instance_method; is_cpp_instance_method = pa.is_cpp_instance_method;
objc_accessor = pa.objc_accessor;
is_synthetic_method = pa.is_synthetic_method; is_synthetic_method = pa.is_synthetic_method;
language = pa.language; language = pa.language;
loc = pa.loc; loc = pa.loc;
@ -74,6 +81,7 @@ let default proc_name language = {
is_generated = false; is_generated = false;
is_objc_instance_method = false; is_objc_instance_method = false;
is_cpp_instance_method = false; is_cpp_instance_method = false;
objc_accessor = None;
is_synthetic_method = false; is_synthetic_method = false;
language; language;
loc = Location.dummy; loc = Location.dummy;

@ -11,6 +11,10 @@
open Utils open Utils
type objc_accessor_type =
| Objc_getter of Ident.fieldname
| Objc_setter of Ident.fieldname
type t = type t =
{ {
access : Sil.access; (** visibility access *) access : Sil.access; (** visibility access *)
@ -25,6 +29,7 @@ type t =
is_generated : bool; (** the procedure has been generated *) is_generated : bool; (** the procedure has been generated *)
is_objc_instance_method : bool; (** the procedure is an objective-C instance method *) is_objc_instance_method : bool; (** the procedure is an objective-C instance method *)
is_cpp_instance_method : bool; (** the procedure is an C++ instance method *) is_cpp_instance_method : bool; (** the procedure is an C++ instance method *)
objc_accessor : objc_accessor_type option; (** the proc is ObjC accessor *)
mutable is_synthetic_method : bool; (** the procedure is a synthetic method *) mutable is_synthetic_method : bool; (** the procedure is a synthetic method *)
language : Config.language; (** language of the procedure *) language : Config.language; (** language of the procedure *)
loc : Location.t; (** location of this procedure in the source code *) loc : Location.t; (** location of this procedure in the source code *)

@ -773,7 +773,11 @@ let handle_special_cases_call tenv cfg pname actual_params =
(redirect_shared_ptr tenv cfg pname actual_params), actual_params (redirect_shared_ptr tenv cfg pname actual_params), actual_params
else pname, actual_params else pname, actual_params
let handle_objc_method_call actual_pars actual_params pre tenv cfg ret_ids pdesc callee_pname loc path = (* This method handles ObjC method calls, in particular the fact that calling a method with nil *)
(* returns nil. The exec_call function is either standard call execution or execution of ObjC *)
(* getters and setters using a builtin. *)
let handle_objc_method_call actual_pars actual_params pre tenv cfg ret_ids pdesc callee_pname loc
path exec_call =
let path_description = "Message "^(Procname.to_simplified_string callee_pname)^" with receiver nil returns nil." in let path_description = "Message "^(Procname.to_simplified_string callee_pname)^" with receiver nil returns nil." in
let receiver = (match actual_pars with let receiver = (match actual_pars with
| (e, _):: _ -> e | (e, _):: _ -> e
@ -798,7 +802,7 @@ let handle_objc_method_call actual_pars actual_params pre tenv cfg ret_ids pdesc
(* can keep track of how this object became null, so that in a NPE we can separate it into a different error type *) (* can keep track of how this object became null, so that in a NPE we can separate it into a different error type *)
[(add_objc_null_attribute_or_nullify_result pre, path)] [(add_objc_null_attribute_or_nullify_result pre, path)]
else else
let res = Tabulation.exe_function_call tenv cfg ret_ids pdesc callee_pname loc actual_params pre path in let res = exec_call tenv cfg ret_ids pdesc callee_pname loc actual_params pre path in
let is_undef = let is_undef =
Option.is_some (Prop.get_undef_attribute pre receiver) in Option.is_some (Prop.get_undef_attribute pre receiver) in
if !Config.footprint && not is_undef then if !Config.footprint && not is_undef then
@ -960,10 +964,8 @@ let rec sym_exec cfg tenv pdesc _instr (_prop: Prop.normal Prop.t) path
if !Config.ondemand_enabled then if !Config.ondemand_enabled then
Ondemand.do_analysis pdesc callee_pname; Ondemand.do_analysis pdesc callee_pname;
let ret_typ_opt = let callee_pdesc_opt = Cfg.Procdesc.find_from_name cfg resolved_pname in
match Cfg.Procdesc.find_from_name cfg resolved_pname with let ret_typ_opt = Option.map Cfg.Procdesc.get_ret_type callee_pdesc_opt in
| None -> None
| Some pd -> Some (Cfg.Procdesc.get_ret_type pd) in
let skip_call prop path = let skip_call prop path =
let exn = Exceptions.Skip_function (Localise.desc_skip_function callee_pname) in let exn = Exceptions.Skip_function (Localise.desc_skip_function callee_pname) in
Reporting.log_info pname exn; Reporting.log_info pname exn;
@ -985,13 +987,26 @@ let rec sym_exec cfg tenv pdesc _instr (_prop: Prop.normal Prop.t) path
cfg pdesc tenv prop_r path actual_params callee_pname loc cfg pdesc tenv prop_r path actual_params callee_pname loc
else [(prop_r, path)] in else [(prop_r, path)] in
let do_call (prop, path) = let do_call (prop, path) =
match Specs.get_summary resolved_pname with let attrs_opt = Option.map Cfg.Procdesc.get_attributes callee_pdesc_opt in
let objc_property_accessor =
match attrs_opt with
| Some attrs -> attrs.ProcAttributes.objc_accessor
| None -> None in
let summary = Specs.get_summary resolved_pname in
let should_skip resolved_pname summary =
match summary with
| None -> true
| Some summary -> call_should_be_skipped resolved_pname summary in
if should_skip resolved_pname summary then
(* If it's an ObjC getter or setter, call the builtin rather than skipping *)
match objc_property_accessor with
| Some objc_property_accessor ->
handle_objc_method_call
n_actual_params n_actual_params prop tenv cfg ret_ids pdesc callee_pname loc path
(sym_exec_objc_accessor objc_property_accessor ret_typ_opt)
| None -> skip_call prop path | None -> skip_call prop path
| Some summary when call_should_be_skipped resolved_pname summary -> else
skip_call prop path sym_exec_call cfg pdesc tenv prop path ret_ids n_actual_params (Option.get summary) loc in
| Some summary ->
sym_exec_call
cfg pdesc tenv prop path ret_ids n_actual_params summary loc in
IList.flatten (IList.map do_call sentinel_result) IList.flatten (IList.map do_call sentinel_result)
| Sil.Call (ret_ids, fun_exp, actual_params, loc, call_flags) -> (** Call via function pointer *) | Sil.Call (ret_ids, fun_exp, actual_params, loc, call_flags) -> (** Call via function pointer *)
let (prop_r, n_actual_params) = normalize_params pname _prop actual_params in let (prop_r, n_actual_params) = normalize_params pname _prop actual_params in
@ -1288,6 +1303,35 @@ and sym_exe_check_variadic_sentinel_if_present
cfg pdesc tenv prop path (IList.length formals) cfg pdesc tenv prop path (IList.length formals)
actual_params sentinel_arg callee_pname loc actual_params sentinel_arg callee_pname loc
and sym_exec_objc_getter field_name ret_typ_opt tenv cfg ret_ids pdesc callee_name loc args _prop
path : Builtin.ret_typ =
let ret_id =
match ret_ids with
| [ret_id] -> ret_id
| _ -> assert false in
let ret_typ =
match ret_typ_opt with
| Some ret_typ -> ret_typ
| None -> assert false in
match args with
| [(lexp, typ)] ->
let typ' = (match Sil.expand_type tenv typ with
| Sil.Tstruct _ as s -> s
| Sil.Tptr (t, _) -> Sil.expand_type tenv t
| _ -> assert false) in
let field_access_exp = Sil.Lfield (lexp, field_name, typ') in
let ret_instr = Sil.Letderef (ret_id, field_access_exp, ret_typ, loc) in
sym_exec_generated true cfg tenv pdesc [ret_instr] [(_prop, path)]
| _ -> raise (Exceptions.Wrong_argument_number (try assert false with Assert_failure x -> x))
and sym_exec_objc_accessor property_accesor ret_typ_opt tenv cfg ret_ids pdesc callee_name loc args
_prop path : Builtin.ret_typ =
match property_accesor with
| ProcAttributes.Objc_getter field_name ->
sym_exec_objc_getter field_name ret_typ_opt tenv cfg ret_ids pdesc callee_name loc args _prop
path
| ProcAttributes.Objc_setter field_name ->
assert false (* TODO*)
(** Perform symbolic execution for a function call *) (** Perform symbolic execution for a function call *)
and sym_exec_call cfg pdesc tenv pre path ret_ids actual_pars summary loc = and sym_exec_call cfg pdesc tenv pre path ret_ids actual_pars summary loc =
@ -1344,8 +1388,8 @@ and sym_exec_call cfg pdesc tenv pre path ret_ids actual_pars summary loc =
(* were the receiver is null and the semantics of the call is nop*) (* were the receiver is null and the semantics of the call is nop*)
if (!Config.curr_language <> Config.Java) && !Config.objc_method_call_semantics && if (!Config.curr_language <> Config.Java) && !Config.objc_method_call_semantics &&
(Specs.get_attributes summary).ProcAttributes.is_objc_instance_method then (Specs.get_attributes summary).ProcAttributes.is_objc_instance_method then
handle_objc_method_call handle_objc_method_call actual_pars actual_params pre tenv cfg ret_ids pdesc callee_pname loc
actual_pars actual_params pre tenv cfg ret_ids pdesc callee_pname loc path path Tabulation.exe_function_call
else (* non-objective-c method call. Standard tabulation *) else (* non-objective-c method call. Standard tabulation *)
Tabulation.exe_function_call Tabulation.exe_function_call
tenv cfg ret_ids pdesc callee_pname loc actual_params pre path tenv cfg ret_ids pdesc callee_pname loc actual_params pre path

@ -103,8 +103,8 @@ struct
let pname = Ast_utils.property_name property_impl_decl_info in let pname = Ast_utils.property_name property_impl_decl_info in
Printing.log_out "ADDING: ObjCPropertyImplDecl for property '%s' " Printing.log_out "ADDING: ObjCPropertyImplDecl for property '%s' "
pname.Clang_ast_t.ni_name; pname.Clang_ast_t.ni_name;
let getter_setter = ObjcProperty_decl.make_getter_setter curr_class decl_info pname in let setter = ObjcProperty_decl.make_setter' curr_class decl_info pname in
IList.iter (process_one_method_decl tenv cg cfg curr_class) getter_setter IList.iter (process_one_method_decl tenv cg cfg curr_class) setter
| EmptyDecl _ | ObjCIvarDecl _ | ObjCPropertyDecl _ -> () | EmptyDecl _ | ObjCIvarDecl _ | ObjCPropertyDecl _ -> ()
| _ -> | _ ->
Printing.log_stats Printing.log_stats
@ -135,8 +135,7 @@ struct
ivar_name tp (Some atts) in ivar_name tp (Some atts) in
ignore (CField_decl.add_missing_fields tenv class_name [field]); ignore (CField_decl.add_missing_fields tenv class_name [field]);
let accessor_opt = let accessor_opt =
if is_getter then if is_getter then []
ObjcProperty_decl.make_getter cls property_name property_type
else ObjcProperty_decl.make_setter cls property_name property_type in else ObjcProperty_decl.make_setter cls property_name property_type in
match accessor_opt with match accessor_opt with
| [accessor] -> | [accessor] ->

@ -19,7 +19,8 @@ type method_signature = {
_is_instance : bool; _is_instance : bool;
_is_generated : bool; _is_generated : bool;
_language : CFrontend_config.lang; _language : CFrontend_config.lang;
_pointer_to_parent : Clang_ast_t.pointer option _pointer_to_parent : Clang_ast_t.pointer option;
mutable _objc_accessor : ProcAttributes.objc_accessor_type option;
} }
let ms_get_name ms = let ms_get_name ms =
@ -52,6 +53,12 @@ let ms_get_lang ms =
let ms_get_pointer_to_parent ms = let ms_get_pointer_to_parent ms =
ms._pointer_to_parent ms._pointer_to_parent
let ms_objc_accessor ms =
ms._objc_accessor
let ms_set_objc_accessor ms objc_accessor =
ms._objc_accessor <- objc_accessor
let make_ms procname args ret_type attributes loc is_instance is_generated lang pointer_to_parent = let make_ms procname args ret_type attributes loc is_instance is_generated lang pointer_to_parent =
let meth_signature = { let meth_signature = {
_name = procname; _name = procname;
@ -63,6 +70,7 @@ let make_ms procname args ret_type attributes loc is_instance is_generated lang
_is_generated = is_generated; _is_generated = is_generated;
_language = lang; _language = lang;
_pointer_to_parent = pointer_to_parent; _pointer_to_parent = pointer_to_parent;
_objc_accessor = None
} in } in
meth_signature meth_signature

@ -40,3 +40,7 @@ val replace_name_ms : method_signature -> Procname.t -> method_signature
val ms_to_string : method_signature -> string val ms_to_string : method_signature -> string
val ms_is_generated : method_signature -> bool val ms_is_generated : method_signature -> bool
val ms_objc_accessor : method_signature -> ProcAttributes.objc_accessor_type option
val ms_set_objc_accessor : method_signature -> ProcAttributes.objc_accessor_type option -> unit

@ -308,6 +308,7 @@ let create_local_procdesc cfg tenv ms fbody captured is_objc_inst_method =
let proc_attributes = let proc_attributes =
{ (ProcAttributes.default proc_name Config.C_CPP) with { (ProcAttributes.default proc_name Config.C_CPP) with
ProcAttributes.captured = captured'; ProcAttributes.captured = captured';
ProcAttributes.objc_accessor = CMethod_signature.ms_objc_accessor ms;
formals; formals;
func_attributes = attributes; func_attributes = attributes;
is_defined = defined; is_defined = defined;

@ -35,7 +35,7 @@ struct
(* 1. method is a predefined model *) (* 1. method is a predefined model *)
(* 2. method is found by clang's resolution*) (* 2. method is found by clang's resolution*)
(* 3. Method is found by our resolution *) (* 3. Method is found by our resolution *)
let get_callee_objc_method context obj_c_message_expr_info act_params = let get_callee_objc_method context obj_c_message_expr_info act_params property_accessor_opt =
let open CContext in let open CContext in
let (selector, method_pointer_opt, mc_type) = let (selector, method_pointer_opt, mc_type) =
CMethod_trans.get_objc_method_data obj_c_message_expr_info in CMethod_trans.get_objc_method_data obj_c_message_expr_info in
@ -62,8 +62,12 @@ struct
CMethod_signature.ms_get_name ms, CMethod_trans.MCNoVirtual CMethod_signature.ms_get_name ms, CMethod_trans.MCNoVirtual
| None, Some ms -> | None, Some ms ->
if not (M.process_getter_setter context procname) then if not (M.process_getter_setter context procname) then
(ignore (CMethod_trans.create_local_procdesc context.cfg context.tenv (CMethod_signature.ms_set_objc_accessor ms property_accessor_opt;
ignore (CMethod_trans.create_local_procdesc context.cfg context.tenv
ms [] [] is_instance)); ms [] [] is_instance));
if Option.is_some property_accessor_opt then
procname, CMethod_trans.MCNoVirtual
else
procname, mc_type procname, mc_type
| _ -> | _ ->
CMethod_trans.create_external_procdesc context.cfg procname is_instance None; CMethod_trans.create_external_procdesc context.cfg procname is_instance None;
@ -807,6 +811,7 @@ struct
else Some (CTrans_utils.trans_assume_false sil_loc context trans_state.succ_nodes) else Some (CTrans_utils.trans_assume_false sil_loc context trans_state.succ_nodes)
else None else None
(* If the first argument of the call is self in a static context, remove it as an argument *) (* If the first argument of the call is self in a static context, remove it as an argument *)
(* and change the call from instance to static *) (* and change the call from instance to static *)
and objCMessageExpr_deal_with_static_self trans_state_param stmt_list obj_c_message_expr_info = and objCMessageExpr_deal_with_static_self trans_state_param stmt_list obj_c_message_expr_info =
@ -828,7 +833,8 @@ struct
obj_c_message_expr_info, fst_res_trans :: l obj_c_message_expr_info, fst_res_trans :: l
| [] -> obj_c_message_expr_info, [empty_res_trans] | [] -> obj_c_message_expr_info, [empty_res_trans]
and objCMessageExpr_trans trans_state si obj_c_message_expr_info stmt_list expr_info = and objCMessageExpr_trans trans_state si obj_c_message_expr_info stmt_list expr_info
property_accessor_opt =
Printing.log_out " priority node free = '%s'\n@." Printing.log_out " priority node free = '%s'\n@."
(string_of_bool (PriorityNode.is_priority_free trans_state)); (string_of_bool (PriorityNode.is_priority_free trans_state));
let context = trans_state.context in let context = trans_state.context in
@ -836,7 +842,6 @@ struct
let line_number = CLocation.get_line si parent_line_number in let line_number = CLocation.get_line si parent_line_number in
let sil_loc = CLocation.get_sil_location si parent_line_number context in let sil_loc = CLocation.get_sil_location si parent_line_number context in
let method_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in let method_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in
let trans_state_param = let trans_state_param =
{ trans_state_pri with parent_line_number = line_number; succ_nodes = [] } in { trans_state_pri with parent_line_number = line_number; succ_nodes = [] } in
@ -848,8 +853,8 @@ struct
| Some res -> res | Some res -> res
| None -> | None ->
let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in
let callee_name, method_call_type = let callee_name, method_call_type = get_callee_objc_method context obj_c_message_expr_info
get_callee_objc_method context obj_c_message_expr_info subexpr_exprs in subexpr_exprs property_accessor_opt in
let res_trans_add_self = Self.add_self_parameter_for_super_instance context procname sil_loc let res_trans_add_self = Self.add_self_parameter_for_super_instance context procname sil_loc
obj_c_message_expr_info in obj_c_message_expr_info in
let res_trans_subexpr_list = res_trans_add_self :: res_trans_subexpr_list in let res_trans_subexpr_list = res_trans_add_self :: res_trans_subexpr_list in
@ -1659,6 +1664,7 @@ struct
(* the stmt_list will be [x.f = a; x; a; CallToSetter] Among all element of the list we only need*) (* the stmt_list will be [x.f = a; x; a; CallToSetter] Among all element of the list we only need*)
(* to translate the CallToSetter which is how x.f = a is actually implemented by the runtime.*) (* to translate the CallToSetter which is how x.f = a is actually implemented by the runtime.*)
and pseudoObjectExpr_trans trans_state stmt_info stmt_list = and pseudoObjectExpr_trans trans_state stmt_info stmt_list =
let open Clang_ast_t in
let line_number = CLocation.get_line stmt_info trans_state.parent_line_number in let line_number = CLocation.get_line stmt_info trans_state.parent_line_number in
let trans_state' = { trans_state with parent_line_number = line_number } in let trans_state' = { trans_state with parent_line_number = line_number } in
Printing.log_out " priority node free = '%s'\n@." Printing.log_out " priority node free = '%s'\n@."
@ -1670,6 +1676,20 @@ struct
| stmt :: _ -> instruction trans_state' stmt | stmt :: _ -> instruction trans_state' stmt
| _ -> assert false in | _ -> assert false in
match stmt_list with match stmt_list with
| [ObjCPropertyRefExpr (_, _, _, oprei); _;
ObjCMessageExpr (si, stmts, info, ocmei)] ->
let property_accessor_opt =
match oprei.Clang_ast_t.oprei_kind with
| `PropertyRef decl_ref ->
(let create_field_name property_name =
General_utils.mk_class_field_name (Ast_utils.generated_ivar_name property_name) in
let field_name_opt = Option.map create_field_name decl_ref.Clang_ast_t.dr_name in
match field_name_opt with
| Some field_name when oprei.Clang_ast_t.oprei_is_messaging_getter ->
Some (ProcAttributes.Objc_getter field_name)
| _ -> None)
| _ -> None in
objCMessageExpr_trans trans_state si ocmei stmts info property_accessor_opt
| syntactic_form :: semantic_form -> | syntactic_form :: semantic_form ->
do_semantic_elements semantic_form do_semantic_elements semantic_form
| _ -> assert false | _ -> assert false
@ -1984,6 +2004,7 @@ struct
block_enumeration_trans trans_state stmt_info stmt_list expr_info block_enumeration_trans trans_state stmt_info stmt_list expr_info
else 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
None
| CompoundStmt (stmt_info, stmt_list) -> | CompoundStmt (stmt_info, stmt_list) ->
(* No node for this statement. We just collect its statement list*) (* No node for this statement. We just collect its statement list*)
@ -2197,7 +2218,13 @@ struct
exec_trans_instrs trans_state (get_clang_stmt_trans stmt_list) exec_trans_instrs trans_state (get_clang_stmt_trans stmt_list)
and expression_trans context stmt warning = and expression_trans context stmt warning =
let trans_state = { context = context; succ_nodes =[]; continuation = None; parent_line_number = -1; priority = Free } in let trans_state = {
context = context;
succ_nodes = [];
continuation = None;
parent_line_number = -1;
priority = Free;
} in
let res_trans_stmt = instruction trans_state stmt in let res_trans_stmt = instruction trans_state stmt in
fst (CTrans_utils.extract_exp_from_list res_trans_stmt.exps warning) fst (CTrans_utils.extract_exp_from_list res_trans_stmt.exps warning)

@ -284,27 +284,6 @@ let get_ivar_name prop_name ivar_opt =
| Some ivar_name -> ivar_name | Some ivar_name -> ivar_name
| None -> Ast_utils.generated_ivar_name prop_name | None -> Ast_utils.generated_ivar_name prop_name
let make_getter curr_class prop_name prop_type =
match prop_type with
| tp, attributes, decl_info, (getter_name, getter), (setter_name, setter), ivar_opt ->
let ivar_name = get_ivar_name prop_name ivar_opt in
let open Clang_ast_t in
match getter with
| Some (ObjCMethodDecl(di, name_info, mdi), _) ->
let dummy_info = Ast_expressions.dummy_decl_info_in_curr_file di in
let class_name = CContext.get_curr_class_name curr_class in
let deref_self_field = Ast_expressions.make_deref_self_field
class_name dummy_info mdi.Clang_ast_t.omdi_result_type ivar_name in
let body = ReturnStmt(Ast_expressions.make_stmt_info dummy_info, [deref_self_field]) in
let mdi'= Ast_expressions.make_method_decl_info mdi body in
let generated_name_info = create_generated_method_name name_info in
Property.replace_property
(curr_class, prop_name)
(tp, attributes, decl_info,
(getter_name, Some (ObjCMethodDecl(di, name_info, mdi), true)), (setter_name, setter), Some ivar_name);
[ObjCMethodDecl(dummy_info, generated_name_info, mdi')]
| _ -> []
let make_setter curr_class prop_name prop_type = let make_setter curr_class prop_name prop_type =
match prop_type with match prop_type with
| tp, attributes, decl_info, (getter_name, getter), (setter_name, setter), ivar_opt -> | tp, attributes, decl_info, (getter_name, getter), (setter_name, setter), ivar_opt ->
@ -360,11 +339,11 @@ let make_setter curr_class prop_name prop_type =
(* [self->_field = param] *) (* [self->_field = param] *)
(* - If copy is available then write the following code: *) (* - If copy is available then write the following code: *)
(* [self->_field = [param copy] *) (* [self->_field = [param copy] *)
let make_getter_setter curr_class decl_info prop_name = let make_setter' curr_class decl_info prop_name =
Printing.log_out "pointer = '%s'\n" decl_info.Clang_ast_t.di_pointer; Printing.log_out "pointer = '%s'\n" decl_info.Clang_ast_t.di_pointer;
try try
let prop_type = Property.find_property curr_class prop_name in let prop_type = Property.find_property curr_class prop_name in
(make_getter curr_class prop_name prop_type)@ (make_setter curr_class prop_name prop_type) (make_setter curr_class prop_name prop_type)
with _ -> with _ ->
Printing.log_out "Property %s not found@." prop_name.Clang_ast_t.ni_name; Printing.log_out "Property %s not found@." prop_name.Clang_ast_t.ni_name;
[] []

@ -65,13 +65,10 @@ val is_property_read_only : Clang_ast_t.property_attribute list -> bool
val find_properties_class : CContext.curr_class -> val find_properties_class : CContext.curr_class ->
(Clang_ast_t.named_decl_info * property_type) list (Clang_ast_t.named_decl_info * property_type) list
val make_getter : CContext.curr_class -> Clang_ast_t.named_decl_info -> property_type ->
Clang_ast_t.decl list
val make_setter : CContext.curr_class -> Clang_ast_t.named_decl_info -> property_type -> val make_setter : CContext.curr_class -> Clang_ast_t.named_decl_info -> property_type ->
Clang_ast_t.decl list Clang_ast_t.decl list
val make_getter_setter : CContext.curr_class -> Clang_ast_t.decl_info -> val make_setter' : CContext.curr_class -> Clang_ast_t.decl_info ->
Clang_ast_t.named_decl_info -> Clang_ast_t.decl list Clang_ast_t.named_decl_info -> Clang_ast_t.decl list
val method_is_property_accesor : CContext.curr_class -> string -> val method_is_property_accesor : CContext.curr_class -> string ->

@ -1,34 +1,23 @@
digraph iCFG { digraph iCFG {
16 [label="16: Message Call: retain \n n$14=*&son:class A * [line 16]\n n$15=_fun___objc_retain(n$14:class A *) [line 16]\n REMOVE_TEMPS(n$14,n$15); [line 16]\n " shape="box"] 13 [label="13: Message Call: retain \n n$11=*&son:class A * [line 16]\n n$12=_fun___objc_retain(n$11:class A *) [line 16]\n REMOVE_TEMPS(n$11,n$12); [line 16]\n " shape="box"]
16 -> 15 ; 13 -> 12 ;
15 [label="15: Message Call: release \n n$11=*&self:class A * [line 16]\n n$12=*n$11._son:class A * [line 16]\n n$13=_fun___objc_release(n$12:class A *) [line 16]\n REMOVE_TEMPS(n$11,n$12,n$13); [line 16]\n " shape="box"] 12 [label="12: Message Call: release \n n$8=*&self:class A * [line 16]\n n$9=*n$8._son:class A * [line 16]\n n$10=_fun___objc_release(n$9:class A *) [line 16]\n REMOVE_TEMPS(n$8,n$9,n$10); [line 16]\n " shape="box"]
15 -> 14 ; 12 -> 11 ;
14 [label="14: BinaryOperatorStmt: Assign \n n$8=*&self:class A * [line 16]\n n$9=*&son:class A * [line 16]\n _fun___objc_retain(n$9:class A *) [line 16]\n n$10=*n$8._son:class A * [line 16]\n *n$8._son:class A *=n$9 [line 16]\n _fun___objc_release(n$10:class A *) [line 16]\n REMOVE_TEMPS(n$8,n$9,n$10); [line 16]\n NULLIFY(&self,false); [line 16]\n NULLIFY(&son,false); [line 16]\n APPLY_ABSTRACTION; [line 16]\n " shape="box"] 11 [label="11: BinaryOperatorStmt: Assign \n n$5=*&self:class A * [line 16]\n n$6=*&son:class A * [line 16]\n _fun___objc_retain(n$6:class A *) [line 16]\n n$7=*n$5._son:class A * [line 16]\n *n$5._son:class A *=n$6 [line 16]\n _fun___objc_release(n$7:class A *) [line 16]\n REMOVE_TEMPS(n$5,n$6,n$7); [line 16]\n NULLIFY(&self,false); [line 16]\n NULLIFY(&son,false); [line 16]\n APPLY_ABSTRACTION; [line 16]\n " shape="box"]
14 -> 13 ;
13 [label="13: Exit A_setSon: \n " color=yellow style=filled]
12 [label="12: Start A_setSon: (generated)\nFormals: self:class A * son:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 16]\n " color=yellow style=filled]
12 -> 16 ;
11 [label="11: Return Stmt \n n$5=*&self:class A * [line 16]\n n$6=*n$5._son:class A * [line 16]\n *&return:class A *=n$6 [line 16]\n n$7=_fun___set_autorelease_attribute(n$6:class A *) [line 16]\n REMOVE_TEMPS(n$5,n$6,n$7); [line 16]\n NULLIFY(&self,false); [line 16]\n APPLY_ABSTRACTION; [line 16]\n " shape="box"]
11 -> 10 ; 11 -> 10 ;
10 [label="10: Exit A_son \n " color=yellow style=filled] 10 [label="10: Exit A_setSon: \n " color=yellow style=filled]
9 [label="9: Start A_son (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 16]\n " color=yellow style=filled] 9 [label="9: Start A_setSon: (generated)\nFormals: self:class A * son:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 16]\n " color=yellow style=filled]
9 -> 11 ; 9 -> 13 ;
8 [label="8: DeclStmt \n n$4=_fun___objc_alloc_no_fail(sizeof(class NSString ):unsigned long ) [line 29]\n *&s:class NSString *=n$4 [line 29]\n REMOVE_TEMPS(n$4); [line 29]\n " shape="box"] 8 [label="8: DeclStmt \n n$4=_fun___objc_alloc_no_fail(sizeof(class NSString ):unsigned long ) [line 29]\n *&s:class NSString *=n$4 [line 29]\n REMOVE_TEMPS(n$4); [line 29]\n " shape="box"]

@ -1,143 +1,132 @@
digraph iCFG { digraph iCFG {
41 [label="41: DeclStmt \n n$4=_fun___objc_alloc_no_fail(sizeof(class NSAutoreleasePool ):unsigned long ) [line 60]\n n$5=_fun_NSObject_init(n$4:class NSAutoreleasePool *) virtual [line 60]\n *&pool:class NSAutoreleasePool *=n$5 [line 60]\n REMOVE_TEMPS(n$4,n$5); [line 60]\n " shape="box"] 38 [label="38: DeclStmt \n n$4=_fun___objc_alloc_no_fail(sizeof(class NSAutoreleasePool ):unsigned long ) [line 60]\n n$5=_fun_NSObject_init(n$4:class NSAutoreleasePool *) virtual [line 60]\n *&pool:class NSAutoreleasePool *=n$5 [line 60]\n REMOVE_TEMPS(n$4,n$5); [line 60]\n " shape="box"]
41 -> 40 ;
40 [label="40: DeclStmt \n n$2=_fun___objc_alloc_no_fail(sizeof(class NSString ):unsigned long ) [line 61]\n n$3=_fun___set_autorelease_attribute(n$2:class NSString *) [line 61]\n *&string:class NSString *=n$3 [line 61]\n REMOVE_TEMPS(n$2,n$3); [line 61]\n " shape="box"]
40 -> 39 ;
39 [label="39: Message Call: release \n n$1=*&pool:class NSAutoreleasePool * [line 63]\n _fun___objc_release_autorelease_pool(n$1:class NSAutoreleasePool *) [line 63]\n REMOVE_TEMPS(n$1); [line 63]\n NULLIFY(&pool,false); [line 63]\n " shape="box"]
39 -> 38 ;
38 [label="38: DeclStmt \n n$0=*&string:class NSString * [line 64]\n *&c:class NSString *=n$0 [line 64]\n REMOVE_TEMPS(n$0); [line 64]\n NULLIFY(&c,false); [line 64]\n NULLIFY(&string,false); [line 64]\n APPLY_ABSTRACTION; [line 64]\n " shape="box"]
38 -> 37 ; 38 -> 37 ;
37 [label="37: Exit test3 \n " color=yellow style=filled] 37 [label="37: DeclStmt \n n$2=_fun___objc_alloc_no_fail(sizeof(class NSString ):unsigned long ) [line 61]\n n$3=_fun___set_autorelease_attribute(n$2:class NSString *) [line 61]\n *&string:class NSString *=n$3 [line 61]\n REMOVE_TEMPS(n$2,n$3); [line 61]\n " shape="box"]
36 [label="36: Start test3\nFormals: \nLocals: c:class NSString * string:class NSString * pool:class NSAutoreleasePool * \n DECLARE_LOCALS(&return,&c,&string,&pool); [line 59]\n NULLIFY(&c,false); [line 59]\n NULLIFY(&pool,false); [line 59]\n NULLIFY(&string,false); [line 59]\n " color=yellow style=filled] 37 -> 36 ;
36 [label="36: Message Call: release \n n$1=*&pool:class NSAutoreleasePool * [line 63]\n _fun___objc_release_autorelease_pool(n$1:class NSAutoreleasePool *) [line 63]\n REMOVE_TEMPS(n$1); [line 63]\n NULLIFY(&pool,false); [line 63]\n " shape="box"]
36 -> 41 ; 36 -> 35 ;
35 [label="35: DeclStmt \n *&s1:class A *=0 [line 48]\n " shape="box"] 35 [label="35: DeclStmt \n n$0=*&string:class NSString * [line 64]\n *&c:class NSString *=n$0 [line 64]\n REMOVE_TEMPS(n$0); [line 64]\n NULLIFY(&c,false); [line 64]\n NULLIFY(&string,false); [line 64]\n APPLY_ABSTRACTION; [line 64]\n " shape="box"]
35 -> 34 ; 35 -> 34 ;
34 [label="34: DeclStmt \n *&s2:class A *=0 [line 49]\n " shape="box"] 34 [label="34: Exit test3 \n " color=yellow style=filled]
34 -> 33 ; 33 [label="33: Start test3\nFormals: \nLocals: c:class NSString * string:class NSString * pool:class NSAutoreleasePool * \n DECLARE_LOCALS(&return,&c,&string,&pool); [line 59]\n NULLIFY(&c,false); [line 59]\n NULLIFY(&pool,false); [line 59]\n NULLIFY(&string,false); [line 59]\n " color=yellow style=filled]
33 [label="33: DeclStmt \n *&s3:class A *=0 [line 50]\n " shape="box"]
33 -> 32 ; 33 -> 38 ;
32 [label="32: BinaryOperatorStmt: Assign \n n$3=_fun_createA() [line 52]\n *&s1:class A *=n$3 [line 52]\n REMOVE_TEMPS(n$3); [line 52]\n " shape="box"] 32 [label="32: DeclStmt \n *&s1:class A *=0 [line 48]\n " shape="box"]
32 -> 31 ; 32 -> 31 ;
31 [label="31: BinaryOperatorStmt: Assign \n n$2=_fun_createA() [line 53]\n *&s2:class A *=n$2 [line 53]\n REMOVE_TEMPS(n$2); [line 53]\n " shape="box"] 31 [label="31: DeclStmt \n *&s2:class A *=0 [line 49]\n " shape="box"]
31 -> 30 ; 31 -> 30 ;
30 [label="30: BinaryOperatorStmt: Assign \n n$1=_fun_createA() [line 54]\n *&s3:class A *=n$1 [line 54]\n REMOVE_TEMPS(n$1); [line 54]\n " shape="box"] 30 [label="30: DeclStmt \n *&s3:class A *=0 [line 50]\n " shape="box"]
30 -> 29 ; 30 -> 29 ;
29 [label="29: Release the autorelease pool \n n$0=_fun___objc_release_autorelease_pool(&s1:class A *,&s3:class A *,&s2:class A *) [line 51]\n REMOVE_TEMPS(n$0); [line 51]\n " shape="box"] 29 [label="29: BinaryOperatorStmt: Assign \n n$3=_fun_createA() [line 52]\n *&s1:class A *=n$3 [line 52]\n REMOVE_TEMPS(n$3); [line 52]\n " shape="box"]
29 -> 28 ; 29 -> 28 ;
28 [label="28: Return Stmt \n *&return:int =0 [line 56]\n NULLIFY(&s1,false); [line 56]\n NULLIFY(&s2,false); [line 56]\n NULLIFY(&s3,false); [line 56]\n APPLY_ABSTRACTION; [line 56]\n " shape="box"] 28 [label="28: BinaryOperatorStmt: Assign \n n$2=_fun_createA() [line 53]\n *&s2:class A *=n$2 [line 53]\n REMOVE_TEMPS(n$2); [line 53]\n " shape="box"]
28 -> 27 ; 28 -> 27 ;
27 [label="27: Exit test2 \n " color=yellow style=filled] 27 [label="27: BinaryOperatorStmt: Assign \n n$1=_fun_createA() [line 54]\n *&s3:class A *=n$1 [line 54]\n REMOVE_TEMPS(n$1); [line 54]\n " shape="box"]
26 [label="26: Start test2\nFormals: \nLocals: s3:class A * s2:class A * s1:class A * \n DECLARE_LOCALS(&return,&s3,&s2,&s1); [line 47]\n " color=yellow style=filled] 27 -> 26 ;
26 [label="26: Release the autorelease pool \n n$0=_fun___objc_release_autorelease_pool(&s1:class A *,&s3:class A *,&s2:class A *) [line 51]\n REMOVE_TEMPS(n$0); [line 51]\n " shape="box"]
26 -> 35 ; 26 -> 25 ;
25 [label="25: DeclStmt \n *&s1:class A *=0 [line 35]\n " shape="box"] 25 [label="25: Return Stmt \n *&return:int =0 [line 56]\n NULLIFY(&s1,false); [line 56]\n NULLIFY(&s2,false); [line 56]\n NULLIFY(&s3,false); [line 56]\n APPLY_ABSTRACTION; [line 56]\n " shape="box"]
25 -> 24 ; 25 -> 24 ;
24 [label="24: DeclStmt \n *&s2:class A *=0 [line 36]\n " shape="box"] 24 [label="24: Exit test2 \n " color=yellow style=filled]
24 -> 23 ; 23 [label="23: Start test2\nFormals: \nLocals: s3:class A * s2:class A * s1:class A * \n DECLARE_LOCALS(&return,&s3,&s2,&s1); [line 47]\n " color=yellow style=filled]
23 [label="23: DeclStmt \n *&s3:class A *=0 [line 37]\n " shape="box"]
23 -> 22 ; 23 -> 32 ;
22 [label="22: BinaryOperatorStmt: Assign \n n$5=_fun_createA() [line 39]\n *&s1:class A *=n$5 [line 39]\n REMOVE_TEMPS(n$5); [line 39]\n " shape="box"] 22 [label="22: DeclStmt \n *&s1:class A *=0 [line 35]\n " shape="box"]
22 -> 21 ; 22 -> 21 ;
21 [label="21: Message Call: retain \n n$3=*&s1:class A * [line 40]\n n$4=_fun___objc_retain(n$3:class A *) [line 40]\n REMOVE_TEMPS(n$3,n$4); [line 40]\n " shape="box"] 21 [label="21: DeclStmt \n *&s2:class A *=0 [line 36]\n " shape="box"]
21 -> 20 ; 21 -> 20 ;
20 [label="20: BinaryOperatorStmt: Assign \n n$2=_fun_createA() [line 41]\n *&s2:class A *=n$2 [line 41]\n REMOVE_TEMPS(n$2); [line 41]\n " shape="box"] 20 [label="20: DeclStmt \n *&s3:class A *=0 [line 37]\n " shape="box"]
20 -> 19 ; 20 -> 19 ;
19 [label="19: BinaryOperatorStmt: Assign \n n$1=_fun_createA() [line 42]\n *&s3:class A *=n$1 [line 42]\n REMOVE_TEMPS(n$1); [line 42]\n " shape="box"] 19 [label="19: BinaryOperatorStmt: Assign \n n$5=_fun_createA() [line 39]\n *&s1:class A *=n$5 [line 39]\n REMOVE_TEMPS(n$5); [line 39]\n " shape="box"]
19 -> 18 ; 19 -> 18 ;
18 [label="18: Release the autorelease pool \n n$0=_fun___objc_release_autorelease_pool(&s1:class A *,&s2:class A *,&s3:class A *) [line 38]\n REMOVE_TEMPS(n$0); [line 38]\n " shape="box"] 18 [label="18: Message Call: retain \n n$3=*&s1:class A * [line 40]\n n$4=_fun___objc_retain(n$3:class A *) [line 40]\n REMOVE_TEMPS(n$3,n$4); [line 40]\n " shape="box"]
18 -> 17 ; 18 -> 17 ;
17 [label="17: Return Stmt \n *&return:int =0 [line 44]\n NULLIFY(&s1,false); [line 44]\n NULLIFY(&s2,false); [line 44]\n NULLIFY(&s3,false); [line 44]\n APPLY_ABSTRACTION; [line 44]\n " shape="box"] 17 [label="17: BinaryOperatorStmt: Assign \n n$2=_fun_createA() [line 41]\n *&s2:class A *=n$2 [line 41]\n REMOVE_TEMPS(n$2); [line 41]\n " shape="box"]
17 -> 16 ; 17 -> 16 ;
16 [label="16: Exit test1 \n " color=yellow style=filled] 16 [label="16: BinaryOperatorStmt: Assign \n n$1=_fun_createA() [line 42]\n *&s3:class A *=n$1 [line 42]\n REMOVE_TEMPS(n$1); [line 42]\n " shape="box"]
15 [label="15: Start test1\nFormals: \nLocals: s3:class A * s2:class A * s1:class A * \n DECLARE_LOCALS(&return,&s3,&s2,&s1); [line 34]\n " color=yellow style=filled] 16 -> 15 ;
15 [label="15: Release the autorelease pool \n n$0=_fun___objc_release_autorelease_pool(&s1:class A *,&s2:class A *,&s3:class A *) [line 38]\n REMOVE_TEMPS(n$0); [line 38]\n " shape="box"]
15 -> 25 ; 15 -> 14 ;
14 [label="14: DeclStmt \n n$2=_fun___objc_alloc_no_fail(sizeof(class A ):unsigned long ) [line 30]\n n$3=_fun_NSObject_init(n$2:class A *) virtual [line 30]\n *&s1:class A *=n$3 [line 30]\n REMOVE_TEMPS(n$2,n$3); [line 30]\n " shape="box"] 14 [label="14: Return Stmt \n *&return:int =0 [line 44]\n NULLIFY(&s1,false); [line 44]\n NULLIFY(&s2,false); [line 44]\n NULLIFY(&s3,false); [line 44]\n APPLY_ABSTRACTION; [line 44]\n " shape="box"]
14 -> 13 ; 14 -> 13 ;
13 [label="13: Return Stmt \n n$0=*&s1:class A * [line 31]\n n$1=_fun___set_autorelease_attribute(n$0:class A *) [line 31]\n *&return:class A *=n$1 [line 31]\n REMOVE_TEMPS(n$0,n$1); [line 31]\n NULLIFY(&s1,false); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 13 [label="13: Exit test1 \n " color=yellow style=filled]
13 -> 12 ; 12 [label="12: Start test1\nFormals: \nLocals: s3:class A * s2:class A * s1:class A * \n DECLARE_LOCALS(&return,&s3,&s2,&s1); [line 34]\n " color=yellow style=filled]
12 [label="12: Exit createA \n " color=yellow style=filled]
11 [label="11: Start createA\nFormals: \nLocals: s1:class A * \n DECLARE_LOCALS(&return,&s1); [line 29]\n NULLIFY(&s1,false); [line 29]\n " color=yellow style=filled] 12 -> 22 ;
11 [label="11: DeclStmt \n n$2=_fun___objc_alloc_no_fail(sizeof(class A ):unsigned long ) [line 30]\n n$3=_fun_NSObject_init(n$2:class A *) virtual [line 30]\n *&s1:class A *=n$3 [line 30]\n REMOVE_TEMPS(n$2,n$3); [line 30]\n " shape="box"]
11 -> 14 ; 11 -> 10 ;
10 [label="10: BinaryOperatorStmt: Assign \n n$5=*&self:class A * [line 17]\n n$6=*&son:class A * [line 17]\n *n$5._son:class A *=n$6 [line 17]\n REMOVE_TEMPS(n$5,n$6); [line 17]\n NULLIFY(&self,false); [line 17]\n NULLIFY(&son,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"] 10 [label="10: Return Stmt \n n$0=*&s1:class A * [line 31]\n n$1=_fun___set_autorelease_attribute(n$0:class A *) [line 31]\n *&return:class A *=n$1 [line 31]\n REMOVE_TEMPS(n$0,n$1); [line 31]\n NULLIFY(&s1,false); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
10 -> 9 ; 10 -> 9 ;
9 [label="9: Exit A_setSon: \n " color=yellow style=filled] 9 [label="9: Exit createA \n " color=yellow style=filled]
8 [label="8: Start A_setSon: (generated)\nFormals: self:class A * son:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 17]\n " color=yellow style=filled] 8 [label="8: Start createA\nFormals: \nLocals: s1:class A * \n DECLARE_LOCALS(&return,&s1); [line 29]\n NULLIFY(&s1,false); [line 29]\n " color=yellow style=filled]
8 -> 10 ; 8 -> 11 ;
7 [label="7: Return Stmt \n n$3=*&self:class A * [line 17]\n n$4=*n$3._son:class A * [line 17]\n *&return:class A *=n$4 [line 17]\n REMOVE_TEMPS(n$3,n$4); [line 17]\n NULLIFY(&self,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"] 7 [label="7: BinaryOperatorStmt: Assign \n n$3=*&self:class A * [line 17]\n n$4=*&son:class A * [line 17]\n *n$3._son:class A *=n$4 [line 17]\n REMOVE_TEMPS(n$3,n$4); [line 17]\n NULLIFY(&self,false); [line 17]\n NULLIFY(&son,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
7 -> 6 ; 7 -> 6 ;
6 [label="6: Exit A_son \n " color=yellow style=filled] 6 [label="6: Exit A_setSon: \n " color=yellow style=filled]
5 [label="5: Start A_son (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 17]\n " color=yellow style=filled] 5 [label="5: Start A_setSon: (generated)\nFormals: self:class A * son:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 17]\n " color=yellow style=filled]
5 -> 7 ; 5 -> 7 ;

@ -141,11 +141,11 @@ digraph iCFG {
11 -> 13 ; 11 -> 13 ;
10 [label="10: DeclStmt \n n$10=*&self:class MemoryLeakExample * [line 31]\n n$11=_fun_MemoryLeakExample_backgroundCoveringView(n$10:class MemoryLeakExample *) virtual [line 31]\n n$12=_fun_UIView_bounds(n$11:class UIView *) virtual [line 31]\n n$13=_fun_CGPathCreateWithRect(n$12:struct CGRect ,0:struct CGAffineTransform *) [line 31]\n *&shadowPath:struct CGPath *=n$13 [line 31]\n REMOVE_TEMPS(n$10,n$11,n$12,n$13); [line 31]\n " shape="box"] 10 [label="10: DeclStmt \n n$10=*&self:class MemoryLeakExample * [line 31]\n n$11=_fun_MemoryLeakExample_backgroundCoveringView(n$10:class MemoryLeakExample *) [line 31]\n n$12=_fun_UIView_bounds(n$11:class UIView *) [line 31]\n n$13=_fun_CGPathCreateWithRect(n$12:struct CGRect ,0:struct CGAffineTransform *) [line 31]\n *&shadowPath:struct CGPath *=n$13 [line 31]\n REMOVE_TEMPS(n$10,n$11,n$12,n$13); [line 31]\n " shape="box"]
10 -> 9 ; 10 -> 9 ;
9 [label="9: Message Call: setShadowPath: \n n$6=*&self:class MemoryLeakExample * [line 32]\n n$7=_fun_MemoryLeakExample_backgroundCoveringView(n$6:class MemoryLeakExample *) virtual [line 32]\n n$8=_fun_UIView_layer(n$7:class UIView *) virtual [line 32]\n n$9=*&shadowPath:struct CGPath * [line 32]\n _fun_CALayer_setShadowPath:(n$8:class CALayer *,n$9:struct CGPath *) virtual [line 32]\n REMOVE_TEMPS(n$6,n$7,n$8,n$9); [line 32]\n NULLIFY(&self,false); [line 32]\n NULLIFY(&shadowPath,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"] 9 [label="9: Message Call: setShadowPath: \n n$6=*&self:class MemoryLeakExample * [line 32]\n n$7=_fun_MemoryLeakExample_backgroundCoveringView(n$6:class MemoryLeakExample *) [line 32]\n n$8=_fun_UIView_layer(n$7:class UIView *) [line 32]\n n$9=*&shadowPath:struct CGPath * [line 32]\n _fun_CALayer_setShadowPath:(n$8:class CALayer *,n$9:struct CGPath *) virtual [line 32]\n REMOVE_TEMPS(n$6,n$7,n$8,n$9); [line 32]\n NULLIFY(&self,false); [line 32]\n NULLIFY(&shadowPath,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"]
9 -> 8 ; 9 -> 8 ;
@ -160,7 +160,7 @@ digraph iCFG {
6 -> 5 ; 6 -> 5 ;
5 [label="5: DeclStmt \n n$2=*&attachmentContainerView:class UIView * [line 22]\n n$3=_fun_UIView_bounds(n$2:class UIView *) virtual [line 22]\n n$4=_fun_CGPathCreateWithRect(n$3:struct CGRect ,0:struct CGAffineTransform *) [line 22]\n *&shadowPath:struct CGPath *=n$4 [line 22]\n REMOVE_TEMPS(n$2,n$3,n$4); [line 22]\n " shape="box"] 5 [label="5: DeclStmt \n n$2=*&attachmentContainerView:class UIView * [line 22]\n n$3=_fun_UIView_bounds(n$2:class UIView *) [line 22]\n n$4=_fun_CGPathCreateWithRect(n$3:struct CGRect ,0:struct CGAffineTransform *) [line 22]\n *&shadowPath:struct CGPath *=n$4 [line 22]\n REMOVE_TEMPS(n$2,n$3,n$4); [line 22]\n " shape="box"]
5 -> 4 ; 5 -> 4 ;

@ -1,45 +1,34 @@
digraph iCFG { digraph iCFG {
20 [label="20: Call _fun___infer_assume \n n$1=*&callback:_fn_ (*) [line 46]\n n$2=_fun___infer_assume((n$1 != 0):_fn_ (*)) [line 46]\n REMOVE_TEMPS(n$1,n$2); [line 46]\n " shape="box"] 17 [label="17: Call _fun___infer_assume \n n$1=*&callback:_fn_ (*) [line 46]\n n$2=_fun___infer_assume((n$1 != 0):_fn_ (*)) [line 46]\n REMOVE_TEMPS(n$1,n$2); [line 46]\n " shape="box"]
20 -> 19 ; 17 -> 16 ;
19 [label="19: Call n$0 \n n$0=*&callback:_fn_ (*) [line 47]\n n$0(0:class NSError *,0:struct objc_object *) [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n NULLIFY(&callback,false); [line 47]\n APPLY_ABSTRACTION; [line 47]\n " shape="box"] 16 [label="16: Call n$0 \n n$0=*&callback:_fn_ (*) [line 47]\n n$0(0:class NSError *,0:struct objc_object *) [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n NULLIFY(&callback,false); [line 47]\n APPLY_ABSTRACTION; [line 47]\n " shape="box"]
19 -> 18 ;
18 [label="18: Exit test \n " color=yellow style=filled]
17 [label="17: Start test\nFormals: callback:_fn_ (*)\nLocals: \n DECLARE_LOCALS(&return); [line 46]\n " color=yellow style=filled]
17 -> 20 ;
16 [label="16: Call _fun___infer_assume \n n$13=*&name:class NSString * [line -1]\n n$14=_fun___infer_assume((n$13 != 0):class NSString *) [line -1]\n REMOVE_TEMPS(n$13,n$14); [line -1]\n " shape="box"]
16 -> 15 ; 16 -> 15 ;
15 [label="15: BinaryOperatorStmt: Assign \n n$10=*&self:class C * [line 31]\n n$11=*&name:class NSString * [line 31]\n n$12=_fun_NSString_copy(n$11:class NSString *) virtual [line 31]\n *n$10._name:class NSString *=n$12 [line 31]\n REMOVE_TEMPS(n$10,n$11,n$12); [line 31]\n NULLIFY(&name,false); [line 31]\n NULLIFY(&self,false); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 15 [label="15: Exit test \n " color=yellow style=filled]
15 -> 14 ; 14 [label="14: Start test\nFormals: callback:_fn_ (*)\nLocals: \n DECLARE_LOCALS(&return); [line 46]\n " color=yellow style=filled]
14 [label="14: Exit C_setName: \n " color=yellow style=filled]
13 [label="13: Start C_setName: (generated)\nFormals: self:class C * name:class NSString *\nLocals: \n DECLARE_LOCALS(&return); [line 31]\n " color=yellow style=filled] 14 -> 17 ;
13 [label="13: Call _fun___infer_assume \n n$10=*&name:class NSString * [line -1]\n n$11=_fun___infer_assume((n$10 != 0):class NSString *) [line -1]\n REMOVE_TEMPS(n$10,n$11); [line -1]\n " shape="box"]
13 -> 16 ; 13 -> 12 ;
12 [label="12: Return Stmt \n n$7=*&self:class C * [line 31]\n n$8=*n$7._name:class NSString * [line 31]\n *&return:class NSString *=n$8 [line 31]\n n$9=_fun___set_autorelease_attribute(n$8:class NSString *) [line 31]\n REMOVE_TEMPS(n$7,n$8,n$9); [line 31]\n NULLIFY(&self,false); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 12 [label="12: BinaryOperatorStmt: Assign \n n$7=*&self:class C * [line 31]\n n$8=*&name:class NSString * [line 31]\n n$9=_fun_NSString_copy(n$8:class NSString *) virtual [line 31]\n *n$7._name:class NSString *=n$9 [line 31]\n REMOVE_TEMPS(n$7,n$8,n$9); [line 31]\n NULLIFY(&name,false); [line 31]\n NULLIFY(&self,false); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
12 -> 11 ; 12 -> 11 ;
11 [label="11: Exit C_name \n " color=yellow style=filled] 11 [label="11: Exit C_setName: \n " color=yellow style=filled]
10 [label="10: Start C_name (generated)\nFormals: self:class C *\nLocals: \n DECLARE_LOCALS(&return); [line 31]\n " color=yellow style=filled] 10 [label="10: Start C_setName: (generated)\nFormals: self:class C * name:class NSString *\nLocals: \n DECLARE_LOCALS(&return); [line 31]\n " color=yellow style=filled]
10 -> 12 ; 10 -> 13 ;
9 [label="9: Call _fun___infer_assume \n n$5=*&a:class A * [line -1]\n n$6=_fun___infer_assume((n$5 != 0):class A *) [line -1]\n REMOVE_TEMPS(n$5,n$6); [line -1]\n " shape="box"] 9 [label="9: Call _fun___infer_assume \n n$5=*&a:class A * [line -1]\n n$6=_fun___infer_assume((n$5 != 0):class A *) [line -1]\n REMOVE_TEMPS(n$5,n$6); [line -1]\n " shape="box"]

@ -1,458 +1,447 @@
digraph iCFG { digraph iCFG {
123 [label="123: DeclStmt \n n$22=_fun_NSString_stringWithUTF8String:(\"\":char *) [line 36]\n _fun___objc_retain(n$22:class NSString *) [line 36]\n *&__assert_fn__:class NSString *=n$22 [line 36]\n REMOVE_TEMPS(n$22); [line 36]\n " shape="box"] 108 [label="108: DeclStmt \n n$20=_fun_NSString_stringWithUTF8String:(\"\":char *) [line 36]\n _fun___objc_retain(n$20:class NSString *) [line 36]\n *&__assert_fn__:class NSString *=n$20 [line 36]\n REMOVE_TEMPS(n$20); [line 36]\n " shape="box"]
123 -> 118 ; 108 -> 103 ;
123 -> 119 ; 108 -> 104 ;
122 [label="122: BinaryOperatorStmt: Assign \n n$20=*&SIL_temp_conditional___117:class NSString * [line 36]\n NULLIFY(&SIL_temp_conditional___117,true); [line 36]\n _fun___objc_retain(n$20:class NSString *) [line 36]\n n$21=*&__assert_fn__:class NSString * [line 36]\n *&__assert_fn__:class NSString *=n$20 [line 36]\n _fun___objc_release(n$21:class NSString *) [line 36]\n REMOVE_TEMPS(n$20,n$21); [line 36]\n NULLIFY(&__assert_fn__,false); [line 36]\n " shape="box"] 107 [label="107: BinaryOperatorStmt: Assign \n n$18=*&SIL_temp_conditional___102:class NSString * [line 36]\n NULLIFY(&SIL_temp_conditional___102,true); [line 36]\n _fun___objc_retain(n$18:class NSString *) [line 36]\n n$19=*&__assert_fn__:class NSString * [line 36]\n *&__assert_fn__:class NSString *=n$18 [line 36]\n _fun___objc_release(n$19:class NSString *) [line 36]\n REMOVE_TEMPS(n$18,n$19); [line 36]\n NULLIFY(&__assert_fn__,false); [line 36]\n " shape="box"]
122 -> 116 ; 107 -> 101 ;
121 [label="121: Message Call: stringWithUTF8String: \n n$19=_fun_NSString_stringWithUTF8String:(\"<Unknown Function>\":char *) [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___117); [line 36]\n *&SIL_temp_conditional___117:class NSString *=n$19 [line 36]\n REMOVE_TEMPS(n$19); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"] 106 [label="106: Message Call: stringWithUTF8String: \n n$17=_fun_NSString_stringWithUTF8String:(\"<Unknown Function>\":char *) [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___102); [line 36]\n *&SIL_temp_conditional___102:class NSString *=n$17 [line 36]\n REMOVE_TEMPS(n$17); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
121 -> 117 ; 106 -> 102 ;
120 [label="120: ConditinalStmt Branch \n n$18=*&__assert_fn__:class NSString * [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___117); [line 36]\n *&SIL_temp_conditional___117:class NSString *=n$18 [line 36]\n REMOVE_TEMPS(n$18); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"] 105 [label="105: ConditinalStmt Branch \n n$16=*&__assert_fn__:class NSString * [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___102); [line 36]\n *&SIL_temp_conditional___102:class NSString *=n$16 [line 36]\n REMOVE_TEMPS(n$16); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
120 -> 117 ;
119 [label="119: Prune (false branch) \n n$17=*&__assert_fn__:class NSString * [line 36]\n PRUNE((n$17 == 0), false); [line 36]\n REMOVE_TEMPS(n$17); [line 36]\n " shape="invhouse"]
119 -> 121 ;
118 [label="118: Prune (true branch) \n n$17=*&__assert_fn__:class NSString * [line 36]\n PRUNE((n$17 != 0), true); [line 36]\n REMOVE_TEMPS(n$17); [line 36]\n " shape="invhouse"]
118 -> 120 ;
117 [label="117: + \n " ]
117 -> 122 ; 105 -> 102 ;
116 [label="116: DeclStmt \n n$16=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 36]\n _fun___objc_retain(n$16:class NSString *) [line 36]\n *&__assert_file__:class NSString *=n$16 [line 36]\n REMOVE_TEMPS(n$16); [line 36]\n " shape="box"] 104 [label="104: Prune (false branch) \n n$15=*&__assert_fn__:class NSString * [line 36]\n PRUNE((n$15 == 0), false); [line 36]\n REMOVE_TEMPS(n$15); [line 36]\n " shape="invhouse"]
116 -> 111 ; 104 -> 106 ;
116 -> 112 ; 103 [label="103: Prune (true branch) \n n$15=*&__assert_fn__:class NSString * [line 36]\n PRUNE((n$15 != 0), true); [line 36]\n REMOVE_TEMPS(n$15); [line 36]\n " shape="invhouse"]
115 [label="115: BinaryOperatorStmt: Assign \n n$14=*&SIL_temp_conditional___110:class NSString * [line 36]\n NULLIFY(&SIL_temp_conditional___110,true); [line 36]\n _fun___objc_retain(n$14:class NSString *) [line 36]\n n$15=*&__assert_file__:class NSString * [line 36]\n *&__assert_file__:class NSString *=n$14 [line 36]\n _fun___objc_release(n$15:class NSString *) [line 36]\n REMOVE_TEMPS(n$14,n$15); [line 36]\n NULLIFY(&__assert_file__,false); [line 36]\n " shape="box"]
115 -> 109 ; 103 -> 105 ;
114 [label="114: Message Call: stringWithUTF8String: \n n$13=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___110); [line 36]\n *&SIL_temp_conditional___110:class NSString *=n$13 [line 36]\n REMOVE_TEMPS(n$13); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"] 102 [label="102: + \n " ]
114 -> 110 ; 102 -> 107 ;
113 [label="113: ConditinalStmt Branch \n n$12=*&__assert_file__:class NSString * [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___110); [line 36]\n *&SIL_temp_conditional___110:class NSString *=n$12 [line 36]\n REMOVE_TEMPS(n$12); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"] 101 [label="101: DeclStmt \n n$14=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 36]\n _fun___objc_retain(n$14:class NSString *) [line 36]\n *&__assert_file__:class NSString *=n$14 [line 36]\n REMOVE_TEMPS(n$14); [line 36]\n " shape="box"]
113 -> 110 ; 101 -> 96 ;
112 [label="112: Prune (false branch) \n n$11=*&__assert_file__:class NSString * [line 36]\n PRUNE((n$11 == 0), false); [line 36]\n REMOVE_TEMPS(n$11); [line 36]\n " shape="invhouse"] 101 -> 97 ;
100 [label="100: BinaryOperatorStmt: Assign \n n$12=*&SIL_temp_conditional___95:class NSString * [line 36]\n NULLIFY(&SIL_temp_conditional___95,true); [line 36]\n _fun___objc_retain(n$12:class NSString *) [line 36]\n n$13=*&__assert_file__:class NSString * [line 36]\n *&__assert_file__:class NSString *=n$12 [line 36]\n _fun___objc_release(n$13:class NSString *) [line 36]\n REMOVE_TEMPS(n$12,n$13); [line 36]\n NULLIFY(&__assert_file__,false); [line 36]\n " shape="box"]
112 -> 114 ; 100 -> 94 ;
111 [label="111: Prune (true branch) \n n$11=*&__assert_file__:class NSString * [line 36]\n PRUNE((n$11 != 0), true); [line 36]\n REMOVE_TEMPS(n$11); [line 36]\n " shape="invhouse"] 99 [label="99: Message Call: stringWithUTF8String: \n n$11=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___95); [line 36]\n *&SIL_temp_conditional___95:class NSString *=n$11 [line 36]\n REMOVE_TEMPS(n$11); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
111 -> 113 ; 99 -> 95 ;
110 [label="110: + \n " ] 98 [label="98: ConditinalStmt Branch \n n$10=*&__assert_file__:class NSString * [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___95); [line 36]\n *&SIL_temp_conditional___95:class NSString *=n$10 [line 36]\n REMOVE_TEMPS(n$10); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
110 -> 115 ; 98 -> 95 ;
109 [label="109: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"] 97 [label="97: Prune (false branch) \n n$9=*&__assert_file__:class NSString * [line 36]\n PRUNE((n$9 == 0), false); [line 36]\n REMOVE_TEMPS(n$9); [line 36]\n " shape="invhouse"]
109 -> 93 ; 97 -> 99 ;
108 [label="108: Prune (false branch) \n n$5=*&SIL_temp_conditional___102:int [line 38]\n NULLIFY(&SIL_temp_conditional___102,true); [line 38]\n PRUNE((n$5 == 0), false); [line 38]\n REMOVE_TEMPS(n$5); [line 38]\n " shape="invhouse"] 96 [label="96: Prune (true branch) \n n$9=*&__assert_file__:class NSString * [line 36]\n PRUNE((n$9 != 0), true); [line 36]\n REMOVE_TEMPS(n$9); [line 36]\n " shape="invhouse"]
108 -> 101 ; 96 -> 98 ;
107 [label="107: Prune (true branch) \n n$5=*&SIL_temp_conditional___102:int [line 38]\n NULLIFY(&SIL_temp_conditional___102,true); [line 38]\n PRUNE((n$5 != 0), true); [line 38]\n REMOVE_TEMPS(n$5); [line 38]\n NULLIFY(&target,false); [line 38]\n " shape="invhouse"] 95 [label="95: + \n " ]
107 -> 123 ; 95 -> 100 ;
106 [label="106: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___102); [line 38]\n *&SIL_temp_conditional___102:int =1 [line 38]\n APPLY_ABSTRACTION; [line 38]\n " shape="box"] 94 [label="94: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
106 -> 102 ; 94 -> 81 ;
105 [label="105: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___102); [line 38]\n *&SIL_temp_conditional___102:int =0 [line 38]\n APPLY_ABSTRACTION; [line 38]\n " shape="box"] 93 [label="93: Prune (false branch) \n n$3=*&SIL_temp_conditional___87:int [line 38]\n NULLIFY(&SIL_temp_conditional___87,true); [line 38]\n PRUNE((n$3 == 0), false); [line 38]\n REMOVE_TEMPS(n$3); [line 38]\n " shape="invhouse"]
105 -> 102 ; 93 -> 86 ;
104 [label="104: Prune (false branch) \n n$4=*&target:class A * [line 38]\n PRUNE((n$4 == 0), false); [line 38]\n REMOVE_TEMPS(n$4); [line 38]\n " shape="invhouse"] 92 [label="92: Prune (true branch) \n n$3=*&SIL_temp_conditional___87:int [line 38]\n NULLIFY(&SIL_temp_conditional___87,true); [line 38]\n PRUNE((n$3 != 0), true); [line 38]\n REMOVE_TEMPS(n$3); [line 38]\n NULLIFY(&target,false); [line 38]\n " shape="invhouse"]
104 -> 106 ; 92 -> 108 ;
103 [label="103: Prune (true branch) \n n$4=*&target:class A * [line 38]\n PRUNE((n$4 != 0), true); [line 38]\n REMOVE_TEMPS(n$4); [line 38]\n " shape="invhouse"] 91 [label="91: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___87); [line 38]\n *&SIL_temp_conditional___87:int =1 [line 38]\n APPLY_ABSTRACTION; [line 38]\n " shape="box"]
103 -> 105 ; 91 -> 87 ;
102 [label="102: + \n " ] 90 [label="90: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___87); [line 38]\n *&SIL_temp_conditional___87:int =0 [line 38]\n APPLY_ABSTRACTION; [line 38]\n " shape="box"]
102 -> 107 ; 90 -> 87 ;
102 -> 108 ; 89 [label="89: Prune (false branch) \n n$2=*&target:class A * [line 38]\n PRUNE((n$2 == 0), false); [line 38]\n REMOVE_TEMPS(n$2); [line 38]\n " shape="invhouse"]
101 [label="101: + \n " ]
101 -> 99 ; 89 -> 91 ;
101 -> 100 ; 88 [label="88: Prune (true branch) \n n$2=*&target:class A * [line 38]\n PRUNE((n$2 != 0), true); [line 38]\n REMOVE_TEMPS(n$2); [line 38]\n " shape="invhouse"]
100 [label="100: Prune (false branch) \n PRUNE((0 == 0), false); [line 36]\n " shape="invhouse"]
100 -> 97 ; 88 -> 90 ;
99 [label="99: Prune (true branch) \n PRUNE((0 != 0), true); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="invhouse"] 87 [label="87: + \n " ]
99 -> 98 ; 87 -> 92 ;
98 [label="98: + \n " ] 87 -> 93 ;
86 [label="86: + \n " ]
98 -> 103 ; 86 -> 84 ;
98 -> 104 ; 86 -> 85 ;
97 [label="97: Return Stmt \n n$0=*&target:class A * [line 37]\n n$3=_fun_A_x(n$0:class A *) virtual [line 37]\n *&return:int =n$3 [line 37]\n REMOVE_TEMPS(n$0,n$3); [line 37]\n NULLIFY(&target,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"] 85 [label="85: Prune (false branch) \n PRUNE((0 == 0), false); [line 36]\n " shape="invhouse"]
97 -> 93 ; 85 -> 82 ;
96 [label="96: Return Stmt \n n$1=*&self:class A * [line 13]\n n$2=*n$1._x:int [line 13]\n *&return:int =n$2 [line 13]\n REMOVE_TEMPS(n$1,n$2); [line 13]\n NULLIFY(&self,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"] 84 [label="84: Prune (true branch) \n PRUNE((0 != 0), true); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="invhouse"]
96 -> 95 ; 84 -> 83 ;
95 [label="95: Exit A_x \n " color=yellow style=filled] 83 [label="83: + \n " ]
94 [label="94: Start A_x (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled] 83 -> 88 ;
83 -> 89 ;
82 [label="82: Return Stmt \n n$0=*&target:class A * [line 37]\n n$1=_fun_A_x(n$0:class A *) [line 37]\n *&return:int =n$1 [line 37]\n REMOVE_TEMPS(n$0,n$1); [line 37]\n NULLIFY(&target,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"]
94 -> 96 ; 82 -> 81 ;
93 [label="93: Exit test2 \n " color=yellow style=filled] 81 [label="81: Exit test2 \n " color=yellow style=filled]
92 [label="92: Start test2\nFormals: target:class A *\nLocals: __assert_file__:class NSString * __assert_fn__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__,&__assert_fn__); [line 35]\n NULLIFY(&__assert_file__,false); [line 35]\n NULLIFY(&__assert_fn__,false); [line 35]\n " color=yellow style=filled] 80 [label="80: Start test2\nFormals: target:class A *\nLocals: __assert_file__:class NSString * __assert_fn__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__,&__assert_fn__); [line 35]\n NULLIFY(&__assert_file__,false); [line 35]\n NULLIFY(&__assert_fn__,false); [line 35]\n " color=yellow style=filled]
92 -> 98 ; 80 -> 83 ;
91 [label="91: DeclStmt \n n$21=_fun_NSString_stringWithUTF8String:(\"\":char *) [line 31]\n _fun___objc_retain(n$21:class NSString *) [line 31]\n *&__assert_fn__:class NSString *=n$21 [line 31]\n REMOVE_TEMPS(n$21); [line 31]\n " shape="box"] 79 [label="79: DeclStmt \n n$19=_fun_NSString_stringWithUTF8String:(\"\":char *) [line 31]\n _fun___objc_retain(n$19:class NSString *) [line 31]\n *&__assert_fn__:class NSString *=n$19 [line 31]\n REMOVE_TEMPS(n$19); [line 31]\n " shape="box"]
91 -> 86 ; 79 -> 74 ;
91 -> 87 ; 79 -> 75 ;
90 [label="90: BinaryOperatorStmt: Assign \n n$19=*&SIL_temp_conditional___85:class NSString * [line 31]\n NULLIFY(&SIL_temp_conditional___85,true); [line 31]\n _fun___objc_retain(n$19:class NSString *) [line 31]\n n$20=*&__assert_fn__:class NSString * [line 31]\n *&__assert_fn__:class NSString *=n$19 [line 31]\n _fun___objc_release(n$20:class NSString *) [line 31]\n REMOVE_TEMPS(n$19,n$20); [line 31]\n NULLIFY(&__assert_fn__,false); [line 31]\n " shape="box"] 78 [label="78: BinaryOperatorStmt: Assign \n n$17=*&SIL_temp_conditional___73:class NSString * [line 31]\n NULLIFY(&SIL_temp_conditional___73,true); [line 31]\n _fun___objc_retain(n$17:class NSString *) [line 31]\n n$18=*&__assert_fn__:class NSString * [line 31]\n *&__assert_fn__:class NSString *=n$17 [line 31]\n _fun___objc_release(n$18:class NSString *) [line 31]\n REMOVE_TEMPS(n$17,n$18); [line 31]\n NULLIFY(&__assert_fn__,false); [line 31]\n " shape="box"]
90 -> 84 ; 78 -> 72 ;
89 [label="89: Message Call: stringWithUTF8String: \n n$18=_fun_NSString_stringWithUTF8String:(\"<Unknown Function>\":char *) [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___85); [line 31]\n *&SIL_temp_conditional___85:class NSString *=n$18 [line 31]\n REMOVE_TEMPS(n$18); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 77 [label="77: Message Call: stringWithUTF8String: \n n$16=_fun_NSString_stringWithUTF8String:(\"<Unknown Function>\":char *) [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___73); [line 31]\n *&SIL_temp_conditional___73:class NSString *=n$16 [line 31]\n REMOVE_TEMPS(n$16); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
89 -> 85 ; 77 -> 73 ;
88 [label="88: ConditinalStmt Branch \n n$17=*&__assert_fn__:class NSString * [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___85); [line 31]\n *&SIL_temp_conditional___85:class NSString *=n$17 [line 31]\n REMOVE_TEMPS(n$17); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 76 [label="76: ConditinalStmt Branch \n n$15=*&__assert_fn__:class NSString * [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___73); [line 31]\n *&SIL_temp_conditional___73:class NSString *=n$15 [line 31]\n REMOVE_TEMPS(n$15); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
88 -> 85 ; 76 -> 73 ;
87 [label="87: Prune (false branch) \n n$16=*&__assert_fn__:class NSString * [line 31]\n PRUNE((n$16 == 0), false); [line 31]\n REMOVE_TEMPS(n$16); [line 31]\n " shape="invhouse"] 75 [label="75: Prune (false branch) \n n$14=*&__assert_fn__:class NSString * [line 31]\n PRUNE((n$14 == 0), false); [line 31]\n REMOVE_TEMPS(n$14); [line 31]\n " shape="invhouse"]
87 -> 89 ; 75 -> 77 ;
86 [label="86: Prune (true branch) \n n$16=*&__assert_fn__:class NSString * [line 31]\n PRUNE((n$16 != 0), true); [line 31]\n REMOVE_TEMPS(n$16); [line 31]\n " shape="invhouse"] 74 [label="74: Prune (true branch) \n n$14=*&__assert_fn__:class NSString * [line 31]\n PRUNE((n$14 != 0), true); [line 31]\n REMOVE_TEMPS(n$14); [line 31]\n " shape="invhouse"]
86 -> 88 ; 74 -> 76 ;
85 [label="85: + \n " ] 73 [label="73: + \n " ]
85 -> 90 ; 73 -> 78 ;
84 [label="84: DeclStmt \n n$15=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 31]\n _fun___objc_retain(n$15:class NSString *) [line 31]\n *&__assert_file__:class NSString *=n$15 [line 31]\n REMOVE_TEMPS(n$15); [line 31]\n " shape="box"] 72 [label="72: DeclStmt \n n$13=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 31]\n _fun___objc_retain(n$13:class NSString *) [line 31]\n *&__assert_file__:class NSString *=n$13 [line 31]\n REMOVE_TEMPS(n$13); [line 31]\n " shape="box"]
84 -> 79 ; 72 -> 67 ;
84 -> 80 ; 72 -> 68 ;
83 [label="83: BinaryOperatorStmt: Assign \n n$13=*&SIL_temp_conditional___78:class NSString * [line 31]\n NULLIFY(&SIL_temp_conditional___78,true); [line 31]\n _fun___objc_retain(n$13:class NSString *) [line 31]\n n$14=*&__assert_file__:class NSString * [line 31]\n *&__assert_file__:class NSString *=n$13 [line 31]\n _fun___objc_release(n$14:class NSString *) [line 31]\n REMOVE_TEMPS(n$13,n$14); [line 31]\n NULLIFY(&__assert_file__,false); [line 31]\n " shape="box"] 71 [label="71: BinaryOperatorStmt: Assign \n n$11=*&SIL_temp_conditional___66:class NSString * [line 31]\n NULLIFY(&SIL_temp_conditional___66,true); [line 31]\n _fun___objc_retain(n$11:class NSString *) [line 31]\n n$12=*&__assert_file__:class NSString * [line 31]\n *&__assert_file__:class NSString *=n$11 [line 31]\n _fun___objc_release(n$12:class NSString *) [line 31]\n REMOVE_TEMPS(n$11,n$12); [line 31]\n NULLIFY(&__assert_file__,false); [line 31]\n " shape="box"]
83 -> 77 ; 71 -> 65 ;
82 [label="82: Message Call: stringWithUTF8String: \n n$12=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___78); [line 31]\n *&SIL_temp_conditional___78:class NSString *=n$12 [line 31]\n REMOVE_TEMPS(n$12); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 70 [label="70: Message Call: stringWithUTF8String: \n n$10=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___66); [line 31]\n *&SIL_temp_conditional___66:class NSString *=n$10 [line 31]\n REMOVE_TEMPS(n$10); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
82 -> 78 ; 70 -> 66 ;
81 [label="81: ConditinalStmt Branch \n n$11=*&__assert_file__:class NSString * [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___78); [line 31]\n *&SIL_temp_conditional___78:class NSString *=n$11 [line 31]\n REMOVE_TEMPS(n$11); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 69 [label="69: ConditinalStmt Branch \n n$9=*&__assert_file__:class NSString * [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___66); [line 31]\n *&SIL_temp_conditional___66:class NSString *=n$9 [line 31]\n REMOVE_TEMPS(n$9); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
81 -> 78 ; 69 -> 66 ;
80 [label="80: Prune (false branch) \n n$10=*&__assert_file__:class NSString * [line 31]\n PRUNE((n$10 == 0), false); [line 31]\n REMOVE_TEMPS(n$10); [line 31]\n " shape="invhouse"] 68 [label="68: Prune (false branch) \n n$8=*&__assert_file__:class NSString * [line 31]\n PRUNE((n$8 == 0), false); [line 31]\n REMOVE_TEMPS(n$8); [line 31]\n " shape="invhouse"]
80 -> 82 ; 68 -> 70 ;
79 [label="79: Prune (true branch) \n n$10=*&__assert_file__:class NSString * [line 31]\n PRUNE((n$10 != 0), true); [line 31]\n REMOVE_TEMPS(n$10); [line 31]\n " shape="invhouse"] 67 [label="67: Prune (true branch) \n n$8=*&__assert_file__:class NSString * [line 31]\n PRUNE((n$8 != 0), true); [line 31]\n REMOVE_TEMPS(n$8); [line 31]\n " shape="invhouse"]
79 -> 81 ; 67 -> 69 ;
78 [label="78: + \n " ] 66 [label="66: + \n " ]
78 -> 83 ; 66 -> 71 ;
77 [label="77: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"] 65 [label="65: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
77 -> 60 ; 65 -> 51 ;
76 [label="76: Prune (false branch) \n n$5=*&SIL_temp_conditional___69:int [line 33]\n NULLIFY(&SIL_temp_conditional___69,true); [line 33]\n PRUNE((n$5 == 0), false); [line 33]\n REMOVE_TEMPS(n$5); [line 33]\n " shape="invhouse"] 64 [label="64: Prune (false branch) \n n$3=*&SIL_temp_conditional___57:int [line 33]\n NULLIFY(&SIL_temp_conditional___57,true); [line 33]\n PRUNE((n$3 == 0), false); [line 33]\n REMOVE_TEMPS(n$3); [line 33]\n " shape="invhouse"]
76 -> 68 ; 64 -> 56 ;
75 [label="75: Prune (true branch) \n n$5=*&SIL_temp_conditional___69:int [line 33]\n NULLIFY(&SIL_temp_conditional___69,true); [line 33]\n PRUNE((n$5 != 0), true); [line 33]\n REMOVE_TEMPS(n$5); [line 33]\n NULLIFY(&target,false); [line 33]\n " shape="invhouse"] 63 [label="63: Prune (true branch) \n n$3=*&SIL_temp_conditional___57:int [line 33]\n NULLIFY(&SIL_temp_conditional___57,true); [line 33]\n PRUNE((n$3 != 0), true); [line 33]\n REMOVE_TEMPS(n$3); [line 33]\n NULLIFY(&target,false); [line 33]\n " shape="invhouse"]
75 -> 91 ; 63 -> 79 ;
74 [label="74: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___69); [line 33]\n *&SIL_temp_conditional___69:int =1 [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"] 62 [label="62: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___57); [line 33]\n *&SIL_temp_conditional___57:int =1 [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
74 -> 69 ; 62 -> 57 ;
73 [label="73: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___69); [line 33]\n *&SIL_temp_conditional___69:int =0 [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"] 61 [label="61: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___57); [line 33]\n *&SIL_temp_conditional___57:int =0 [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
73 -> 69 ; 61 -> 57 ;
72 [label="72: Prune (false branch) \n PRUNE(((n$4 != (void *)0) == 0), false); [line 31]\n REMOVE_TEMPS(n$4); [line 31]\n " shape="invhouse"] 60 [label="60: Prune (false branch) \n PRUNE(((n$2 != (void *)0) == 0), false); [line 31]\n REMOVE_TEMPS(n$2); [line 31]\n " shape="invhouse"]
72 -> 74 ; 60 -> 62 ;
71 [label="71: Prune (true branch) \n PRUNE(((n$4 != (void *)0) != 0), true); [line 31]\n REMOVE_TEMPS(n$4); [line 31]\n " shape="invhouse"] 59 [label="59: Prune (true branch) \n PRUNE(((n$2 != (void *)0) != 0), true); [line 31]\n REMOVE_TEMPS(n$2); [line 31]\n " shape="invhouse"]
71 -> 73 ; 59 -> 61 ;
70 [label="70: BinaryOperatorStmt: NE \n n$4=*&target:class A * [line 31]\n " shape="box"] 58 [label="58: BinaryOperatorStmt: NE \n n$2=*&target:class A * [line 31]\n " shape="box"]
70 -> 71 ; 58 -> 59 ;
70 -> 72 ; 58 -> 60 ;
69 [label="69: + \n " ] 57 [label="57: + \n " ]
69 -> 75 ; 57 -> 63 ;
69 -> 76 ; 57 -> 64 ;
68 [label="68: + \n " ] 56 [label="56: + \n " ]
68 -> 66 ; 56 -> 54 ;
68 -> 67 ; 56 -> 55 ;
67 [label="67: Prune (false branch) \n PRUNE((0 == 0), false); [line 31]\n " shape="invhouse"] 55 [label="55: Prune (false branch) \n PRUNE((0 == 0), false); [line 31]\n " shape="invhouse"]
67 -> 64 ; 55 -> 52 ;
66 [label="66: Prune (true branch) \n PRUNE((0 != 0), true); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="invhouse"] 54 [label="54: Prune (true branch) \n PRUNE((0 != 0), true); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="invhouse"]
66 -> 65 ; 54 -> 53 ;
65 [label="65: + \n " ] 53 [label="53: + \n " ]
65 -> 70 ; 53 -> 58 ;
64 [label="64: Return Stmt \n n$0=*&target:class A * [line 32]\n n$3=_fun_A_x(n$0:class A *) virtual [line 32]\n *&return:int =n$3 [line 32]\n REMOVE_TEMPS(n$0,n$3); [line 32]\n NULLIFY(&target,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"] 52 [label="52: Return Stmt \n n$0=*&target:class A * [line 32]\n n$1=_fun_A_x(n$0:class A *) [line 32]\n *&return:int =n$1 [line 32]\n REMOVE_TEMPS(n$0,n$1); [line 32]\n NULLIFY(&target,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"]
64 -> 60 ; 52 -> 51 ;
60 [label="60: Exit test1 \n " color=yellow style=filled] 51 [label="51: Exit test1 \n " color=yellow style=filled]
59 [label="59: Start test1\nFormals: target:class A *\nLocals: __assert_file__:class NSString * __assert_fn__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__,&__assert_fn__); [line 30]\n NULLIFY(&__assert_file__,false); [line 30]\n NULLIFY(&__assert_fn__,false); [line 30]\n " color=yellow style=filled] 50 [label="50: Start test1\nFormals: target:class A *\nLocals: __assert_file__:class NSString * __assert_fn__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__,&__assert_fn__); [line 30]\n NULLIFY(&__assert_file__,false); [line 30]\n NULLIFY(&__assert_fn__,false); [line 30]\n " color=yellow style=filled]
59 -> 65 ; 50 -> 53 ;
58 [label="58: BinaryOperatorStmt: Assign \n n$36=*&self:class A * [line 13]\n n$37=*&x:int [line 13]\n *n$36._x:int =n$37 [line 13]\n REMOVE_TEMPS(n$36,n$37); [line 13]\n NULLIFY(&self,false); [line 13]\n NULLIFY(&x,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"] 49 [label="49: BinaryOperatorStmt: Assign \n n$30=*&self:class A * [line 13]\n n$31=*&x:int [line 13]\n *n$30._x:int =n$31 [line 13]\n REMOVE_TEMPS(n$30,n$31); [line 13]\n NULLIFY(&self,false); [line 13]\n NULLIFY(&x,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"]
58 -> 57 ; 49 -> 48 ;
57 [label="57: Exit A_setX: \n " color=yellow style=filled] 48 [label="48: Exit A_setX: \n " color=yellow style=filled]
56 [label="56: Start A_setX: (generated)\nFormals: self:class A * x:int \nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled] 47 [label="47: Start A_setX: (generated)\nFormals: self:class A * x:int \nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled]
56 -> 58 ; 47 -> 49 ;
52 [label="52: DeclStmt \n n$33=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 24]\n _fun___objc_retain(n$33:class NSString *) [line 24]\n *&__assert_file__:class NSString *=n$33 [line 24]\n REMOVE_TEMPS(n$33); [line 24]\n " shape="box"] 46 [label="46: DeclStmt \n n$29=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 24]\n _fun___objc_retain(n$29:class NSString *) [line 24]\n *&__assert_file__:class NSString *=n$29 [line 24]\n REMOVE_TEMPS(n$29); [line 24]\n " shape="box"]
52 -> 47 ; 46 -> 41 ;
52 -> 48 ; 46 -> 42 ;
51 [label="51: BinaryOperatorStmt: Assign \n n$31=*&SIL_temp_conditional___46:class NSString * [line 24]\n NULLIFY(&SIL_temp_conditional___46,true); [line 24]\n _fun___objc_retain(n$31:class NSString *) [line 24]\n n$32=*&__assert_file__:class NSString * [line 24]\n *&__assert_file__:class NSString *=n$31 [line 24]\n _fun___objc_release(n$32:class NSString *) [line 24]\n REMOVE_TEMPS(n$31,n$32); [line 24]\n NULLIFY(&__assert_file__,false); [line 24]\n " shape="box"] 45 [label="45: BinaryOperatorStmt: Assign \n n$27=*&SIL_temp_conditional___40:class NSString * [line 24]\n NULLIFY(&SIL_temp_conditional___40,true); [line 24]\n _fun___objc_retain(n$27:class NSString *) [line 24]\n n$28=*&__assert_file__:class NSString * [line 24]\n *&__assert_file__:class NSString *=n$27 [line 24]\n _fun___objc_release(n$28:class NSString *) [line 24]\n REMOVE_TEMPS(n$27,n$28); [line 24]\n NULLIFY(&__assert_file__,false); [line 24]\n " shape="box"]
51 -> 45 ; 45 -> 39 ;
50 [label="50: Message Call: stringWithUTF8String: \n n$30=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 24]\n DECLARE_LOCALS(&SIL_temp_conditional___46); [line 24]\n *&SIL_temp_conditional___46:class NSString *=n$30 [line 24]\n REMOVE_TEMPS(n$30); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"] 44 [label="44: Message Call: stringWithUTF8String: \n n$26=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 24]\n DECLARE_LOCALS(&SIL_temp_conditional___40); [line 24]\n *&SIL_temp_conditional___40:class NSString *=n$26 [line 24]\n REMOVE_TEMPS(n$26); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"]
50 -> 46 ; 44 -> 40 ;
49 [label="49: ConditinalStmt Branch \n n$29=*&__assert_file__:class NSString * [line 24]\n DECLARE_LOCALS(&SIL_temp_conditional___46); [line 24]\n *&SIL_temp_conditional___46:class NSString *=n$29 [line 24]\n REMOVE_TEMPS(n$29); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"] 43 [label="43: ConditinalStmt Branch \n n$25=*&__assert_file__:class NSString * [line 24]\n DECLARE_LOCALS(&SIL_temp_conditional___40); [line 24]\n *&SIL_temp_conditional___40:class NSString *=n$25 [line 24]\n REMOVE_TEMPS(n$25); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"]
49 -> 46 ; 43 -> 40 ;
48 [label="48: Prune (false branch) \n n$28=*&__assert_file__:class NSString * [line 24]\n PRUNE((n$28 == 0), false); [line 24]\n REMOVE_TEMPS(n$28); [line 24]\n " shape="invhouse"] 42 [label="42: Prune (false branch) \n n$24=*&__assert_file__:class NSString * [line 24]\n PRUNE((n$24 == 0), false); [line 24]\n REMOVE_TEMPS(n$24); [line 24]\n " shape="invhouse"]
48 -> 50 ; 42 -> 44 ;
47 [label="47: Prune (true branch) \n n$28=*&__assert_file__:class NSString * [line 24]\n PRUNE((n$28 != 0), true); [line 24]\n REMOVE_TEMPS(n$28); [line 24]\n " shape="invhouse"] 41 [label="41: Prune (true branch) \n n$24=*&__assert_file__:class NSString * [line 24]\n PRUNE((n$24 != 0), true); [line 24]\n REMOVE_TEMPS(n$24); [line 24]\n " shape="invhouse"]
47 -> 49 ; 41 -> 43 ;
46 [label="46: + \n " ] 40 [label="40: + \n " ]
46 -> 51 ; 40 -> 45 ;
45 [label="45: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"] 39 [label="39: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"]
45 -> 28 ; 39 -> 25 ;
44 [label="44: Prune (false branch) \n n$22=*&SIL_temp_conditional___37:int [line 26]\n NULLIFY(&SIL_temp_conditional___37,true); [line 26]\n PRUNE((n$22 == 0), false); [line 26]\n REMOVE_TEMPS(n$22); [line 26]\n " shape="invhouse"] 38 [label="38: Prune (false branch) \n n$18=*&SIL_temp_conditional___31:int [line 26]\n NULLIFY(&SIL_temp_conditional___31,true); [line 26]\n PRUNE((n$18 == 0), false); [line 26]\n REMOVE_TEMPS(n$18); [line 26]\n " shape="invhouse"]
44 -> 36 ; 38 -> 30 ;
43 [label="43: Prune (true branch) \n n$22=*&SIL_temp_conditional___37:int [line 26]\n NULLIFY(&SIL_temp_conditional___37,true); [line 26]\n PRUNE((n$22 != 0), true); [line 26]\n REMOVE_TEMPS(n$22); [line 26]\n NULLIFY(&a,false); [line 26]\n " shape="invhouse"] 37 [label="37: Prune (true branch) \n n$18=*&SIL_temp_conditional___31:int [line 26]\n NULLIFY(&SIL_temp_conditional___31,true); [line 26]\n PRUNE((n$18 != 0), true); [line 26]\n REMOVE_TEMPS(n$18); [line 26]\n NULLIFY(&a,false); [line 26]\n " shape="invhouse"]
43 -> 52 ; 37 -> 46 ;
42 [label="42: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___37); [line 26]\n *&SIL_temp_conditional___37:int =1 [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"] 36 [label="36: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___31); [line 26]\n *&SIL_temp_conditional___31:int =1 [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
42 -> 37 ; 36 -> 31 ;
41 [label="41: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___37); [line 26]\n *&SIL_temp_conditional___37:int =0 [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"] 35 [label="35: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___31); [line 26]\n *&SIL_temp_conditional___31:int =0 [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
41 -> 37 ; 35 -> 31 ;
40 [label="40: Prune (false branch) \n PRUNE(((n$21 != (void *)0) == 0), false); [line 24]\n REMOVE_TEMPS(n$21); [line 24]\n " shape="invhouse"] 34 [label="34: Prune (false branch) \n PRUNE(((n$17 != (void *)0) == 0), false); [line 24]\n REMOVE_TEMPS(n$17); [line 24]\n " shape="invhouse"]
40 -> 42 ; 34 -> 36 ;
39 [label="39: Prune (true branch) \n PRUNE(((n$21 != (void *)0) != 0), true); [line 24]\n REMOVE_TEMPS(n$21); [line 24]\n " shape="invhouse"] 33 [label="33: Prune (true branch) \n PRUNE(((n$17 != (void *)0) != 0), true); [line 24]\n REMOVE_TEMPS(n$17); [line 24]\n " shape="invhouse"]
39 -> 41 ; 33 -> 35 ;
38 [label="38: BinaryOperatorStmt: NE \n n$21=*&a:class A * [line 24]\n " shape="box"] 32 [label="32: BinaryOperatorStmt: NE \n n$17=*&a:class A * [line 24]\n " shape="box"]
38 -> 39 ; 32 -> 33 ;
38 -> 40 ; 32 -> 34 ;
37 [label="37: + \n " ] 31 [label="31: + \n " ]
37 -> 43 ; 31 -> 37 ;
37 -> 44 ; 31 -> 38 ;
36 [label="36: + \n " ] 30 [label="30: + \n " ]
36 -> 34 ; 30 -> 28 ;
36 -> 35 ; 30 -> 29 ;
35 [label="35: Prune (false branch) \n PRUNE((0 == 0), false); [line 24]\n " shape="invhouse"] 29 [label="29: Prune (false branch) \n PRUNE((0 == 0), false); [line 24]\n " shape="invhouse"]
35 -> 32 ; 29 -> 26 ;
34 [label="34: Prune (true branch) \n PRUNE((0 != 0), true); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="invhouse"] 28 [label="28: Prune (true branch) \n PRUNE((0 != 0), true); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="invhouse"]
34 -> 33 ; 28 -> 27 ;
33 [label="33: + \n " ] 27 [label="27: + \n " ]
33 -> 38 ; 27 -> 32 ;
32 [label="32: Return Stmt \n n$17=*&a:class A * [line 25]\n n$20=_fun_A_x(n$17:class A *) virtual [line 25]\n *&return:int =n$20 [line 25]\n REMOVE_TEMPS(n$17,n$20); [line 25]\n NULLIFY(&a,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"] 26 [label="26: Return Stmt \n n$15=*&a:class A * [line 25]\n n$16=_fun_A_x(n$15:class A *) [line 25]\n *&return:int =n$16 [line 25]\n REMOVE_TEMPS(n$15,n$16); [line 25]\n NULLIFY(&a,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
32 -> 28 ; 26 -> 25 ;
28 [label="28: Exit A_initWithRequest: \n " color=yellow style=filled] 25 [label="25: Exit A_initWithRequest: \n " color=yellow style=filled]
27 [label="27: Start A_initWithRequest:\nFormals: self:class A * a:class A *\nLocals: __assert_file__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__); [line 23]\n NULLIFY(&__assert_file__,false); [line 23]\n NULLIFY(&self,false); [line 23]\n " color=yellow style=filled] 24 [label="24: Start A_initWithRequest:\nFormals: self:class A * a:class A *\nLocals: __assert_file__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__); [line 23]\n NULLIFY(&__assert_file__,false); [line 23]\n NULLIFY(&self,false); [line 23]\n " color=yellow style=filled]
27 -> 33 ; 24 -> 27 ;
26 [label="26: DeclStmt \n n$16=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 19]\n _fun___objc_retain(n$16:class NSString *) [line 19]\n *&__assert_file__:class NSString *=n$16 [line 19]\n REMOVE_TEMPS(n$16); [line 19]\n " shape="box"] 23 [label="23: DeclStmt \n n$14=_fun_NSString_stringWithUTF8String:(\"infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.m\":char *) [line 19]\n _fun___objc_retain(n$14:class NSString *) [line 19]\n *&__assert_file__:class NSString *=n$14 [line 19]\n REMOVE_TEMPS(n$14); [line 19]\n " shape="box"]
26 -> 21 ; 23 -> 18 ;
26 -> 22 ; 23 -> 19 ;
25 [label="25: BinaryOperatorStmt: Assign \n n$14=*&SIL_temp_conditional___20:class NSString * [line 19]\n NULLIFY(&SIL_temp_conditional___20,true); [line 19]\n _fun___objc_retain(n$14:class NSString *) [line 19]\n n$15=*&__assert_file__:class NSString * [line 19]\n *&__assert_file__:class NSString *=n$14 [line 19]\n _fun___objc_release(n$15:class NSString *) [line 19]\n REMOVE_TEMPS(n$14,n$15); [line 19]\n NULLIFY(&__assert_file__,false); [line 19]\n " shape="box"] 22 [label="22: BinaryOperatorStmt: Assign \n n$12=*&SIL_temp_conditional___17:class NSString * [line 19]\n NULLIFY(&SIL_temp_conditional___17,true); [line 19]\n _fun___objc_retain(n$12:class NSString *) [line 19]\n n$13=*&__assert_file__:class NSString * [line 19]\n *&__assert_file__:class NSString *=n$12 [line 19]\n _fun___objc_release(n$13:class NSString *) [line 19]\n REMOVE_TEMPS(n$12,n$13); [line 19]\n NULLIFY(&__assert_file__,false); [line 19]\n " shape="box"]
25 -> 19 ; 22 -> 16 ;
24 [label="24: Message Call: stringWithUTF8String: \n n$13=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 19]\n DECLARE_LOCALS(&SIL_temp_conditional___20); [line 19]\n *&SIL_temp_conditional___20:class NSString *=n$13 [line 19]\n REMOVE_TEMPS(n$13); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"] 21 [label="21: Message Call: stringWithUTF8String: \n n$11=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 19]\n DECLARE_LOCALS(&SIL_temp_conditional___17); [line 19]\n *&SIL_temp_conditional___17:class NSString *=n$11 [line 19]\n REMOVE_TEMPS(n$11); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"]
24 -> 20 ; 21 -> 17 ;
23 [label="23: ConditinalStmt Branch \n n$12=*&__assert_file__:class NSString * [line 19]\n DECLARE_LOCALS(&SIL_temp_conditional___20); [line 19]\n *&SIL_temp_conditional___20:class NSString *=n$12 [line 19]\n REMOVE_TEMPS(n$12); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"] 20 [label="20: ConditinalStmt Branch \n n$10=*&__assert_file__:class NSString * [line 19]\n DECLARE_LOCALS(&SIL_temp_conditional___17); [line 19]\n *&SIL_temp_conditional___17:class NSString *=n$10 [line 19]\n REMOVE_TEMPS(n$10); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"]
23 -> 20 ; 20 -> 17 ;
22 [label="22: Prune (false branch) \n n$11=*&__assert_file__:class NSString * [line 19]\n PRUNE((n$11 == 0), false); [line 19]\n REMOVE_TEMPS(n$11); [line 19]\n " shape="invhouse"] 19 [label="19: Prune (false branch) \n n$9=*&__assert_file__:class NSString * [line 19]\n PRUNE((n$9 == 0), false); [line 19]\n REMOVE_TEMPS(n$9); [line 19]\n " shape="invhouse"]
22 -> 24 ; 19 -> 21 ;
21 [label="21: Prune (true branch) \n n$11=*&__assert_file__:class NSString * [line 19]\n PRUNE((n$11 != 0), true); [line 19]\n REMOVE_TEMPS(n$11); [line 19]\n " shape="invhouse"] 18 [label="18: Prune (true branch) \n n$9=*&__assert_file__:class NSString * [line 19]\n PRUNE((n$9 != 0), true); [line 19]\n REMOVE_TEMPS(n$9); [line 19]\n " shape="invhouse"]
21 -> 23 ; 18 -> 20 ;
20 [label="20: + \n " ] 17 [label="17: + \n " ]
20 -> 25 ; 17 -> 22 ;
19 [label="19: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"] 16 [label="16: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"]
19 -> 2 ; 16 -> 2 ;
18 [label="18: Prune (false branch) \n n$5=*&SIL_temp_conditional___11:int [line 21]\n NULLIFY(&SIL_temp_conditional___11,true); [line 21]\n PRUNE((n$5 == 0), false); [line 21]\n REMOVE_TEMPS(n$5); [line 21]\n " shape="invhouse"] 15 [label="15: Prune (false branch) \n n$3=*&SIL_temp_conditional___8:int [line 21]\n NULLIFY(&SIL_temp_conditional___8,true); [line 21]\n PRUNE((n$3 == 0), false); [line 21]\n REMOVE_TEMPS(n$3); [line 21]\n " shape="invhouse"]
18 -> 10 ; 15 -> 7 ;
17 [label="17: Prune (true branch) \n n$5=*&SIL_temp_conditional___11:int [line 21]\n NULLIFY(&SIL_temp_conditional___11,true); [line 21]\n PRUNE((n$5 != 0), true); [line 21]\n REMOVE_TEMPS(n$5); [line 21]\n NULLIFY(&target,false); [line 21]\n " shape="invhouse"] 14 [label="14: Prune (true branch) \n n$3=*&SIL_temp_conditional___8:int [line 21]\n NULLIFY(&SIL_temp_conditional___8,true); [line 21]\n PRUNE((n$3 != 0), true); [line 21]\n REMOVE_TEMPS(n$3); [line 21]\n NULLIFY(&target,false); [line 21]\n " shape="invhouse"]
17 -> 26 ; 14 -> 23 ;
16 [label="16: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___11); [line 21]\n *&SIL_temp_conditional___11:int =1 [line 21]\n APPLY_ABSTRACTION; [line 21]\n " shape="box"] 13 [label="13: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___8); [line 21]\n *&SIL_temp_conditional___8:int =1 [line 21]\n APPLY_ABSTRACTION; [line 21]\n " shape="box"]
16 -> 11 ; 13 -> 8 ;
15 [label="15: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___11); [line 21]\n *&SIL_temp_conditional___11:int =0 [line 21]\n APPLY_ABSTRACTION; [line 21]\n " shape="box"] 12 [label="12: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___8); [line 21]\n *&SIL_temp_conditional___8:int =0 [line 21]\n APPLY_ABSTRACTION; [line 21]\n " shape="box"]
15 -> 11 ; 12 -> 8 ;
14 [label="14: Prune (false branch) \n PRUNE(((n$4 != (void *)0) == 0), false); [line 19]\n REMOVE_TEMPS(n$4); [line 19]\n " shape="invhouse"] 11 [label="11: Prune (false branch) \n PRUNE(((n$2 != (void *)0) == 0), false); [line 19]\n REMOVE_TEMPS(n$2); [line 19]\n " shape="invhouse"]
14 -> 16 ; 11 -> 13 ;
13 [label="13: Prune (true branch) \n PRUNE(((n$4 != (void *)0) != 0), true); [line 19]\n REMOVE_TEMPS(n$4); [line 19]\n " shape="invhouse"] 10 [label="10: Prune (true branch) \n PRUNE(((n$2 != (void *)0) != 0), true); [line 19]\n REMOVE_TEMPS(n$2); [line 19]\n " shape="invhouse"]
13 -> 15 ; 10 -> 12 ;
12 [label="12: BinaryOperatorStmt: NE \n n$4=*&target:class A * [line 19]\n " shape="box"] 9 [label="9: BinaryOperatorStmt: NE \n n$2=*&target:class A * [line 19]\n " shape="box"]
12 -> 13 ; 9 -> 10 ;
12 -> 14 ; 9 -> 11 ;
11 [label="11: + \n " ] 8 [label="8: + \n " ]
11 -> 17 ; 8 -> 14 ;
11 -> 18 ; 8 -> 15 ;
10 [label="10: + \n " ] 7 [label="7: + \n " ]
10 -> 8 ; 7 -> 5 ;
10 -> 9 ; 7 -> 6 ;
9 [label="9: Prune (false branch) \n PRUNE((0 == 0), false); [line 19]\n " shape="invhouse"] 6 [label="6: Prune (false branch) \n PRUNE((0 == 0), false); [line 19]\n " shape="invhouse"]
9 -> 6 ; 6 -> 3 ;
8 [label="8: Prune (true branch) \n PRUNE((0 != 0), true); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="invhouse"] 5 [label="5: Prune (true branch) \n PRUNE((0 != 0), true); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="invhouse"]
8 -> 7 ; 5 -> 4 ;
7 [label="7: + \n " ] 4 [label="4: + \n " ]
7 -> 12 ; 4 -> 9 ;
6 [label="6: Return Stmt \n n$0=*&target:class A * [line 20]\n n$3=_fun_A_x(n$0:class A *) virtual [line 20]\n *&return:int =n$3 [line 20]\n REMOVE_TEMPS(n$0,n$3); [line 20]\n NULLIFY(&target,false); [line 20]\n APPLY_ABSTRACTION; [line 20]\n " shape="box"] 3 [label="3: Return Stmt \n n$0=*&target:class A * [line 20]\n n$1=_fun_A_x(n$0:class A *) [line 20]\n *&return:int =n$1 [line 20]\n REMOVE_TEMPS(n$0,n$1); [line 20]\n NULLIFY(&target,false); [line 20]\n APPLY_ABSTRACTION; [line 20]\n " shape="box"]
6 -> 2 ; 3 -> 2 ;
2 [label="2: Exit A_addTarget: \n " color=yellow style=filled] 2 [label="2: Exit A_addTarget: \n " color=yellow style=filled]
1 [label="1: Start A_addTarget:\nFormals: self:class A * target:class A *\nLocals: __assert_file__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__); [line 18]\n NULLIFY(&__assert_file__,false); [line 18]\n NULLIFY(&self,false); [line 18]\n " color=yellow style=filled] 1 [label="1: Start A_addTarget:\nFormals: self:class A * target:class A *\nLocals: __assert_file__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__); [line 18]\n NULLIFY(&__assert_file__,false); [line 18]\n NULLIFY(&self,false); [line 18]\n " color=yellow style=filled]
1 -> 7 ; 1 -> 4 ;
} }

@ -76,7 +76,7 @@ digraph iCFG {
34 -> 41 ; 34 -> 41 ;
33 [label="33: BinaryOperatorStmt: LT \n n$26=*&idx:unsigned long [line 46]\n n$27=*&objects:class NSArray * [line 46]\n n$28=_fun_NSArray_count(n$27:class NSArray *) virtual [line 46]\n " shape="box"] 33 [label="33: BinaryOperatorStmt: LT \n n$26=*&idx:unsigned long [line 46]\n n$27=*&objects:class NSArray * [line 46]\n n$28=_fun_NSArray_count(n$27:class NSArray *) [line 46]\n " shape="box"]
33 -> 34 ; 33 -> 34 ;

@ -1,63 +1,52 @@
digraph iCFG { digraph iCFG {
32 [label="32: DeclStmt \n n$3=_fun_A_sharedInstance() [line 45]\n *&b:class A *=n$3 [line 45]\n REMOVE_TEMPS(n$3); [line 45]\n " shape="box"] 29 [label="29: DeclStmt \n n$3=_fun_A_sharedInstance() [line 45]\n *&b:class A *=n$3 [line 45]\n REMOVE_TEMPS(n$3); [line 45]\n " shape="box"]
32 -> 31 ; 29 -> 28 ;
31 [label="31: DeclStmt \n *&p:int *=0 [line 46]\n " shape="box"] 28 [label="28: DeclStmt \n *&p:int *=0 [line 46]\n " shape="box"]
31 -> 26 ; 28 -> 23 ;
30 [label="30: Return Stmt \n NULLIFY(&p,false); [line 48]\n *&return:int =0 [line 48]\n APPLY_ABSTRACTION; [line 48]\n " shape="box"] 27 [label="27: Return Stmt \n NULLIFY(&p,false); [line 48]\n *&return:int =0 [line 48]\n APPLY_ABSTRACTION; [line 48]\n " shape="box"]
30 -> 24 ; 27 -> 21 ;
29 [label="29: Return Stmt \n n$1=*&p:int * [line 47]\n n$2=*n$1:int [line 47]\n *&return:int =n$2 [line 47]\n REMOVE_TEMPS(n$1,n$2); [line 47]\n NULLIFY(&p,false); [line 47]\n APPLY_ABSTRACTION; [line 47]\n " shape="box"] 26 [label="26: Return Stmt \n n$1=*&p:int * [line 47]\n n$2=*n$1:int [line 47]\n *&return:int =n$2 [line 47]\n REMOVE_TEMPS(n$1,n$2); [line 47]\n NULLIFY(&p,false); [line 47]\n APPLY_ABSTRACTION; [line 47]\n " shape="box"]
29 -> 24 ; 26 -> 21 ;
28 [label="28: Prune (false branch) \n PRUNE(((n$0 == 0) == 0), false); [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n " shape="invhouse"] 25 [label="25: Prune (false branch) \n PRUNE(((n$0 == 0) == 0), false); [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n " shape="invhouse"]
28 -> 30 ; 25 -> 27 ;
27 [label="27: Prune (true branch) \n PRUNE(((n$0 == 0) != 0), true); [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n " shape="invhouse"] 24 [label="24: Prune (true branch) \n PRUNE(((n$0 == 0) != 0), true); [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n " shape="invhouse"]
27 -> 29 ; 24 -> 26 ;
26 [label="26: BinaryOperatorStmt: EQ \n n$0=*&b:class A * [line 47]\n NULLIFY(&b,false); [line 47]\n " shape="box"] 23 [label="23: BinaryOperatorStmt: EQ \n n$0=*&b:class A * [line 47]\n NULLIFY(&b,false); [line 47]\n " shape="box"]
26 -> 27 ; 23 -> 24 ;
26 -> 28 ; 23 -> 25 ;
25 [label="25: + \n NULLIFY(&b,false); [line 47]\n NULLIFY(&p,false); [line 47]\n " ] 22 [label="22: + \n NULLIFY(&b,false); [line 47]\n NULLIFY(&p,false); [line 47]\n " ]
25 -> 24 ;
24 [label="24: Exit main \n " color=yellow style=filled]
23 [label="23: Start main\nFormals: \nLocals: p:int * b:class A * \n DECLARE_LOCALS(&return,&p,&b); [line 44]\n NULLIFY(&b,false); [line 44]\n NULLIFY(&p,false); [line 44]\n " color=yellow style=filled]
23 -> 32 ;
22 [label="22: BinaryOperatorStmt: Assign \n n$15=*&self:class A * [line 14]\n n$16=*&x:int [line 14]\n *n$15._x:int =n$16 [line 14]\n REMOVE_TEMPS(n$15,n$16); [line 14]\n NULLIFY(&self,false); [line 14]\n NULLIFY(&x,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"]
22 -> 21 ; 22 -> 21 ;
21 [label="21: Exit A_setX: \n " color=yellow style=filled] 21 [label="21: Exit main \n " color=yellow style=filled]
20 [label="20: Start A_setX: (generated)\nFormals: self:class A * x:int \nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled] 20 [label="20: Start main\nFormals: \nLocals: p:int * b:class A * \n DECLARE_LOCALS(&return,&p,&b); [line 44]\n NULLIFY(&b,false); [line 44]\n NULLIFY(&p,false); [line 44]\n " color=yellow style=filled]
20 -> 22 ; 20 -> 29 ;
19 [label="19: Return Stmt \n n$13=*&self:class A * [line 14]\n n$14=*n$13._x:int [line 14]\n *&return:int =n$14 [line 14]\n REMOVE_TEMPS(n$13,n$14); [line 14]\n NULLIFY(&self,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"] 19 [label="19: BinaryOperatorStmt: Assign \n n$13=*&self:class A * [line 14]\n n$14=*&x:int [line 14]\n *n$13._x:int =n$14 [line 14]\n REMOVE_TEMPS(n$13,n$14); [line 14]\n NULLIFY(&self,false); [line 14]\n NULLIFY(&x,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"]
19 -> 18 ; 19 -> 18 ;
18 [label="18: Exit A_x \n " color=yellow style=filled] 18 [label="18: Exit A_setX: \n " color=yellow style=filled]
17 [label="17: Start A_x (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled] 17 [label="17: Start A_setX: (generated)\nFormals: self:class A * x:int \nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled]
17 -> 19 ; 17 -> 19 ;

@ -1,98 +1,65 @@
digraph iCFG { digraph iCFG {
39 [label="39: DeclStmt \n n$5=_fun___objc_alloc_no_fail(sizeof(class A ):unsigned long ) [line 39]\n n$6=_fun_NSObject_init(n$5:class A *) virtual [line 39]\n *&a:class A *=n$6 [line 39]\n REMOVE_TEMPS(n$5,n$6); [line 39]\n " shape="box"] 30 [label="30: DeclStmt \n n$5=_fun___objc_alloc_no_fail(sizeof(class A ):unsigned long ) [line 39]\n n$6=_fun_NSObject_init(n$5:class A *) virtual [line 39]\n *&a:class A *=n$6 [line 39]\n REMOVE_TEMPS(n$5,n$6); [line 39]\n " shape="box"]
39 -> 38 ; 30 -> 29 ;
38 [label="38: Message Call: setLast_name: \n n$1=*&a:class A * [line 40]\n n$2=*&a2:class A * [line 40]\n _fun_A_setLast_name:(n$1:class A *,n$2:class A *) virtual [line 40]\n REMOVE_TEMPS(n$1,n$2); [line 40]\n NULLIFY(&a2,false); [line 40]\n " shape="box"] 29 [label="29: Message Call: setLast_name: \n n$1=*&a:class A * [line 40]\n n$2=*&a2:class A * [line 40]\n _fun_A_setLast_name:(n$1:class A *,n$2:class A *) virtual [line 40]\n REMOVE_TEMPS(n$1,n$2); [line 40]\n NULLIFY(&a2,false); [line 40]\n " shape="box"]
38 -> 34 ; 29 -> 25 ;
37 [label="37: BinaryOperatorStmt: Assign \n n$3=*&self:class A * [line 18]\n n$4=*&last_name:class A * [line 18]\n *n$3._last_name:class A *=n$4 [line 18]\n REMOVE_TEMPS(n$3,n$4); [line 18]\n NULLIFY(&last_name,false); [line 18]\n NULLIFY(&self,false); [line 18]\n APPLY_ABSTRACTION; [line 18]\n " shape="box"] 28 [label="28: BinaryOperatorStmt: Assign \n n$3=*&self:class A * [line 18]\n n$4=*&last_name:class A * [line 18]\n *n$3._last_name:class A *=n$4 [line 18]\n REMOVE_TEMPS(n$3,n$4); [line 18]\n NULLIFY(&last_name,false); [line 18]\n NULLIFY(&self,false); [line 18]\n APPLY_ABSTRACTION; [line 18]\n " shape="box"]
37 -> 36 ; 28 -> 27 ;
36 [label="36: Exit A_setLast_name: \n " color=yellow style=filled] 27 [label="27: Exit A_setLast_name: \n " color=yellow style=filled]
35 [label="35: Start A_setLast_name: (generated)\nFormals: self:class A * last_name:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 18]\n " color=yellow style=filled] 26 [label="26: Start A_setLast_name: (generated)\nFormals: self:class A * last_name:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 18]\n " color=yellow style=filled]
35 -> 37 ; 26 -> 28 ;
34 [label="34: Message Call: release \n n$0=*&a:class A * [line 41]\n _fun___objc_release(n$0:class A *) [line 41]\n REMOVE_TEMPS(n$0); [line 41]\n NULLIFY(&a,false); [line 41]\n " shape="box"] 25 [label="25: Message Call: release \n n$0=*&a:class A * [line 41]\n _fun___objc_release(n$0:class A *) [line 41]\n REMOVE_TEMPS(n$0); [line 41]\n NULLIFY(&a,false); [line 41]\n " shape="box"]
34 -> 33 ; 25 -> 24 ;
33 [label="33: Return Stmt \n *&return:int =0 [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"] 24 [label="24: Return Stmt \n *&return:int =0 [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"]
33 -> 32 ;
32 [label="32: Exit test \n " color=yellow style=filled]
31 [label="31: Start test\nFormals: a2:class A *\nLocals: a:class A * \n DECLARE_LOCALS(&return,&a); [line 38]\n NULLIFY(&a,false); [line 38]\n " color=yellow style=filled]
31 -> 39 ;
27 [label="27: Return Stmt \n n$27=*&self:class A * [line 18]\n n$28=*n$27._last_name:class A * [line 18]\n *&return:class A *=n$28 [line 18]\n REMOVE_TEMPS(n$27,n$28); [line 18]\n NULLIFY(&self,false); [line 18]\n APPLY_ABSTRACTION; [line 18]\n " shape="box"]
27 -> 26 ;
26 [label="26: Exit A_last_name \n " color=yellow style=filled]
25 [label="25: Start A_last_name (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 18]\n " color=yellow style=filled]
25 -> 27 ;
24 [label="24: Message Call: retain \n n$25=*&name:class A * [line 16]\n n$26=_fun___objc_retain(n$25:class A *) [line 16]\n REMOVE_TEMPS(n$25,n$26); [line 16]\n " shape="box"]
24 -> 23 ; 24 -> 23 ;
23 [label="23: Message Call: release \n n$22=*&self:class A * [line 16]\n n$23=*n$22._name:class A * [line 16]\n n$24=_fun___objc_release(n$23:class A *) [line 16]\n REMOVE_TEMPS(n$22,n$23,n$24); [line 16]\n " shape="box"] 23 [label="23: Exit test \n " color=yellow style=filled]
23 -> 22 ;
22 [label="22: BinaryOperatorStmt: Assign \n n$20=*&self:class A * [line 16]\n n$21=*&name:class A * [line 16]\n *n$20._name:class A *=n$21 [line 16]\n REMOVE_TEMPS(n$20,n$21); [line 16]\n NULLIFY(&name,false); [line 16]\n NULLIFY(&self,false); [line 16]\n APPLY_ABSTRACTION; [line 16]\n " shape="box"]
22 -> 21 ;
21 [label="21: Exit A_setName: \n " color=yellow style=filled]
20 [label="20: Start A_setName: (generated)\nFormals: self:class A * name:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 16]\n " color=yellow style=filled]
20 -> 24 ; 22 [label="22: Start test\nFormals: a2:class A *\nLocals: a:class A * \n DECLARE_LOCALS(&return,&a); [line 38]\n NULLIFY(&a,false); [line 38]\n " color=yellow style=filled]
19 [label="19: Return Stmt \n n$18=*&self:class A * [line 16]\n n$19=*n$18._name:class A * [line 16]\n *&return:class A *=n$19 [line 16]\n REMOVE_TEMPS(n$18,n$19); [line 16]\n NULLIFY(&self,false); [line 16]\n APPLY_ABSTRACTION; [line 16]\n " shape="box"]
19 -> 18 ; 22 -> 30 ;
18 [label="18: Exit A_name \n " color=yellow style=filled] 18 [label="18: Message Call: retain \n n$21=*&name:class A * [line 16]\n n$22=_fun___objc_retain(n$21:class A *) [line 16]\n REMOVE_TEMPS(n$21,n$22); [line 16]\n " shape="box"]
17 [label="17: Start A_name (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 16]\n " color=yellow style=filled] 18 -> 17 ;
17 [label="17: Message Call: release \n n$18=*&self:class A * [line 16]\n n$19=*n$18._name:class A * [line 16]\n n$20=_fun___objc_release(n$19:class A *) [line 16]\n REMOVE_TEMPS(n$18,n$19,n$20); [line 16]\n " shape="box"]
17 -> 19 ; 17 -> 16 ;
16 [label="16: BinaryOperatorStmt: Assign \n n$15=*&self:class A * [line 14]\n n$16=*&child:class A * [line 14]\n n$17=_fun_A_copy(n$16:class A *) virtual [line 14]\n *n$15._child:class A *=n$17 [line 14]\n REMOVE_TEMPS(n$15,n$16,n$17); [line 14]\n NULLIFY(&child,false); [line 14]\n NULLIFY(&self,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"] 16 [label="16: BinaryOperatorStmt: Assign \n n$16=*&self:class A * [line 16]\n n$17=*&name:class A * [line 16]\n *n$16._name:class A *=n$17 [line 16]\n REMOVE_TEMPS(n$16,n$17); [line 16]\n NULLIFY(&name,false); [line 16]\n NULLIFY(&self,false); [line 16]\n APPLY_ABSTRACTION; [line 16]\n " shape="box"]
16 -> 15 ; 16 -> 15 ;
15 [label="15: Exit A_setChild: \n " color=yellow style=filled] 15 [label="15: Exit A_setName: \n " color=yellow style=filled]
14 [label="14: Start A_setChild: (generated)\nFormals: self:class A * child:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled] 14 [label="14: Start A_setName: (generated)\nFormals: self:class A * name:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 16]\n " color=yellow style=filled]
14 -> 16 ; 14 -> 18 ;
13 [label="13: Return Stmt \n n$13=*&self:class A * [line 14]\n n$14=*n$13._child:class A * [line 14]\n *&return:class A *=n$14 [line 14]\n REMOVE_TEMPS(n$13,n$14); [line 14]\n NULLIFY(&self,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"] 13 [label="13: BinaryOperatorStmt: Assign \n n$13=*&self:class A * [line 14]\n n$14=*&child:class A * [line 14]\n n$15=_fun_A_copy(n$14:class A *) virtual [line 14]\n *n$13._child:class A *=n$15 [line 14]\n REMOVE_TEMPS(n$13,n$14,n$15); [line 14]\n NULLIFY(&child,false); [line 14]\n NULLIFY(&self,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"]
13 -> 12 ; 13 -> 12 ;
12 [label="12: Exit A_child \n " color=yellow style=filled] 12 [label="12: Exit A_setChild: \n " color=yellow style=filled]
11 [label="11: Start A_child (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled] 11 [label="11: Start A_setChild: (generated)\nFormals: self:class A * child:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled]
11 -> 13 ; 11 -> 13 ;

@ -1,23 +1,12 @@
digraph iCFG { digraph iCFG {
6 [label="6: BinaryOperatorStmt: Assign \n n$2=*&self:class ASDisplayNode * [line 14]\n n$3=*&opaque:_Bool [line 14]\n *n$2._opaque:_Bool =n$3 [line 14]\n REMOVE_TEMPS(n$2,n$3); [line 14]\n NULLIFY(&opaque,false); [line 14]\n NULLIFY(&self,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"] 3 [label="3: BinaryOperatorStmt: Assign \n n$0=*&self:class ASDisplayNode * [line 14]\n n$1=*&opaque:_Bool [line 14]\n *n$0._opaque:_Bool =n$1 [line 14]\n REMOVE_TEMPS(n$0,n$1); [line 14]\n NULLIFY(&opaque,false); [line 14]\n NULLIFY(&self,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"]
6 -> 5 ;
5 [label="5: Exit ASDisplayNode_setOpaque: \n " color=yellow style=filled]
4 [label="4: Start ASDisplayNode_setOpaque: (generated)\nFormals: self:class ASDisplayNode * opaque:_Bool \nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled]
4 -> 6 ;
3 [label="3: Return Stmt \n n$0=*&self:class ASDisplayNode * [line 14]\n n$1=*n$0._opaque:_Bool [line 14]\n *&return:_Bool =n$1 [line 14]\n REMOVE_TEMPS(n$0,n$1); [line 14]\n NULLIFY(&self,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"]
3 -> 2 ; 3 -> 2 ;
2 [label="2: Exit ASDisplayNode_isOpaque \n " color=yellow style=filled] 2 [label="2: Exit ASDisplayNode_setOpaque: \n " color=yellow style=filled]
1 [label="1: Start ASDisplayNode_isOpaque (generated)\nFormals: self:class ASDisplayNode *\nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled] 1 [label="1: Start ASDisplayNode_setOpaque: (generated)\nFormals: self:class ASDisplayNode * opaque:_Bool \nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled]
1 -> 3 ; 1 -> 3 ;

@ -1,35 +1,24 @@
digraph iCFG { digraph iCFG {
12 [label="12: BinaryOperatorStmt: Assign \n n$6=*&self:class A * [line 13]\n n$7=*&x:int [line 13]\n *n$6._x:int =n$7 [line 13]\n REMOVE_TEMPS(n$6,n$7); [line 13]\n NULLIFY(&self,false); [line 13]\n NULLIFY(&x,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"] 6 [label="6: BinaryOperatorStmt: Assign \n n$2=*&self:class A * [line 13]\n n$3=*&x:int [line 13]\n *n$2._x:int =n$3 [line 13]\n REMOVE_TEMPS(n$2,n$3); [line 13]\n NULLIFY(&self,false); [line 13]\n NULLIFY(&x,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"]
12 -> 11 ; 6 -> 5 ;
11 [label="11: Exit A_setX: \n " color=yellow style=filled] 5 [label="5: Exit A_setX: \n " color=yellow style=filled]
10 [label="10: Start A_setX: (generated)\nFormals: self:class A * x:int \nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled] 4 [label="4: Start A_setX: (generated)\nFormals: self:class A * x:int \nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled]
10 -> 12 ; 4 -> 6 ;
9 [label="9: Return Stmt \n n$4=*&self:class A * [line 13]\n n$5=*n$4._x:int [line 13]\n *&return:int =n$5 [line 13]\n REMOVE_TEMPS(n$4,n$5); [line 13]\n NULLIFY(&self,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"] 3 [label="3: Return Stmt \n n$0=*&target:class A * [line 19]\n n$1=_fun_A_x(n$0:class A *) [line 19]\n *&return:int =n$1 [line 19]\n REMOVE_TEMPS(n$0,n$1); [line 19]\n NULLIFY(&target,false); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"]
9 -> 8 ; 3 -> 2 ;
8 [label="8: Exit A_x \n " color=yellow style=filled]
7 [label="7: Start A_x (generated)\nFormals: self:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled]
7 -> 9 ;
6 [label="6: Return Stmt \n n$0=*&target:class A * [line 19]\n n$3=_fun_A_x(n$0:class A *) virtual [line 19]\n *&return:int =n$3 [line 19]\n REMOVE_TEMPS(n$0,n$3); [line 19]\n NULLIFY(&target,false); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"]
6 -> 2 ;
2 [label="2: Exit A_addTarget: \n " color=yellow style=filled] 2 [label="2: Exit A_addTarget: \n " color=yellow style=filled]
1 [label="1: Start A_addTarget:\nFormals: self:class A * target:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 18]\n NULLIFY(&self,false); [line 18]\n " color=yellow style=filled] 1 [label="1: Start A_addTarget:\nFormals: self:class A * target:class A *\nLocals: \n DECLARE_LOCALS(&return); [line 18]\n NULLIFY(&self,false); [line 18]\n " color=yellow style=filled]
1 -> 6 ; 1 -> 3 ;
} }

@ -1,32 +1,21 @@
digraph iCFG { digraph iCFG {
8 [label="8: Message Call: retain \n n$7=*&aDynValue:class NSObject * [line 13]\n n$8=_fun___objc_retain(n$7:class NSObject *) [line 13]\n REMOVE_TEMPS(n$7,n$8); [line 13]\n " shape="box"] 5 [label="5: Message Call: retain \n n$5=*&aDynValue:class NSObject * [line 13]\n n$6=_fun___objc_retain(n$5:class NSObject *) [line 13]\n REMOVE_TEMPS(n$5,n$6); [line 13]\n " shape="box"]
8 -> 7 ; 5 -> 4 ;
7 [label="7: Message Call: release \n n$4=*&self:class AClass * [line 13]\n n$5=*n$4._aDynValue:class NSObject * [line 13]\n n$6=_fun___objc_release(n$5:class NSObject *) [line 13]\n REMOVE_TEMPS(n$4,n$5,n$6); [line 13]\n " shape="box"] 4 [label="4: Message Call: release \n n$2=*&self:class AClass * [line 13]\n n$3=*n$2._aDynValue:class NSObject * [line 13]\n n$4=_fun___objc_release(n$3:class NSObject *) [line 13]\n REMOVE_TEMPS(n$2,n$3,n$4); [line 13]\n " shape="box"]
7 -> 6 ; 4 -> 3 ;
6 [label="6: BinaryOperatorStmt: Assign \n n$2=*&self:class AClass * [line 13]\n n$3=*&aDynValue:class NSObject * [line 13]\n *n$2._aDynValue:class NSObject *=n$3 [line 13]\n REMOVE_TEMPS(n$2,n$3); [line 13]\n NULLIFY(&aDynValue,false); [line 13]\n NULLIFY(&self,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"] 3 [label="3: BinaryOperatorStmt: Assign \n n$0=*&self:class AClass * [line 13]\n n$1=*&aDynValue:class NSObject * [line 13]\n *n$0._aDynValue:class NSObject *=n$1 [line 13]\n REMOVE_TEMPS(n$0,n$1); [line 13]\n NULLIFY(&aDynValue,false); [line 13]\n NULLIFY(&self,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"]
6 -> 5 ;
5 [label="5: Exit AClass_setADynValue: \n " color=yellow style=filled]
4 [label="4: Start AClass_setADynValue: (generated)\nFormals: self:class AClass * aDynValue:class NSObject *\nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled]
4 -> 8 ;
3 [label="3: Return Stmt \n n$0=*&self:class AClass * [line 13]\n n$1=*n$0._aDynValue:class NSObject * [line 13]\n *&return:class NSObject *=n$1 [line 13]\n REMOVE_TEMPS(n$0,n$1); [line 13]\n NULLIFY(&self,false); [line 13]\n APPLY_ABSTRACTION; [line 13]\n " shape="box"]
3 -> 2 ; 3 -> 2 ;
2 [label="2: Exit AClass_aDynValue \n " color=yellow style=filled] 2 [label="2: Exit AClass_setADynValue: \n " color=yellow style=filled]
1 [label="1: Start AClass_aDynValue (generated)\nFormals: self:class AClass *\nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled] 1 [label="1: Start AClass_setADynValue: (generated)\nFormals: self:class AClass * aDynValue:class NSObject *\nLocals: \n DECLARE_LOCALS(&return); [line 13]\n " color=yellow style=filled]
1 -> 3 ; 1 -> 5 ;
} }

@ -7,7 +7,7 @@ digraph iCFG {
5 -> 4 ; 5 -> 4 ;
4 [label="4: Call _fun_NSLog \n n$0=_fun_NSString_stringWithUTF8String:(\"%d\":char *) [line 15]\n n$1=*&honda:class Car * [line 15]\n n$2=_fun_Car_running(n$1:class Car *) virtual [line 15]\n _fun_NSLog(n$0:struct objc_object *,n$2:int ) [line 15]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 15]\n NULLIFY(&honda,false); [line 15]\n " shape="box"] 4 [label="4: Call _fun_NSLog \n n$0=_fun_NSString_stringWithUTF8String:(\"%d\":char *) [line 15]\n n$1=*&honda:class Car * [line 15]\n n$2=_fun_Car_running(n$1:class Car *) [line 15]\n _fun_NSLog(n$0:struct objc_object *,n$2:int ) [line 15]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 15]\n NULLIFY(&honda,false); [line 15]\n " shape="box"]
4 -> 3 ; 4 -> 3 ;

Loading…
Cancel
Save