From 1e5b8aeee704f563e68f3333adc79de65ebb7462 Mon Sep 17 00:00:00 2001 From: Dulma Rodriguez Date: Wed, 9 Dec 2015 06:25:16 -0800 Subject: [PATCH] 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 --- infer/src/backend/inferanalyze.ml | 3 - infer/src/backend/objc_preanal.ml | 102 ------- infer/src/backend/objc_preanal.mli | 10 - infer/src/backend/symExec.ml | 20 +- infer/src/clang/cField_decl.ml | 2 +- infer/src/clang/cMethod_decl.ml | 45 +-- infer/src/clang/cMethod_decl.mli | 4 - infer/src/clang/cMethod_signature.ml | 6 + infer/src/clang/cMethod_signature.mli | 2 + infer/src/clang/cMethod_trans.ml | 4 +- infer/src/clang/cModule_type.ml | 1 - infer/src/clang/cTrans.ml | 6 +- infer/src/clang/objcProperty_decl.ml | 64 ----- infer/src/clang/objcProperty_decl.mli | 6 - .../memory_leaks_benchmark/ArcExample.dot | 19 -- .../AutoreleaseExample.dot | 95 +++---- .../MemoryLeakExample.dot | 2 +- .../errors/npe/Nonnull_attribute_example.dot | 23 +- .../frontend/assertions/NSAssert_example.dot | 257 +++++++++--------- .../objc/frontend/block/dispatch.dot | 49 ++-- .../frontend/property/PropertyAttributes.dot | 59 +--- .../property/PropertyCustomAccessor.dot | 13 - .../frontend/property/Property_getter.dot | 11 - .../objc/frontend/property/aclass.dot | 21 -- .../objc/frontend/property/main_car.dot | 2 +- 25 files changed, 235 insertions(+), 591 deletions(-) delete mode 100644 infer/src/backend/objc_preanal.ml delete mode 100644 infer/src/backend/objc_preanal.mli 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 ;