Adding builtin setters and using them by skip

Summary:
public This continues the work on adding builtins for getters and setters
and removing the generated code from the frontend. This is extending it to setters and
removing the preanalysis that is no longer needed.

Reviewed By: akotulski

Differential Revision: D2734499

fb-gh-sync-id: 7cf5749
master
Dulma Rodriguez 9 years ago committed by facebook-github-bot-7
parent 173ee91844
commit 1e5b8aeee7

@ -695,9 +695,6 @@ let () =
let () =
match !cluster_cmdline with
| None ->
if !Config.curr_language = Config.C_CPP &&
not !Config.ondemand_enabled then
Objc_preanal.do_objc_preanalysis ();
L.stdout "Starting analysis (Infer version %s)@." Version.versionString;
| Some clname -> L.stdout "Cluster %s@." clname in
RegisterCheckers.register ();

@ -1,102 +0,0 @@
(*
* Copyright (c) 2015 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
open Utils
type procedure_type =
| ALL
| DEFINED
| OBJC_GENERATED
let print_map procname_map =
Procname.Hash.iter
(fun pname redefined ->
print_endline ((Procname.to_string pname)^" "^(string_of_bool redefined)))
procname_map
let process_all_cfgs process_function default_value =
let source_dirs = DB.find_source_dirs () in
let process_dir source_dir value =
let cfg_name = DB.source_dir_get_internal_file source_dir ".cfg" in
let cfg_opt = Cfg.load_cfg_from_file cfg_name in
match cfg_opt with
| None -> value
| Some cfg -> process_function cfg source_dir in
IList.fold_right process_dir source_dirs default_value
let process_procedures process_function default_value procedure_type =
let process_cfg_procedures cfg source_dir =
let procdescs =
match procedure_type with
| DEFINED -> Cfg.get_defined_procs cfg
| ALL -> Cfg.get_all_procs cfg
| OBJC_GENERATED -> Cfg.get_objc_generated_procs cfg in
IList.fold_right (process_function cfg source_dir) procdescs default_value in
process_all_cfgs process_cfg_procedures default_value
let process_all_procedures process_function default_value =
process_procedures process_function default_value ALL
let process_defined_procedures process_function default_value =
process_procedures process_function default_value DEFINED
let process_objc_generated_procedures process_function default_value =
process_procedures process_function default_value OBJC_GENERATED
(* first run to fill the map. The bool that indicates whether the method *)
(* has a real implementation is false by default *)
let fill_generated_proc_map generated_proc_map =
let add_generated_pname_to_map cfg source_dir procdesc () =
let pname = Cfg.Procdesc.get_proc_name procdesc in
Procname.Hash.replace generated_proc_map pname false in
process_objc_generated_procedures add_generated_pname_to_map ()
(* second run to update the map. Now we check whether there is a real *)
(* implementation for the generated methods *)
let update_generate_proc_map generated_proc_map =
let update_generated_pname_to_map cfg source_dir procdesc () =
let cfg_pname = Cfg.Procdesc.get_proc_name procdesc in
if not (Cfg.Procdesc.get_attributes procdesc).ProcAttributes.is_generated then
try ignore(Procname.Hash.find generated_proc_map cfg_pname);
Procname.Hash.replace generated_proc_map cfg_pname true
with Not_found -> () in
process_defined_procedures update_generated_pname_to_map ()
(* third run to change the cfgs according to the map. The generated methods *)
(* that have implementations get deleted. *)
let update_cfgs generated_proc_map =
let update_cfg cfg source_dir =
let generated_procs = Cfg.get_objc_generated_procs cfg in
let cfg_name = DB.source_dir_get_internal_file source_dir ".cfg" in
let cg_name = DB.source_dir_get_internal_file source_dir ".cg" in
let cg_opt = Cg.load_from_file cg_name in
match cg_opt with
| None -> assert false
| Some cg ->
let update_cfg_procdesc procdesc need_updating =
let pname = Cfg.Procdesc.get_proc_name procdesc in
let is_redefined =
try Procname.Hash.find generated_proc_map pname
with Not_found -> assert false in
if is_redefined then
(Cfg.Procdesc.remove cfg pname true;
Cg.node_set_defined cg pname false;
true)
else need_updating in
let need_updating = IList.fold_right update_cfg_procdesc generated_procs false in
if need_updating then
(Cfg.store_cfg_to_file cfg_name false cfg;
Cg.store_to_file cg_name cg) in
process_all_cfgs update_cfg ()
let do_objc_preanalysis () =
let generated_proc_map = Procname.Hash.create 100 in
fill_generated_proc_map generated_proc_map;
update_generate_proc_map generated_proc_map;
update_cfgs generated_proc_map

@ -1,10 +0,0 @@
(*
* Copyright (c) 2015 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
val do_objc_preanalysis : unit -> unit

@ -1349,6 +1349,8 @@ and sym_exe_check_variadic_sentinel_if_present
and sym_exec_objc_getter field_name ret_typ_opt tenv cfg ret_ids pdesc callee_name loc args _prop
path : Builtin.ret_typ =
L.d_strln ("No custom getter found. Executing the ObjC builtin getter with ivar "^
(Ident.fieldname_to_string field_name)^".");
let ret_id =
match ret_ids with
| [ret_id] -> ret_id
@ -1368,6 +1370,21 @@ and sym_exec_objc_getter field_name ret_typ_opt tenv cfg ret_ids pdesc callee_na
sym_exec_generated false cfg tenv pdesc [ret_instr] [(_prop, path)]
| _ -> raise (Exceptions.Wrong_argument_number (try assert false with Assert_failure x -> x))
and sym_exec_objc_setter field_name ret_typ_opt tenv cfg ret_ids pdesc callee_name loc args _prop
path : Builtin.ret_typ =
L.d_strln ("No custom setter found. Executing the ObjC builtin setter with ivar "^
(Ident.fieldname_to_string field_name)^".");
match args with
| (lexp1, typ1) :: (lexp2, typ2)::_ ->
let typ1' = (match Sil.expand_type tenv typ1 with
| Sil.Tstruct _ as s -> s
| Sil.Tptr (t, _) -> Sil.expand_type tenv t
| _ -> assert false) in
let field_access_exp = Sil.Lfield (lexp1, field_name, typ1') in
let set_instr = Sil.Set (field_access_exp, typ2, lexp2, loc) in
sym_exec_generated false cfg tenv pdesc [set_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
@ -1375,7 +1392,8 @@ and sym_exec_objc_accessor property_accesor ret_typ_opt tenv cfg ret_ids pdesc c
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*)
sym_exec_objc_setter field_name ret_typ_opt tenv cfg ret_ids pdesc callee_name loc args _prop
path
(** Perform symbolic execution for a function call *)
and sym_exec_call cfg pdesc tenv pre path ret_ids actual_pars summary loc =

@ -112,7 +112,7 @@ let add_missing_fields tenv class_name fields =
) in
Printing.log_out " Updating info for class '%s' in tenv\n" class_name;
Sil.tenv_add tenv class_tn_name class_type_info
| _ -> assert false
| _ -> ()
(* checks if ivar is defined among a set of fields and if it is atomic *)
let is_ivar_atomic ivar fields =

@ -21,7 +21,6 @@ module type CMethod_decl = sig
val function_decl : Sil.tenv -> Cfg.cfg -> Cg.t -> Clang_ast_t.decl ->
CModule_type.block_data option -> unit
val process_getter_setter : CContext.t -> Procname.t -> bool
end
module CMethod_decl_funct(T: CModule_type.CTranslation) : CMethod_decl =
@ -92,20 +91,15 @@ struct
add_method tenv cg cfg curr_class procname [body] is_objc [] None extra_instrs
| None -> ()
let rec process_one_method_decl tenv cg cfg curr_class dec =
let process_one_method_decl tenv cg cfg curr_class dec =
let open Clang_ast_t in
match dec with
| CXXMethodDecl _ | CXXConstructorDecl _ ->
process_method_decl tenv cg cfg curr_class dec ~is_objc:false
| ObjCMethodDecl _ ->
process_method_decl tenv cg cfg curr_class dec ~is_objc:true
| ObjCPropertyImplDecl (decl_info, property_impl_decl_info) ->
let pname = Ast_utils.property_name property_impl_decl_info in
Printing.log_out "ADDING: ObjCPropertyImplDecl for property '%s' "
pname.Clang_ast_t.ni_name;
let setter = ObjcProperty_decl.make_setter' curr_class decl_info pname in
IList.iter (process_one_method_decl tenv cg cfg curr_class) setter
| EmptyDecl _ | ObjCIvarDecl _ | ObjCPropertyDecl _ -> ()
| ObjCPropertyImplDecl _ | EmptyDecl _
| ObjCIvarDecl _ | ObjCPropertyDecl _ -> ()
| _ ->
Printing.log_stats
"\nWARNING: found Method Declaration '%s' skipped. NEED TO BE FIXED\n\n" (Ast_utils.string_of_decl dec);
@ -114,37 +108,4 @@ struct
let process_methods tenv cg cfg curr_class decl_list =
IList.iter (process_one_method_decl tenv cg cfg curr_class) decl_list
let process_getter_setter context procname =
(*If there is already a spec for the method we want to generate (in incremental analysis) *)
(* we don't need to generate it again. *)
if Specs.summary_exists procname then false
else
let class_name = Procname.c_get_class procname in
let tenv = context.CContext.tenv in
let cg = context.CContext.cg in
let cfg = context.CContext.cfg in
let cls = CContext.create_curr_class tenv class_name in
let method_name = Procname.c_get_method procname in
match ObjcProperty_decl.method_is_property_accesor cls method_name with
| Some (property_name, property_type, is_getter) when
CMethod_trans.should_create_procdesc cfg procname true true ->
(match property_type with tp, atts, decl_info, _, _, ivar_opt ->
let ivar_name = ObjcProperty_decl.get_ivar_name property_name ivar_opt in
let field =
CField_decl.build_sil_field_property CTypes_decl.type_ptr_to_sil_type cls tenv
ivar_name tp (Some atts) in
ignore (CField_decl.add_missing_fields tenv class_name [field]);
let accessor_opt =
if is_getter then []
else ObjcProperty_decl.make_setter cls property_name property_type in
match accessor_opt with
| [accessor] ->
let decl_info = Clang_ast_proj.get_decl_tuple accessor in
if CLocation.should_translate_lib decl_info.Clang_ast_t.di_source_range then
(process_one_method_decl tenv cg cfg cls accessor;
true)
else false
| _ -> false)
| _ -> false
end

@ -16,8 +16,6 @@ module CMethod_decl_funct(T: CModule_type.CTranslation) : sig
val function_decl : Sil.tenv -> Cfg.cfg -> Cg.t -> Clang_ast_t.decl ->
CModule_type.block_data option -> unit
val process_getter_setter : CContext.t -> Procname.t -> bool
end
module type CMethod_decl = sig
@ -26,6 +24,4 @@ module type CMethod_decl = sig
val function_decl : Sil.tenv -> Cfg.cfg -> Cg.t -> Clang_ast_t.decl ->
CModule_type.block_data option -> unit
val process_getter_setter : CContext.t -> Procname.t -> bool
end

@ -62,6 +62,12 @@ let ms_is_getter ms =
Option.is_some ms._pointer_to_property_opt &&
IList.length ms._args == 1
(* A method is a setter if it has a link to a property and *)
(* it has 2 argument (this includes self) *)
let ms_is_setter ms =
Option.is_some ms._pointer_to_property_opt &&
IList.length ms._args == 2
let make_ms procname args ret_type attributes loc is_instance is_generated lang pointer_to_parent
pointer_to_property_opt =
let meth_signature = {

@ -35,6 +35,8 @@ val ms_get_pointer_to_property_opt : method_signature -> Clang_ast_t.pointer opt
val ms_is_getter : method_signature -> bool
val ms_is_setter : method_signature -> bool
val make_ms : Procname.t -> (string * Clang_ast_t.type_ptr) list -> Clang_ast_t.type_ptr
-> Clang_ast_t.attribute list -> Clang_ast_t.source_range -> bool -> bool -> CFrontend_config.lang
-> Clang_ast_t.pointer option -> Clang_ast_t.pointer option -> method_signature

@ -250,7 +250,9 @@ let get_objc_property_accessor tenv ms =
CTypes_decl.type_ptr_to_sil_type class_name d in
if CMethod_signature.ms_is_getter ms then
Some (ProcAttributes.Objc_getter field_name)
else None (* Setter TODO *)
else if CMethod_signature.ms_is_setter ms then
Some (ProcAttributes.Objc_setter field_name)
else None
| _ -> None
let get_formal_parameters tenv ms =

@ -25,5 +25,4 @@ sig
val function_decl : Sil.tenv -> Cfg.cfg -> Cg.t -> Clang_ast_t.decl ->
block_data option -> unit
val process_getter_setter : CContext.t -> Procname.t -> bool
end

@ -61,10 +61,8 @@ struct
ignore (CMethod_trans.create_local_procdesc context.cfg context.tenv ms [] [] is_instance);
CMethod_signature.ms_get_name ms, CMethod_trans.MCNoVirtual
| None, Some ms ->
if not (M.process_getter_setter context procname) then
(ignore (CMethod_trans.create_local_procdesc context.cfg context.tenv
ms [] [] is_instance));
if CMethod_signature.ms_is_getter ms then
ignore (CMethod_trans.create_local_procdesc context.cfg context.tenv ms [] [] is_instance);
if CMethod_signature.ms_is_getter ms || CMethod_signature.ms_is_setter ms then
procname, CMethod_trans.MCNoVirtual
else
procname, mc_type

@ -282,70 +282,6 @@ let get_ivar_name prop_name ivar_opt =
| Some ivar_name -> ivar_name
| None -> Ast_utils.generated_ivar_name prop_name
let make_setter 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 setter with
| Some (ObjCMethodDecl(di, name, mdi), _) when not (is_property_read_only attributes) ->
let dummy_info = Ast_expressions.dummy_decl_info_in_curr_file di in
let param_name, tp_param = (match mdi.Clang_ast_t.omdi_parameters with
| [ParmVarDecl(_, name_info, tp_param, _)] -> name_info, tp_param
| _ -> assert false) in
let is_hidden = false in
let decl_ptr = Ast_utils.get_invalid_pointer () in
let drti_decl_ref' =
Ast_expressions.make_decl_ref_tp (`ParmVar) decl_ptr param_name is_hidden tp_param in
let decl_ref_expr_info' = Ast_expressions.make_decl_ref_expr_info drti_decl_ref' in
let expr_info = Ast_expressions.make_expr_info tp_param in
let stmt_info = Ast_expressions.make_stmt_info dummy_info in
let rhs_exp = Ast_expressions.make_cast_expr tp_param di decl_ref_expr_info' `ObjCProperty in
let lhs_exp = Ast_expressions.make_self_field
(CContext.get_curr_class_name curr_class) di tp_param ivar_name in
let boi = { Clang_ast_t.boi_kind = `Assign } in
let setter = Ast_expressions.make_binary_stmt lhs_exp rhs_exp stmt_info expr_info boi in
let memory_management_attribute = (get_memory_management_attribute attributes) in
let code =
if Ast_utils.is_retain memory_management_attribute then
let param_decl = Ast_expressions.make_decl_ref_exp_var (param_name, tp_param, decl_ptr) `ParmVar stmt_info in
let retain_call = Ast_expressions.make_message_expr tp_param CFrontend_config.retain param_decl stmt_info true in
let release_call = Ast_expressions.make_message_expr tp_param CFrontend_config.release lhs_exp stmt_info true in
[retain_call; release_call; setter]
else if Ast_utils.is_copy memory_management_attribute then
let param_decl = Ast_expressions.make_decl_ref_exp_var (param_name, tp_param, decl_ptr) `ParmVar stmt_info in
let copy_call = Ast_expressions.make_message_expr tp_param CFrontend_config.copy param_decl stmt_info true in
let setter = Ast_expressions.make_binary_stmt lhs_exp copy_call stmt_info expr_info boi in
[setter]
else [setter] in
let body = Ast_expressions.make_compound_stmt code stmt_info in
let mdi'= Ast_expressions.make_method_decl_info mdi body in
let name_generated = create_generated_method_name name in
Property.replace_property
(curr_class, prop_name)
(tp, attributes, decl_info,
(getter_name, getter),
(setter_name, Some (ObjCMethodDecl(di, name, mdi), true)), Some ivar_name);
[ObjCMethodDecl(dummy_info, name_generated, mdi')]
| _ -> []
(*Makes the getters and setters according to the attributes: *)
(* - If readonly is available, only write getter *)
(* - If strong or retain are available then write the following code in the setter: *)
(* [param retain] *)
(* [self->_field release] *)
(* [self->_field = param] *)
(* - If copy is available then write the following code: *)
(* [self->_field = [param copy] *)
let make_setter' curr_class decl_info prop_name =
Printing.log_out "pointer = '%s'\n" decl_info.Clang_ast_t.di_pointer;
try
let prop_type = Property.find_property curr_class prop_name in
(make_setter curr_class prop_name prop_type)
with _ ->
Printing.log_out "Property %s not found@." prop_name.Clang_ast_t.ni_name;
[]
let add_properties_to_table curr_class decl_list =
let add_property_to_table dec =
match dec with

@ -65,12 +65,6 @@ val is_property_read_only : Clang_ast_t.property_attribute list -> bool
val find_properties_class : CContext.curr_class ->
(Clang_ast_t.named_decl_info * property_type) list
val make_setter : 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.decl_info ->
Clang_ast_t.named_decl_info -> Clang_ast_t.decl list
val method_is_property_accesor : CContext.curr_class -> string ->
(Clang_ast_t.named_decl_info * property_type * bool) option

@ -1,23 +1,4 @@
digraph iCFG {
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"]
13 -> 12 ;
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"]
12 -> 11 ;
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"]
11 -> 10 ;
10 [label="10: Exit A_setSon: \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 -> 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"]

@ -1,135 +1,124 @@
digraph iCFG {
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"]
38 -> 37 ;
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"]
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 -> 35 ;
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 [label="35: 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"]
35 -> 34 ;
34 [label="34: Exit test3 \n " color=yellow style=filled]
34 [label="34: 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"]
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]
34 -> 33 ;
33 [label="33: 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"]
33 -> 38 ;
32 [label="32: DeclStmt \n *&s1:class A *=0 [line 48]\n " shape="box"]
33 -> 32 ;
32 [label="32: 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"]
32 -> 31 ;
31 [label="31: DeclStmt \n *&s2:class A *=0 [line 49]\n " shape="box"]
31 [label="31: Exit test3 \n " color=yellow style=filled]
31 -> 30 ;
30 [label="30: DeclStmt \n *&s3:class A *=0 [line 50]\n " shape="box"]
30 [label="30: 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]
30 -> 29 ;
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"]
30 -> 35 ;
29 [label="29: DeclStmt \n *&s1:class A *=0 [line 48]\n " shape="box"]
29 -> 28 ;
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 [label="28: DeclStmt \n *&s2:class A *=0 [line 49]\n " shape="box"]
28 -> 27 ;
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"]
27 [label="27: DeclStmt \n *&s3:class A *=0 [line 50]\n " shape="box"]
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 [label="26: 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"]
26 -> 25 ;
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 [label="25: 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"]
25 -> 24 ;
24 [label="24: Exit test2 \n " color=yellow style=filled]
24 [label="24: 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"]
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]
24 -> 23 ;
23 [label="23: 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"]
23 -> 32 ;
22 [label="22: DeclStmt \n *&s1:class A *=0 [line 35]\n " shape="box"]
23 -> 22 ;
22 [label="22: 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"]
22 -> 21 ;
21 [label="21: DeclStmt \n *&s2:class A *=0 [line 36]\n " shape="box"]
21 [label="21: Exit test2 \n " color=yellow style=filled]
21 -> 20 ;
20 [label="20: DeclStmt \n *&s3:class A *=0 [line 37]\n " shape="box"]
20 [label="20: 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]
20 -> 19 ;
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"]
20 -> 29 ;
19 [label="19: DeclStmt \n *&s1:class A *=0 [line 35]\n " shape="box"]
19 -> 18 ;
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 [label="18: DeclStmt \n *&s2:class A *=0 [line 36]\n " shape="box"]
18 -> 17 ;
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 [label="17: DeclStmt \n *&s3:class A *=0 [line 37]\n " shape="box"]
17 -> 16 ;
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"]
16 [label="16: 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"]
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 [label="15: 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"]
15 -> 14 ;
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 [label="14: 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"]
14 -> 13 ;
13 [label="13: Exit test1 \n " color=yellow style=filled]
13 [label="13: 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"]
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]
13 -> 12 ;
12 [label="12: 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"]
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"]
12 -> 11 ;
11 [label="11: 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"]
11 -> 10 ;
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 [label="10: Exit test1 \n " color=yellow style=filled]
10 -> 9 ;
9 [label="9: Exit createA \n " color=yellow style=filled]
9 [label="9: 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]
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]
9 -> 19 ;
8 [label="8: 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"]
8 -> 11 ;
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"]
8 -> 7 ;
7 [label="7: 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"]
7 -> 6 ;
6 [label="6: Exit A_setSon: \n " color=yellow style=filled]
6 [label="6: Exit createA \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 [label="5: 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]
5 -> 7 ;
5 -> 8 ;
4 [label="4: DeclStmt \n n$2=_fun___objc_alloc_no_fail(sizeof(class NSString ):unsigned long ) [line 23]\n *&s:class NSString *=n$2 [line 23]\n REMOVE_TEMPS(n$2); [line 23]\n " shape="box"]

@ -145,7 +145,7 @@ digraph iCFG {
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 *) [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 [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 *) [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 ;

@ -1,31 +1,16 @@
digraph iCFG {
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"]
17 -> 16 ;
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"]
16 -> 15 ;
15 [label="15: Exit test \n " color=yellow style=filled]
14 [label="14: Start test\nFormals: callback:_fn_ (*)\nLocals: \n DECLARE_LOCALS(&return); [line 46]\n " color=yellow style=filled]
14 -> 17 ;
13 [label="13: Call _fun___infer_assume \n n$10=*&name:class NSString * [line 31]\n n$11=_fun___infer_assume((n$10 != 0):class NSString *) [line 31]\n REMOVE_TEMPS(n$10,n$11); [line 31]\n " shape="box"]
13 [label="13: 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"]
13 -> 12 ;
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 [label="12: 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"]
12 -> 11 ;
11 [label="11: Exit C_setName: \n " color=yellow style=filled]
11 [label="11: Exit test \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 [label="10: Start test\nFormals: callback:_fn_ (*)\nLocals: \n DECLARE_LOCALS(&return); [line 46]\n " color=yellow style=filled]
10 -> 13 ;

@ -1,259 +1,248 @@
digraph iCFG {
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"]
105 [label="105: 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"]
108 -> 103 ;
108 -> 104 ;
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"]
105 -> 100 ;
105 -> 101 ;
104 [label="104: BinaryOperatorStmt: Assign \n n$18=*&SIL_temp_conditional___99:class NSString * [line 36]\n NULLIFY(&SIL_temp_conditional___99,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"]
107 -> 101 ;
106 [label="106: ConditinalStmt Branch \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"]
104 -> 98 ;
103 [label="103: ConditinalStmt Branch \n n$17=_fun_NSString_stringWithUTF8String:(\"<Unknown Function>\":char *) [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___99); [line 36]\n *&SIL_temp_conditional___99:class NSString *=n$17 [line 36]\n REMOVE_TEMPS(n$17); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
106 -> 102 ;
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"]
103 -> 99 ;
102 [label="102: ConditinalStmt Branch \n n$16=*&__assert_fn__:class NSString * [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___99); [line 36]\n *&SIL_temp_conditional___99:class NSString *=n$16 [line 36]\n REMOVE_TEMPS(n$16); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
105 -> 102 ;
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"]
102 -> 99 ;
101 [label="101: 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"]
104 -> 106 ;
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"]
101 -> 103 ;
100 [label="100: 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"]
103 -> 105 ;
102 [label="102: + \n " ]
100 -> 102 ;
99 [label="99: + \n " ]
102 -> 107 ;
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"]
99 -> 104 ;
98 [label="98: 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"]
101 -> 96 ;
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"]
98 -> 93 ;
98 -> 94 ;
97 [label="97: BinaryOperatorStmt: Assign \n n$12=*&SIL_temp_conditional___92:class NSString * [line 36]\n NULLIFY(&SIL_temp_conditional___92,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"]
100 -> 94 ;
99 [label="99: ConditinalStmt Branch \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"]
97 -> 91 ;
96 [label="96: ConditinalStmt Branch \n n$11=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___92); [line 36]\n *&SIL_temp_conditional___92:class NSString *=n$11 [line 36]\n REMOVE_TEMPS(n$11); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
99 -> 95 ;
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"]
96 -> 92 ;
95 [label="95: ConditinalStmt Branch \n n$10=*&__assert_file__:class NSString * [line 36]\n DECLARE_LOCALS(&SIL_temp_conditional___92); [line 36]\n *&SIL_temp_conditional___92:class NSString *=n$10 [line 36]\n REMOVE_TEMPS(n$10); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
98 -> 95 ;
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"]
95 -> 92 ;
94 [label="94: 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"]
97 -> 99 ;
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"]
94 -> 96 ;
93 [label="93: 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"]
96 -> 98 ;
95 [label="95: + \n " ]
93 -> 95 ;
92 [label="92: + \n " ]
95 -> 100 ;
94 [label="94: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
92 -> 97 ;
91 [label="91: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
94 -> 81 ;
93 [label="93: Prune (false branch) \n n$3=*&SIL_temp_conditional___87:int [line 36]\n NULLIFY(&SIL_temp_conditional___87,true); [line 36]\n PRUNE((n$3 == 0), false); [line 36]\n REMOVE_TEMPS(n$3); [line 36]\n " shape="invhouse"]
91 -> 78 ;
90 [label="90: Prune (false branch) \n n$3=*&SIL_temp_conditional___84:int [line 36]\n NULLIFY(&SIL_temp_conditional___84,true); [line 36]\n PRUNE((n$3 == 0), false); [line 36]\n REMOVE_TEMPS(n$3); [line 36]\n " shape="invhouse"]
93 -> 86 ;
92 [label="92: Prune (true branch) \n n$3=*&SIL_temp_conditional___87:int [line 36]\n NULLIFY(&SIL_temp_conditional___87,true); [line 36]\n PRUNE((n$3 != 0), true); [line 36]\n REMOVE_TEMPS(n$3); [line 36]\n NULLIFY(&target,false); [line 36]\n " shape="invhouse"]
90 -> 83 ;
89 [label="89: Prune (true branch) \n n$3=*&SIL_temp_conditional___84:int [line 36]\n NULLIFY(&SIL_temp_conditional___84,true); [line 36]\n PRUNE((n$3 != 0), true); [line 36]\n REMOVE_TEMPS(n$3); [line 36]\n NULLIFY(&target,false); [line 36]\n " shape="invhouse"]
92 -> 108 ;
91 [label="91: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___87); [line 36]\n *&SIL_temp_conditional___87:int =1 [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
89 -> 105 ;
88 [label="88: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___84); [line 36]\n *&SIL_temp_conditional___84:int =1 [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
91 -> 87 ;
90 [label="90: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___87); [line 36]\n *&SIL_temp_conditional___87:int =0 [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
88 -> 84 ;
87 [label="87: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___84); [line 36]\n *&SIL_temp_conditional___84:int =0 [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
90 -> 87 ;
89 [label="89: Prune (false branch) \n n$2=*&target:class A * [line 36]\n PRUNE((n$2 == 0), false); [line 36]\n REMOVE_TEMPS(n$2); [line 36]\n " shape="invhouse"]
87 -> 84 ;
86 [label="86: Prune (false branch) \n n$2=*&target:class A * [line 36]\n PRUNE((n$2 == 0), false); [line 36]\n REMOVE_TEMPS(n$2); [line 36]\n " shape="invhouse"]
89 -> 91 ;
88 [label="88: Prune (true branch) \n n$2=*&target:class A * [line 36]\n PRUNE((n$2 != 0), true); [line 36]\n REMOVE_TEMPS(n$2); [line 36]\n " shape="invhouse"]
86 -> 88 ;
85 [label="85: Prune (true branch) \n n$2=*&target:class A * [line 36]\n PRUNE((n$2 != 0), true); [line 36]\n REMOVE_TEMPS(n$2); [line 36]\n " shape="invhouse"]
88 -> 90 ;
87 [label="87: + \n " ]
85 -> 87 ;
84 [label="84: + \n " ]
87 -> 92 ;
87 -> 93 ;
86 [label="86: + \n " ]
86 -> 84 ;
86 -> 85 ;
85 [label="85: Prune (false branch) \n PRUNE((0 == 0), false); [line 36]\n " shape="invhouse"]
85 -> 82 ;
84 [label="84: Prune (true branch) \n PRUNE((0 != 0), true); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="invhouse"]
84 -> 83 ;
84 -> 89 ;
84 -> 90 ;
83 [label="83: + \n " ]
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"]
83 -> 81 ;
83 -> 82 ;
82 [label="82: Prune (false branch) \n PRUNE((0 == 0), false); [line 36]\n " shape="invhouse"]
82 -> 81 ;
81 [label="81: Exit test2 \n " color=yellow style=filled]
82 -> 79 ;
81 [label="81: Prune (true branch) \n PRUNE((0 != 0), true); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="invhouse"]
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]
81 -> 80 ;
80 [label="80: + \n " ]
80 -> 83 ;
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"]
80 -> 85 ;
80 -> 86 ;
79 [label="79: 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"]
79 -> 74 ;
79 -> 75 ;
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"]
79 -> 78 ;
78 [label="78: Exit test2 \n " color=yellow style=filled]
78 -> 72 ;
77 [label="77: ConditinalStmt Branch \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"]
77 [label="77: 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]
77 -> 73 ;
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"]
77 -> 80 ;
76 [label="76: 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"]
76 -> 73 ;
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"]
76 -> 71 ;
76 -> 72 ;
75 [label="75: BinaryOperatorStmt: Assign \n n$17=*&SIL_temp_conditional___70:class NSString * [line 31]\n NULLIFY(&SIL_temp_conditional___70,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"]
75 -> 77 ;
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"]
75 -> 69 ;
74 [label="74: ConditinalStmt Branch \n n$16=_fun_NSString_stringWithUTF8String:(\"<Unknown Function>\":char *) [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___70); [line 31]\n *&SIL_temp_conditional___70:class NSString *=n$16 [line 31]\n REMOVE_TEMPS(n$16); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
74 -> 76 ;
73 [label="73: + \n " ]
74 -> 70 ;
73 [label="73: ConditinalStmt Branch \n n$15=*&__assert_fn__:class NSString * [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___70); [line 31]\n *&SIL_temp_conditional___70:class NSString *=n$15 [line 31]\n REMOVE_TEMPS(n$15); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
73 -> 78 ;
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"]
73 -> 70 ;
72 [label="72: 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"]
72 -> 67 ;
72 -> 68 ;
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"]
72 -> 74 ;
71 [label="71: 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"]
71 -> 65 ;
70 [label="70: ConditinalStmt Branch \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"]
71 -> 73 ;
70 [label="70: + \n " ]
70 -> 66 ;
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"]
70 -> 75 ;
69 [label="69: 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"]
69 -> 66 ;
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"]
69 -> 64 ;
69 -> 65 ;
68 [label="68: BinaryOperatorStmt: Assign \n n$11=*&SIL_temp_conditional___63:class NSString * [line 31]\n NULLIFY(&SIL_temp_conditional___63,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"]
68 -> 70 ;
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"]
68 -> 62 ;
67 [label="67: ConditinalStmt Branch \n n$10=_fun_NSString_stringWithUTF8String:(\"<Unknown File>\":char *) [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___63); [line 31]\n *&SIL_temp_conditional___63:class NSString *=n$10 [line 31]\n REMOVE_TEMPS(n$10); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
67 -> 69 ;
66 [label="66: + \n " ]
67 -> 63 ;
66 [label="66: ConditinalStmt Branch \n n$9=*&__assert_file__:class NSString * [line 31]\n DECLARE_LOCALS(&SIL_temp_conditional___63); [line 31]\n *&SIL_temp_conditional___63:class NSString *=n$9 [line 31]\n REMOVE_TEMPS(n$9); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
66 -> 71 ;
65 [label="65: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
66 -> 63 ;
65 [label="65: 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"]
65 -> 51 ;
64 [label="64: Prune (false branch) \n n$3=*&SIL_temp_conditional___57:int [line 31]\n NULLIFY(&SIL_temp_conditional___57,true); [line 31]\n PRUNE((n$3 == 0), false); [line 31]\n REMOVE_TEMPS(n$3); [line 31]\n " shape="invhouse"]
65 -> 67 ;
64 [label="64: 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"]
64 -> 56 ;
63 [label="63: Prune (true branch) \n n$3=*&SIL_temp_conditional___57:int [line 31]\n NULLIFY(&SIL_temp_conditional___57,true); [line 31]\n PRUNE((n$3 != 0), true); [line 31]\n REMOVE_TEMPS(n$3); [line 31]\n NULLIFY(&target,false); [line 31]\n " shape="invhouse"]
64 -> 66 ;
63 [label="63: + \n " ]
63 -> 79 ;
62 [label="62: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___57); [line 31]\n *&SIL_temp_conditional___57:int =1 [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
63 -> 68 ;
62 [label="62: Assertion failure \n _fun___infer_fail(\"ASSERTION_FAILURE\":void ) [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
62 -> 57 ;
61 [label="61: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___57); [line 31]\n *&SIL_temp_conditional___57:int =0 [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
62 -> 48 ;
61 [label="61: Prune (false branch) \n n$3=*&SIL_temp_conditional___54:int [line 31]\n NULLIFY(&SIL_temp_conditional___54,true); [line 31]\n PRUNE((n$3 == 0), false); [line 31]\n REMOVE_TEMPS(n$3); [line 31]\n " shape="invhouse"]
61 -> 57 ;
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"]
61 -> 53 ;
60 [label="60: Prune (true branch) \n n$3=*&SIL_temp_conditional___54:int [line 31]\n NULLIFY(&SIL_temp_conditional___54,true); [line 31]\n PRUNE((n$3 != 0), true); [line 31]\n REMOVE_TEMPS(n$3); [line 31]\n NULLIFY(&target,false); [line 31]\n " shape="invhouse"]
60 -> 62 ;
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"]
60 -> 76 ;
59 [label="59: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___54); [line 31]\n *&SIL_temp_conditional___54:int =1 [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
59 -> 61 ;
58 [label="58: BinaryOperatorStmt: NE \n n$2=*&target:class A * [line 31]\n " shape="box"]
59 -> 54 ;
58 [label="58: ConditinalStmt Branch \n DECLARE_LOCALS(&SIL_temp_conditional___54); [line 31]\n *&SIL_temp_conditional___54:int =0 [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
58 -> 59 ;
58 -> 60 ;
57 [label="57: + \n " ]
58 -> 54 ;
57 [label="57: Prune (false branch) \n PRUNE(((n$2 != (void *)0) == 0), false); [line 31]\n REMOVE_TEMPS(n$2); [line 31]\n " shape="invhouse"]
57 -> 63 ;
57 -> 64 ;
56 [label="56: + \n " ]
57 -> 59 ;
56 [label="56: Prune (true branch) \n PRUNE(((n$2 != (void *)0) != 0), true); [line 31]\n REMOVE_TEMPS(n$2); [line 31]\n " shape="invhouse"]
56 -> 54 ;
56 -> 55 ;
55 [label="55: Prune (false branch) \n PRUNE((0 == 0), false); [line 31]\n " shape="invhouse"]
56 -> 58 ;
55 [label="55: BinaryOperatorStmt: NE \n n$2=*&target:class A * [line 31]\n " shape="box"]
55 -> 52 ;
54 [label="54: Prune (true branch) \n PRUNE((0 != 0), true); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="invhouse"]
55 -> 56 ;
55 -> 57 ;
54 [label="54: + \n " ]
54 -> 53 ;
54 -> 60 ;
54 -> 61 ;
53 [label="53: + \n " ]
53 -> 58 ;
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"]
53 -> 51 ;
53 -> 52 ;
52 [label="52: Prune (false branch) \n PRUNE((0 == 0), false); [line 31]\n " shape="invhouse"]
52 -> 51 ;
51 [label="51: Exit test1 \n " color=yellow style=filled]
52 -> 49 ;
51 [label="51: Prune (true branch) \n PRUNE((0 != 0), true); [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="invhouse"]
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]
51 -> 50 ;
50 [label="50: + \n " ]
50 -> 53 ;
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"]
50 -> 55 ;
49 [label="49: 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"]
49 -> 48 ;
48 [label="48: Exit A_setX: \n " color=yellow style=filled]
48 [label="48: Exit test1 \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]
47 [label="47: 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]
47 -> 49 ;
47 -> 50 ;
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"]

@ -1,55 +1,44 @@
digraph iCFG {
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"]
26 [label="26: 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 -> 28 ;
28 [label="28: DeclStmt \n *&p:int *=0 [line 46]\n " shape="box"]
26 -> 25 ;
25 [label="25: DeclStmt \n *&p:int *=0 [line 46]\n " shape="box"]
28 -> 23 ;
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"]
25 -> 20 ;
24 [label="24: Return Stmt \n NULLIFY(&p,false); [line 48]\n *&return:int =0 [line 48]\n APPLY_ABSTRACTION; [line 48]\n " shape="box"]
27 -> 21 ;
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"]
24 -> 18 ;
23 [label="23: 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 -> 21 ;
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"]
23 -> 18 ;
22 [label="22: Prune (false branch) \n PRUNE(((n$0 == 0) == 0), false); [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n " shape="invhouse"]
25 -> 27 ;
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"]
22 -> 24 ;
21 [label="21: Prune (true branch) \n PRUNE(((n$0 == 0) != 0), true); [line 47]\n REMOVE_TEMPS(n$0); [line 47]\n " shape="invhouse"]
24 -> 26 ;
23 [label="23: BinaryOperatorStmt: EQ \n n$0=*&b:class A * [line 47]\n NULLIFY(&b,false); [line 47]\n " shape="box"]
21 -> 23 ;
20 [label="20: BinaryOperatorStmt: EQ \n n$0=*&b:class A * [line 47]\n NULLIFY(&b,false); [line 47]\n " shape="box"]
23 -> 24 ;
23 -> 25 ;
22 [label="22: + \n NULLIFY(&b,false); [line 47]\n NULLIFY(&p,false); [line 47]\n " ]
22 -> 21 ;
21 [label="21: Exit main \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 -> 29 ;
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"]
20 -> 21 ;
20 -> 22 ;
19 [label="19: + \n NULLIFY(&b,false); [line 47]\n NULLIFY(&p,false); [line 47]\n " ]
19 -> 18 ;
18 [label="18: Exit A_setX: \n " color=yellow style=filled]
18 [label="18: Exit main \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 [label="17: 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]
17 -> 19 ;
17 -> 26 ;
16 [label="16: DeclStmt \n DECLARE_LOCALS(&__objc_anonymous_block_A_trans______2); [line 36]\n n$11=_fun___objc_alloc_no_fail(sizeof(class __objc_anonymous_block_A_trans______2 ):unsigned long ) [line 36]\n *&__objc_anonymous_block_A_trans______2:class __objc_anonymous_block_A_trans______2 =n$11 [line 36]\n n$12=*&#GB$A_trans_sharedInstance:struct objc_object * [line 36]\n *n$11.A_trans_sharedInstance:struct objc_object *=n$12 [line 36]\n *&dummy_block:_fn_ (*)=(_fun___objc_anonymous_block_A_trans______2) [line 36]\n REMOVE_TEMPS(n$11,n$12); [line 36]\n " shape="box"]

@ -1,68 +1,27 @@
digraph iCFG {
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"]
30 -> 29 ;
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"]
29 -> 25 ;
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"]
28 -> 27 ;
27 [label="27: Exit A_setLast_name: \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]
26 -> 28 ;
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"]
25 -> 24 ;
24 [label="24: Return Stmt \n *&return:int =0 [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"]
24 -> 23 ;
23 [label="23: Exit test \n " color=yellow style=filled]
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]
22 -> 30 ;
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"]
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 -> 16 ;
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 [label="16: DeclStmt \n n$3=_fun___objc_alloc_no_fail(sizeof(class A ):unsigned long ) [line 39]\n n$4=_fun_NSObject_init(n$3:class A *) virtual [line 39]\n *&a:class A *=n$4 [line 39]\n REMOVE_TEMPS(n$3,n$4); [line 39]\n " shape="box"]
16 -> 15 ;
15 [label="15: Exit A_setName: \n " color=yellow style=filled]
15 [label="15: 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 *) [line 40]\n REMOVE_TEMPS(n$1,n$2); [line 40]\n NULLIFY(&a2,false); [line 40]\n " shape="box"]
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]
15 -> 14 ;
14 [label="14: 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"]
14 -> 18 ;
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"]
14 -> 13 ;
13 [label="13: Return Stmt \n *&return:int =0 [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"]
13 -> 12 ;
12 [label="12: Exit A_setChild: \n " color=yellow style=filled]
12 [label="12: Exit test \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 [label="11: 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]
11 -> 13 ;
11 -> 16 ;
10 [label="10: DeclStmt \n n$11=_fun___objc_alloc_no_fail(sizeof(class A ):unsigned long ) [line 27]\n n$12=_fun_NSObject_init(n$11:class A *) virtual [line 27]\n *&other:class A *=n$12 [line 27]\n REMOVE_TEMPS(n$11,n$12); [line 27]\n " shape="box"]

@ -1,13 +0,0 @@
digraph iCFG {
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"]
3 -> 2 ;
2 [label="2: Exit ASDisplayNode_setOpaque: \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,15 +1,4 @@
digraph iCFG {
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"]
6 -> 5 ;
5 [label="5: Exit A_setX: \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]
4 -> 6 ;
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"]

@ -1,21 +0,0 @@
digraph iCFG {
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"]
5 -> 4 ;
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"]
4 -> 3 ;
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"]
3 -> 2 ;
2 [label="2: Exit AClass_setADynValue: \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 -> 5 ;
}

@ -3,7 +3,7 @@ digraph iCFG {
6 -> 5 ;
5 [label="5: Message Call: setRunning: \n n$3=*&honda:class Car * [line 14]\n _fun_Car_setRunning:(n$3:class Car *,1:_Bool ) virtual [line 14]\n REMOVE_TEMPS(n$3); [line 14]\n " shape="box"]
5 [label="5: Message Call: setRunning: \n n$3=*&honda:class Car * [line 14]\n _fun_Car_setRunning:(n$3:class Car *,1:_Bool ) [line 14]\n REMOVE_TEMPS(n$3); [line 14]\n " shape="box"]
5 -> 4 ;

Loading…
Cancel
Save