diff --git a/infer/src/backend/inferanalyze.ml b/infer/src/backend/inferanalyze.ml index f97578d4c..64a0aca56 100644 --- a/infer/src/backend/inferanalyze.ml +++ b/infer/src/backend/inferanalyze.ml @@ -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 (); diff --git a/infer/src/backend/objc_preanal.ml b/infer/src/backend/objc_preanal.ml deleted file mode 100644 index 884fbe8de..000000000 --- a/infer/src/backend/objc_preanal.ml +++ /dev/null @@ -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 diff --git a/infer/src/backend/objc_preanal.mli b/infer/src/backend/objc_preanal.mli deleted file mode 100644 index 2f8ba40ae..000000000 --- a/infer/src/backend/objc_preanal.mli +++ /dev/null @@ -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 diff --git a/infer/src/backend/symExec.ml b/infer/src/backend/symExec.ml index 2cf024b91..7f35c46e9 100644 --- a/infer/src/backend/symExec.ml +++ b/infer/src/backend/symExec.ml @@ -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 = diff --git a/infer/src/clang/cField_decl.ml b/infer/src/clang/cField_decl.ml index c811ba0b4..cbe1a9777 100644 --- a/infer/src/clang/cField_decl.ml +++ b/infer/src/clang/cField_decl.ml @@ -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 = diff --git a/infer/src/clang/cMethod_decl.ml b/infer/src/clang/cMethod_decl.ml index de6c1d02a..1deeaf268 100644 --- a/infer/src/clang/cMethod_decl.ml +++ b/infer/src/clang/cMethod_decl.ml @@ -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 diff --git a/infer/src/clang/cMethod_decl.mli b/infer/src/clang/cMethod_decl.mli index 1fb0b44fc..186abe061 100644 --- a/infer/src/clang/cMethod_decl.mli +++ b/infer/src/clang/cMethod_decl.mli @@ -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 diff --git a/infer/src/clang/cMethod_signature.ml b/infer/src/clang/cMethod_signature.ml index 10ef607dc..617bf85b9 100644 --- a/infer/src/clang/cMethod_signature.ml +++ b/infer/src/clang/cMethod_signature.ml @@ -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 = { diff --git a/infer/src/clang/cMethod_signature.mli b/infer/src/clang/cMethod_signature.mli index 7700413a0..9c8184d10 100644 --- a/infer/src/clang/cMethod_signature.mli +++ b/infer/src/clang/cMethod_signature.mli @@ -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 diff --git a/infer/src/clang/cMethod_trans.ml b/infer/src/clang/cMethod_trans.ml index daad0fd65..1482c38eb 100644 --- a/infer/src/clang/cMethod_trans.ml +++ b/infer/src/clang/cMethod_trans.ml @@ -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 = diff --git a/infer/src/clang/cModule_type.ml b/infer/src/clang/cModule_type.ml index bec374f27..f7fdfd5a3 100644 --- a/infer/src/clang/cModule_type.ml +++ b/infer/src/clang/cModule_type.ml @@ -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 diff --git a/infer/src/clang/cTrans.ml b/infer/src/clang/cTrans.ml index c9edaff19..c440c69cb 100644 --- a/infer/src/clang/cTrans.ml +++ b/infer/src/clang/cTrans.ml @@ -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 diff --git a/infer/src/clang/objcProperty_decl.ml b/infer/src/clang/objcProperty_decl.ml index ed2ec98a1..65ab83ada 100644 --- a/infer/src/clang/objcProperty_decl.ml +++ b/infer/src/clang/objcProperty_decl.ml @@ -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 diff --git a/infer/src/clang/objcProperty_decl.mli b/infer/src/clang/objcProperty_decl.mli index 35a5a419b..5e1859477 100644 --- a/infer/src/clang/objcProperty_decl.mli +++ b/infer/src/clang/objcProperty_decl.mli @@ -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 diff --git a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/ArcExample.dot b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/ArcExample.dot index cf5517ba6..ff0c3827b 100644 --- a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/ArcExample.dot +++ b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/ArcExample.dot @@ -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"] diff --git a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/AutoreleaseExample.dot b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/AutoreleaseExample.dot index 3c67383ba..b24faf707 100644 --- a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/AutoreleaseExample.dot +++ b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/AutoreleaseExample.dot @@ -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"] diff --git a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/MemoryLeakExample.dot b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/MemoryLeakExample.dot index 20ae08a59..4515c965b 100644 --- a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/MemoryLeakExample.dot +++ b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/MemoryLeakExample.dot @@ -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 ; diff --git a/infer/tests/codetoanalyze/objc/errors/npe/Nonnull_attribute_example.dot b/infer/tests/codetoanalyze/objc/errors/npe/Nonnull_attribute_example.dot index 3db2f9364..1caf09242 100644 --- a/infer/tests/codetoanalyze/objc/errors/npe/Nonnull_attribute_example.dot +++ b/infer/tests/codetoanalyze/objc/errors/npe/Nonnull_attribute_example.dot @@ -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 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot b/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot index d074d6707..2437dfb86 100644 --- a/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot +++ b/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot @@ -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:(\"\":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:(\"\":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:(\"\":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:(\"\":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:(\"\":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:(\"\":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:(\"\":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:(\"\":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"] diff --git a/infer/tests/codetoanalyze/objc/frontend/block/dispatch.dot b/infer/tests/codetoanalyze/objc/frontend/block/dispatch.dot index c9571e0e1..d1928e548 100644 --- a/infer/tests/codetoanalyze/objc/frontend/block/dispatch.dot +++ b/infer/tests/codetoanalyze/objc/frontend/block/dispatch.dot @@ -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"] diff --git a/infer/tests/codetoanalyze/objc/frontend/property/PropertyAttributes.dot b/infer/tests/codetoanalyze/objc/frontend/property/PropertyAttributes.dot index ae477e7fd..c5069032d 100644 --- a/infer/tests/codetoanalyze/objc/frontend/property/PropertyAttributes.dot +++ b/infer/tests/codetoanalyze/objc/frontend/property/PropertyAttributes.dot @@ -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"] diff --git a/infer/tests/codetoanalyze/objc/frontend/property/PropertyCustomAccessor.dot b/infer/tests/codetoanalyze/objc/frontend/property/PropertyCustomAccessor.dot index 0aec1b530..e69de29bb 100644 --- a/infer/tests/codetoanalyze/objc/frontend/property/PropertyCustomAccessor.dot +++ b/infer/tests/codetoanalyze/objc/frontend/property/PropertyCustomAccessor.dot @@ -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 ; -} diff --git a/infer/tests/codetoanalyze/objc/frontend/property/Property_getter.dot b/infer/tests/codetoanalyze/objc/frontend/property/Property_getter.dot index 184cadc0c..5de4ae770 100644 --- a/infer/tests/codetoanalyze/objc/frontend/property/Property_getter.dot +++ b/infer/tests/codetoanalyze/objc/frontend/property/Property_getter.dot @@ -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"] diff --git a/infer/tests/codetoanalyze/objc/frontend/property/aclass.dot b/infer/tests/codetoanalyze/objc/frontend/property/aclass.dot index d69e72274..e69de29bb 100644 --- a/infer/tests/codetoanalyze/objc/frontend/property/aclass.dot +++ b/infer/tests/codetoanalyze/objc/frontend/property/aclass.dot @@ -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 ; -} diff --git a/infer/tests/codetoanalyze/objc/frontend/property/main_car.dot b/infer/tests/codetoanalyze/objc/frontend/property/main_car.dot index ed0ed8a3f..05fadf2fb 100644 --- a/infer/tests/codetoanalyze/objc/frontend/property/main_car.dot +++ b/infer/tests/codetoanalyze/objc/frontend/property/main_car.dot @@ -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 ;