From ba00f08f0019684232d7393622fb84769156a827 Mon Sep 17 00:00:00 2001 From: Dulma Rodriguez Date: Thu, 15 Oct 2015 06:36:46 -0700 Subject: [PATCH] Remove variable resolution and use pointers to declarations instead MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: @​public This removes the old way of finding variable declarations to create sil variables and replaces it with a a new way based on the map from pointers to declarations. Basically, every variable dereference contains a pointer to the variable declaration, with that we can build the corresponding sil variable. Reviewed By: @akotulski Differential Revision: D2536000 fb-gh-sync-id: dd29cf9 --- infer/src/clang/ast_expressions.ml | 15 +- infer/src/clang/cContext.ml | 198 +-------------- infer/src/clang/cContext.mli | 24 +- infer/src/clang/cEnum_decl.ml | 2 +- infer/src/clang/cFrontend.ml | 4 +- infer/src/clang/cFrontend_config.ml | 2 + infer/src/clang/cFrontend_config.mli | 2 + infer/src/clang/cFrontend_utils.ml | 25 ++ infer/src/clang/cFrontend_utils.mli | 5 +- infer/src/clang/cGlobal_vars.ml | 57 ----- infer/src/clang/cGlobal_vars.mli | 22 -- infer/src/clang/cMethod_decl.ml | 9 +- infer/src/clang/cMethod_trans.ml | 29 --- infer/src/clang/cMethod_trans.mli | 2 - infer/src/clang/cTrans.ml | 170 ++++++------- infer/src/clang/cTrans_utils.ml | 30 +-- infer/src/clang/cTrans_utils.mli | 4 +- infer/src/clang/cTypes.ml | 26 -- infer/src/clang/cTypes.mli | 2 - infer/src/clang/cVar_decl.ml | 229 ++++++------------ infer/src/clang/cVar_decl.mli | 11 +- .../arithmetic/compound_assignment.c.dot | 2 +- .../c/frontend/arithmetic/int_const.c.dot | 2 +- .../c/frontend/arithmetic/plus_expr.c.dot | 2 +- .../c/frontend/arithmetic/unary.c.dot | 2 +- .../c/frontend/comma/comma.c.dot | 6 +- .../binary_operator.c.dot | 2 +- .../frontend/conditional_operator/cond2.c.dot | 4 +- .../if_short_circuit.c.dot | 4 +- .../conditional_operator/unary_operator.c.dot | 2 +- .../c/frontend/enumeration/enum.c.dot | 2 +- .../c/frontend/gotostmt/goto_ex.c.dot | 4 +- .../initialization/array_initlistexpr.c.dot | 2 +- .../c/frontend/loops/do_while.c.dot | 2 +- .../do_while_condition_side_effects.c.dot | 2 +- .../c/frontend/loops/do_while_nested.c.dot | 2 +- .../loops/for_condition_side_effects.c.dot | 2 +- .../c/frontend/loops/for_nested.c.dot | 2 +- .../c/frontend/loops/for_no_condition.c.dot | 2 +- .../loops/for_no_condition_incr.c.dot | 2 +- .../c/frontend/loops/for_simple.c.dot | 2 +- .../c/frontend/loops/for_while_nested.c.dot | 2 +- .../c/frontend/loops/while_nested.c.dot | 2 +- .../c/frontend/nestedoperators/gnuexpr.c.dot | 2 +- .../nestedoperators/nestedassignment.c.dot | 2 +- .../c/frontend/switchstmt/switch.c.dot | 16 +- .../cpp/frontend/builtin/new.cpp.dot | 2 +- .../cpp/frontend/types/casts.cpp.dot | 2 +- .../cpp/frontend/types/inheritance.cpp.dot | 2 +- .../cpp/frontend/types/struct.cpp.dot | 2 +- .../objc/errors/category_procdesc/main.dot | 2 +- .../AutoreleaseExample.dot | 6 +- .../MemoryLeakExample.dot | 6 +- .../TollBridgeExample.dot | 6 +- .../memory_leaks_benchmark/arc_methods.dot | 2 +- .../errors/npe/Nonnull_attribute_example.dot | 2 +- .../frontend/assertions/NSAssert_example.dot | 4 +- .../objc/frontend/block/BlockVar.dot | 2 +- .../objc/frontend/block/block-it.dot | 10 +- .../objc/frontend/block/block.dot | 4 +- .../objc/frontend/block/block_no_args.dot | 2 +- .../objc/frontend/block/block_release.dot | 2 +- .../objc/frontend/boxing/Boxing.dot | 2 +- .../objc/frontend/boxing/array.dot | 2 +- .../fast_enumeration/Fast_enumeration.dot | 4 +- .../objc/frontend/returnstmt/void_return.dot | 2 +- .../objc/frontend/types/attributes.dot | 2 +- .../objc/frontend/types/void_call.dot | 2 +- .../objc/frontend/vardecl/initlist.dot | 4 +- .../objc/frontend/vardecl/last_af.dot | 2 +- 70 files changed, 319 insertions(+), 699 deletions(-) delete mode 100644 infer/src/clang/cGlobal_vars.ml delete mode 100644 infer/src/clang/cGlobal_vars.mli diff --git a/infer/src/clang/ast_expressions.ml b/infer/src/clang/ast_expressions.ml index 7cfbafc5c..82717a1bb 100644 --- a/infer/src/clang/ast_expressions.ml +++ b/infer/src/clang/ast_expressions.ml @@ -28,6 +28,9 @@ let dummy_stmt_info () = { let fresh_stmt_info stmt_info = { stmt_info with Clang_ast_t.si_pointer = Ast_utils.get_fresh_pointer () } +let fresh_decl_info decl_info = + { decl_info with Clang_ast_t.di_pointer = Ast_utils.get_fresh_pointer () } + let dummy_decl_info decl_info = { decl_info with Clang_ast_t.di_pointer = Ast_utils.get_fresh_pointer (); @@ -371,7 +374,10 @@ let translate_dispatch_function block_name stmt_info stmt_list ei n = let block_expr = try Utils.list_nth stmt_list (n + 1) with Not_found -> assert false in - let block_name_info = Ast_utils.make_name_decl block_name in + let block_name_info = { + Clang_ast_t.ni_name = block_name; + Clang_ast_t.ni_qual_name = [block_name; CFrontend_config.block] + } in let open Clang_ast_t in match block_expr with | BlockExpr (bsi, bsl, bei, bd) -> @@ -379,8 +385,10 @@ let translate_dispatch_function block_name stmt_info stmt_list ei n = let cast_info = { cei_cast_kind = `BitCast; cei_base_path =[]} in let block_def = ImplicitCastExpr(stmt_info,[block_expr], bei, cast_info) in let decl_info = { empty_decl_info - with di_pointer = stmt_info.si_pointer; di_source_range = stmt_info.si_source_range } in - let var_decl_info = { empty_var_decl_info with vdi_init_expr = Some block_def } in + with di_pointer = Ast_utils.get_fresh_pointer(); + di_source_range = stmt_info.si_source_range } in + let stmt_info = { stmt_info with si_pointer = Ast_utils.get_fresh_pointer(); } in + let var_decl_info = { empty_var_decl_info with vdi_init_expr = Some block_def} in let block_var_decl = VarDecl(decl_info, block_name_info, ei.ei_type_ptr, var_decl_info) in let decl_stmt = DeclStmt(stmt_info,[], [block_var_decl]) in @@ -403,6 +411,7 @@ let make_DeclStmt stmt_info di tp vname iexp = Some ie, [ie] | None -> None, [] in let var_decl_info = { empty_var_decl_info with Clang_ast_t.vdi_init_expr = init_expr_opt } in + let di = fresh_decl_info di in let var_decl = Clang_ast_t.VarDecl (di, vname, tp, var_decl_info) in Clang_ast_t.DeclStmt (stmt_info, init_expr_l, [var_decl]) diff --git a/infer/src/clang/cContext.ml b/infer/src/clang/cContext.ml index 29098a939..bc97eca9e 100644 --- a/infer/src/clang/cContext.ml +++ b/infer/src/clang/cContext.ml @@ -13,12 +13,6 @@ open Utils open CFrontend_utils -type varStack = (Mangled.t * Sil.typ * int) Stack.t - -type varMap = varStack StringMap.t - -type pointerVarMap = Sil.pvar StringMap.t - module L = Logging type curr_class = @@ -38,187 +32,11 @@ type t = curr_class: curr_class; is_callee_expression : bool; namespace: string option; (* contains the name of the namespace if we are in the scope of one*) - mutable local_vars : (Mangled.t * Sil.typ * bool) list; (* (name, type, is_static flag) *) - mutable captured_vars : (Mangled.t * Sil.typ * bool) list; (* (name, type, is_static flag) *) - mutable local_vars_stack : varMap; - mutable local_vars_pointer : pointerVarMap; outer_context : t option; (* in case of objc blocks, the context of the method containing the block *) mutable blocks : Procname.t list (* List of blocks defined in this method *) } -module LocalVars = -struct - - module Block = - struct - let depth_counter = ref 0 - - let enter () = - depth_counter := !depth_counter + 1 - - let leave () = - depth_counter := !depth_counter - 1 - - let reset () = - depth_counter := 0 - - let depth () = !depth_counter - - end - - let lookup_var_map context var_name = - try - StringMap.find var_name context.local_vars_stack - with Not_found -> Stack.create () - - let lookup_var_formals context procname var_name = - let formals = Cfg.Procdesc.get_formals context.procdesc in - let arg, typ = list_find (fun (arg, typ) -> arg = var_name) formals in - let var = Sil.mk_pvar (Mangled.from_string var_name) procname in - (var, typ) - - let lookup_var_captured context procname var_name = - let cv, typ, _ = list_find (fun (arg, typ, _) -> arg = Mangled.from_string var_name) context.captured_vars in - let var = Sil.mk_pvar cv procname in - (var, typ) - - let lookup_var_globals context procname name = - let var_name = Mangled.from_string name in - let global_var = CGlobal_vars.find var_name in - let var = CGlobal_vars.var_get_name global_var in - Printing.log_out " ...Variable '%s' found in globals!!@\n" (Sil.pvar_to_string var); - let typ = CGlobal_vars.var_get_typ global_var in - var, typ - - let is_captured_var context name = - list_exists (fun (v, _, _) -> (Mangled.to_string v) = name) context.captured_vars - - let is_global_var context name = - try - let procname = Cfg.Procdesc.get_proc_name context.procdesc in - ignore (lookup_var_globals context procname name); - true - with Not_found -> false - - let print_locals context = - let print_stack var_name stack = - Stack.iter - (fun (var_name, typ, level) -> - Printing.log_out "var item %s:" (Mangled.to_string var_name); - Printing.log_out "%s" (Sil.typ_to_string typ); - Printing.log_out "- %s @." (string_of_int level)) stack in - Printing.log_out "LOCAL VARS:@\n"; - StringMap.iter print_stack context.local_vars_stack - - let print_pointer_vars context = - let print_pointer_var pointer var = - Printing.log_out "%s ->" pointer; - Printing.log_out " %s@\n" (Sil.pvar_to_string var) in - Printing.log_out "POINTER VARS:@\n"; - StringMap.iter print_pointer_var context.local_vars_pointer - - let add_pointer_var pointer var context = - Printing.log_out " ...Adding pointer '%s' " pointer; - Printing.log_out "to the map with variable '%s'@." (Sil.pvar_to_string var); - context.local_vars_pointer <- StringMap.add pointer var context.local_vars_pointer - - let find_var_with_pointer context pointer = - try - StringMap.find pointer context.local_vars_pointer - with Not_found -> - (Printing.log_err " ...Variable for pointer %s not found!!\n%!" pointer); - print_pointer_vars context; - assert false - - let lookup_var_locals context procname var_name = - let stack = lookup_var_map context var_name in - let (var_name, typ, level) = Stack.top stack in - Printing.log_out " ...Variable %s found in locals!!@." (Mangled.to_string var_name); - (Sil.mk_pvar var_name procname), typ - - let lookup_var context pointer var_name kind = - let procname = Cfg.Procdesc.get_proc_name context.procdesc in - if (kind = `Var) then - try - Some (fst (lookup_var_locals context procname var_name)) - with Stack.Empty -> - try - Some (fst (lookup_var_globals context procname var_name)) - with Not_found -> - if is_captured_var context var_name then - try (* if it's a captured variable we need to look at the parameters list*) - Some (fst (lookup_var_formals context procname var_name)) - with Not_found -> - Printing.log_err "Variable %s not found!!\n%!" var_name; - print_locals context; - None - else None - else if (kind = `ParmVar) then - try - Some (fst (lookup_var_formals context procname var_name)) - with Not_found -> - let list_to_string = list_to_string (fun (a, typ) -> a^":"^(Sil.typ_to_string typ)) in - Printing.log_err "Warning: Parameter %s not found!!\n%!" var_name; - Printing.log_err "Formals of procdesc %s" (Procname.to_string procname); - Printing.log_err " are %s\n%!" (list_to_string (Cfg.Procdesc.get_formals context.procdesc)); - Printing.print_failure_info pointer; - assert false - else if (kind = `Function || kind = `ImplicitParam) then ( - (* ImplicitParam are 'self' and '_cmd'. These are never defined but they can be referred to in the code. *) - Printing.log_err "Creating a variable for '%s' \n%!" var_name; - Some (Sil.mk_pvar (Mangled.from_string var_name) procname)) - else if (kind = `EnumConstant) then - (Printing.print_failure_info pointer; - assert false) - else (Printing.log_err "WARNING: In lookup_var kind %s not handled. Giving up!\n%!" (Clang_ast_j.string_of_decl_kind kind); - Printing.print_failure_info pointer; - assert false) - - let get_variable_name name = - Mangled.mangled name ((string_of_int(Block.depth ()))) - - let add_local_var context var_name typ pointer is_static = - Printing.log_out " ...Creating var %s" var_name; - Printing.log_out " with pointer %s@\n" pointer; - if not (is_global_var context var_name) || is_static then - let var = get_variable_name var_name in - context.local_vars <- context.local_vars@[(var, typ, is_static)] ; - let stack = lookup_var_map context var_name in - let procname = Cfg.Procdesc.get_proc_name context.procdesc in - let pvar = Sil.mk_pvar var procname in - Stack.push (var, typ, Block.depth ()) stack; - context.local_vars_stack <- StringMap.add var_name stack context.local_vars_stack; - add_pointer_var pointer pvar context - - let reset_local_vars context = - context.local_vars <- [] - - let get_local_vars context = - context.local_vars - - let remove_top_level_local_vars context = - let remove_top var_name stack = - try - let (top_var, top_typ, top_level) = Stack.top stack in - if top_level == (Block.depth ()) then - (ignore (Stack.pop stack); - context.local_vars_stack <- - StringMap.add var_name stack context.local_vars_stack) - else () - with Stack.Empty -> () in - StringMap.iter remove_top context.local_vars_stack - - let enter_and_leave_scope context f lstmt = - Block.enter (); - f context lstmt; - remove_top_level_local_vars context; - Block.leave () - - let reset_block = Block.reset - -end - -let create_context tenv cg cfg procdesc ns curr_class is_objc_method cv outer_context_opt = +let create_context tenv cg cfg procdesc ns curr_class is_objc_method context_opt = { tenv = tenv; cg = cg; cfg = cfg; @@ -227,11 +45,7 @@ let create_context tenv cg cfg procdesc ns curr_class is_objc_method cv outer_co is_callee_expression = false; is_objc_method = is_objc_method; namespace = ns; - local_vars = []; - captured_vars = cv; - local_vars_stack = StringMap.empty; - local_vars_pointer = StringMap.empty; - outer_context = outer_context_opt; + outer_context = context_opt; blocks = [] } @@ -261,7 +75,6 @@ let rec get_curr_class context = get_curr_class outer_context | _ -> context.curr_class - let get_curr_class_name curr_class = match curr_class with | ContextCls (name, _, _) -> name @@ -304,8 +117,6 @@ let curr_class_hash curr_class = | ContextProtocol name -> Hashtbl.hash name | ContextNoCls -> Hashtbl.hash "no class" -let get_captured_vars context = context.captured_vars - let create_curr_class tenv class_name = let class_tn_name = Sil.TN_csu (Sil.Class, (Mangled.from_string class_name)) in match Sil.tenv_lookup tenv class_tn_name with @@ -322,3 +133,8 @@ let rec add_block context block = match context.outer_context with | Some outer_context -> add_block outer_context block | None -> () + +let rec get_outer_procname context = + match context.outer_context with + | Some outer_context -> get_outer_procname outer_context + | None -> Cfg.Procdesc.get_proc_name context.procdesc diff --git a/infer/src/clang/cContext.mli b/infer/src/clang/cContext.mli index e7ca8cd09..3a5e417a5 100644 --- a/infer/src/clang/cContext.mli +++ b/infer/src/clang/cContext.mli @@ -10,9 +10,6 @@ (** Contains current class and current method to be translated as well as local variables, *) (** and the cg, cfg, and tenv corresponding to the current file. *) -type varMap -type pointerVarMap - type curr_class = | ContextCls of string * string option * string list (*class name and name of (optional) super class , and a list of protocols *) @@ -30,25 +27,10 @@ type t = curr_class: curr_class; is_callee_expression : bool; namespace: string option; (* contains the name of the namespace if we are in the scope of one*) - mutable local_vars : (Mangled.t * Sil.typ * bool) list; (* (name, type, is_static flag) *) - mutable captured_vars : (Mangled.t * Sil.typ * bool) list; (* (name, type, is_static flag) *) - mutable local_vars_stack : varMap; - mutable local_vars_pointer : pointerVarMap; outer_context : t option; (* in case of objc blocks, the context of the method containing the block *) - mutable blocks : Procname.t list (* List of blocks defined in this method *) + mutable blocks: Procname.t list; (* List of blocks defined in this method *) } -module LocalVars : -sig - val find_var_with_pointer : t -> string -> Sil.pvar - val lookup_var: t -> string -> string -> Clang_ast_t.decl_kind -> Sil.pvar option - val add_pointer_var : string -> Sil.pvar -> t -> unit - val enter_and_leave_scope : t -> (t -> 'a -> 'b) -> 'a -> unit - val add_local_var : t -> string -> Sil.typ -> string -> bool -> unit - val reset_block : unit -> unit - val add_pointer_var : string -> Sil.pvar -> t -> unit -end - val get_procdesc : t -> Cfg.Procdesc.t val get_cfg : t -> Cfg.cfg @@ -72,10 +54,12 @@ val is_objc_method : t -> bool val get_tenv : t -> Sil.tenv val create_context : Sil.tenv -> Cg.t -> Cfg.cfg -> Cfg.Procdesc.t -> - string option -> curr_class -> bool -> (Mangled.t * Sil.typ * bool) list -> t option -> t + string option -> curr_class -> bool -> t option -> t val create_curr_class : Sil.tenv -> string -> curr_class val add_block : t -> Procname.t -> unit val is_objc_instance : t -> bool + +val get_outer_procname : t -> Procname.t diff --git a/infer/src/clang/cEnum_decl.ml b/infer/src/clang/cEnum_decl.ml index 43fcf6a91..8bab57c39 100644 --- a/infer/src/clang/cEnum_decl.ml +++ b/infer/src/clang/cEnum_decl.ml @@ -51,7 +51,7 @@ let enum_decl name tenv cfg cg namespace type_ptr decl_list opt_type = Printing.log_out "ADDING: EnumDecl '%s'\n" name; let context' = CContext.create_context tenv cg cfg !global_procdesc namespace CContext.ContextNoCls - false [] None in + false None in let enum_constants = get_enum_constants context' decl_list 0 in let name = (match opt_type with (* If the type is defined it's of the kind "enum name" and we take that.*) | `Type s -> s diff --git a/infer/src/clang/cFrontend.ml b/infer/src/clang/cFrontend.ml index a4b632871..b61a30bf3 100644 --- a/infer/src/clang/cFrontend.ml +++ b/infer/src/clang/cFrontend.ml @@ -45,8 +45,7 @@ let rec translate_one_declaration tenv cg cfg namespace parent_dec dec = list_iter tranlate_method method_decls | VarDecl(decl_info, name_info, t, _) -> - let name = name_info.Clang_ast_t.ni_name in - CVar_decl.global_var_decl tenv namespace decl_info name t + Printing.log_out "Nothing to do for global variable %s " name_info.Clang_ast_t.ni_name | ObjCInterfaceDecl(decl_info, name_info, decl_list, decl_context_info, oi_decl_info) -> let name = name_info.Clang_ast_t.ni_name in @@ -125,7 +124,6 @@ let init_global_state source_file = DB.current_source := source_file; DB.Results_dir.init (); Ident.reset_name_generator (); - CGlobal_vars.reset_map (); CFrontend_config.global_translation_unit_decls := []; ObjcProperty_decl.reset_property_table (); CFrontend_utils.General_utils.reset_block_counter () diff --git a/infer/src/clang/cFrontend_config.ml b/infer/src/clang/cFrontend_config.ml index df5c37431..4e9a54448 100644 --- a/infer/src/clang/cFrontend_config.ml +++ b/infer/src/clang/cFrontend_config.ml @@ -163,3 +163,5 @@ let type_pointer_prefix = "internal_type" let nsarray_cl = "NSArray" let infer = "infer" + +let block = "block" diff --git a/infer/src/clang/cFrontend_config.mli b/infer/src/clang/cFrontend_config.mli index e8dc89686..e1bbe23a4 100644 --- a/infer/src/clang/cFrontend_config.mli +++ b/infer/src/clang/cFrontend_config.mli @@ -158,3 +158,5 @@ val type_pointer_prefix : string val nsarray_cl : string val infer : string + +val block : string diff --git a/infer/src/clang/cFrontend_utils.ml b/infer/src/clang/cFrontend_utils.ml index 5ad33def3..7d3d2d118 100644 --- a/infer/src/clang/cFrontend_utils.ml +++ b/infer/src/clang/cFrontend_utils.ml @@ -344,6 +344,8 @@ let get_fresh_block_index () = module General_utils = struct + type var_info = Clang_ast_t.decl_info * Clang_ast_t.type_ptr * Clang_ast_t.var_decl_info * bool + let rec swap_elements_list l = match l with | el1:: el2:: rest -> @@ -493,6 +495,29 @@ struct let type_name_crc = Some (CRC.crc16 type_name) in Procname.mangled_c_method class_name method_name type_name_crc + let mk_sil_var name decl_info_type_ptr_opt procname outer_procname = + let name_string = name.Clang_ast_t.ni_name in + let simple_name = Mangled.from_string name_string in + match decl_info_type_ptr_opt with + | Some (decl_info, type_ptr, var_decl_info, should_be_mangled) -> + if var_decl_info.Clang_ast_t.vdi_is_global then + let global_mangled_name = + if var_decl_info.Clang_ast_t.vdi_is_static_local then + Mangled.from_string ((Procname.to_string outer_procname) ^ "_" ^ name_string) + else simple_name in + Sil.mk_pvar_global global_mangled_name + else if not should_be_mangled then Sil.mk_pvar simple_name procname + else + let type_name = Ast_utils.string_of_type_ptr type_ptr in + let start_location = fst decl_info.Clang_ast_t.di_source_range in + let file_opt = start_location.Clang_ast_t.sl_file in + let line_opt = start_location.Clang_ast_t.sl_line in + let line_str = match line_opt with | Some line -> string_of_int line | None -> "" in + let rel_path = get_rel_file_path file_opt in + let mangled = CRC.crc16 (type_name ^ rel_path ^ line_str) in + let mangled_name = Mangled.mangled name.Clang_ast_t.ni_name mangled in + Sil.mk_pvar mangled_name procname + | None -> Sil.mk_pvar simple_name procname end diff --git a/infer/src/clang/cFrontend_utils.mli b/infer/src/clang/cFrontend_utils.mli index a4f2910ab..42350b13f 100644 --- a/infer/src/clang/cFrontend_utils.mli +++ b/infer/src/clang/cFrontend_utils.mli @@ -105,6 +105,8 @@ end module General_utils : sig + type var_info = Clang_ast_t.decl_info * Clang_ast_t.type_ptr * Clang_ast_t.var_decl_info * bool + val string_from_list : string list -> string val append_no_duplicates_fields : (Ident.fieldname * Sil.typ * Sil.item_annotation) list -> @@ -150,5 +152,6 @@ sig val mk_class_field_name : Clang_ast_t.named_decl_info -> Ident.fieldname - + val mk_sil_var : Clang_ast_t.named_decl_info -> var_info option -> Procname.t -> Procname.t -> + Sil.pvar end diff --git a/infer/src/clang/cGlobal_vars.ml b/infer/src/clang/cGlobal_vars.ml deleted file mode 100644 index dcf287166..000000000 --- a/infer/src/clang/cGlobal_vars.ml +++ /dev/null @@ -1,57 +0,0 @@ -(* - * Copyright (c) 2013 - 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 CFrontend_utils -module L = Logging - -type t = { - _name : Sil.pvar; - _type : Sil.typ -} - -let var_get_name var = - var._name - -let var_get_typ var = - var._type - -module MangledMap = Map.Make (struct - type t = Mangled.t - let compare = Mangled.compare end) - -type varMap = t MangledMap.t - -let varMap = ref MangledMap.empty - -let make_var name typ = - { _name = name; - _type = typ } - -let add name typ = - let name = (Mangled.from_string name) in - let pvar = Sil.mk_pvar_global name in - Printing.log_out "Adding global variable %s !!@." (Sil.pvar_to_string pvar); - let var_el = make_var pvar typ in - varMap := MangledMap.add name var_el !varMap - -let find var = - MangledMap.find var !varMap - -let reset_map () = - varMap := MangledMap.empty - -let print_map () = - let print_item key value = - L.out "%a ->%a:%a@." - Mangled.pp key - (Sil.pp_pvar Utils.pe_text) value._name - (Sil.pp_typ_full Utils.pe_text) value._type in - if !CFrontend_config.debug_mode then - (L.out "GLOBAL VARS:@."; - MangledMap.iter print_item !varMap) diff --git a/infer/src/clang/cGlobal_vars.mli b/infer/src/clang/cGlobal_vars.mli deleted file mode 100644 index ecaa09e48..000000000 --- a/infer/src/clang/cGlobal_vars.mli +++ /dev/null @@ -1,22 +0,0 @@ -(* - * Copyright (c) 2013 - 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. - *) - -type t - -val add : string -> Sil.typ -> unit - -val find : Mangled.t -> t - -val reset_map : unit -> unit - -val var_get_name : t -> Sil.pvar - -val var_get_typ : t -> Sil.typ - -val print_map : unit -> unit diff --git a/infer/src/clang/cMethod_decl.ml b/infer/src/clang/cMethod_decl.ml index ea62d7af8..bd7d89334 100644 --- a/infer/src/clang/cMethod_decl.ml +++ b/infer/src/clang/cMethod_decl.ml @@ -49,19 +49,14 @@ struct if (Cfg.Procdesc.is_defined procdesc && not (model_exists procname)) then (let context = CContext.create_context tenv cg cfg procdesc namespace class_decl_opt - is_objc_method captured_vars outer_context_opt in - CVar_decl.get_fun_locals context instrs; - let local_vars = list_map (fun (n, t, _) -> n, t) context.CContext.local_vars in + is_objc_method outer_context_opt in let start_node = Cfg.Procdesc.get_start_node procdesc in let exit_node = Cfg.Procdesc.get_exit_node procdesc in - Cfg.Procdesc.append_locals procdesc local_vars; - Cfg.Node.add_locals_ret_declaration start_node local_vars; Printing.log_out "\n\n>>---------- Start translating body of function: '%s' ---------<<\n@." (Procname.to_string procname); let meth_body_nodes = T.instructions_trans context instrs extra_instrs exit_node in - let is_anonym_block = Option.is_some outer_context_opt in - if (not is_anonym_block) then CContext.LocalVars.reset_block (); + Cfg.Node.add_locals_ret_declaration start_node (Cfg.Procdesc.get_locals procdesc); Cfg.Node.set_succs_exn start_node meth_body_nodes []; Cg.add_node (CContext.get_cg context) (Cfg.Procdesc.get_proc_name procdesc)) | None -> ()) diff --git a/infer/src/clang/cMethod_trans.ml b/infer/src/clang/cMethod_trans.ml index 768da037f..dace4f18c 100644 --- a/infer/src/clang/cMethod_trans.ml +++ b/infer/src/clang/cMethod_trans.ml @@ -208,35 +208,6 @@ let get_formal_parameters tenv ms = (name, typ):: defined_parameters pl' in defined_parameters (CMethod_signature.ms_get_args ms) -(* Returns a list of captured variables. *) -(* In order to get the right mangled name we search among *) -(* the local variables of the defining function and it's formals.*) -let captured_vars_from_block_info context cvl = - let formal2captured (s, t) = - (Mangled.from_string s, t, false) in - let find lv n = - try - list_find (fun (n', _, _) -> Mangled.to_string n' = n) lv - with Not_found -> Printing.log_err "Trying to find variable %s@." n; assert false in - let rec f cvl' = - match cvl' with - | [] -> [] - | cv:: cvl'' -> - (match cv.Clang_ast_t.bcv_variable with - | Some dr -> - (match dr.Clang_ast_t.dr_name, dr.Clang_ast_t.dr_type_ptr with - | Some name_info, _ -> - let n = name_info.Clang_ast_t.ni_name in - if n = CFrontend_config.self && not (CContext.is_objc_instance context) then [] - else - (let procdesc_formals = Cfg.Procdesc.get_formals context.CContext.procdesc in - (Printing.log_err "formals are %s@." (Utils.list_to_string (fun (x, _) -> x) procdesc_formals)); - let formals = list_map formal2captured procdesc_formals in - [find (context.CContext.local_vars @ formals) n]) - | _ -> assert false) - | None -> []) :: f cvl'' in - list_flatten (f cvl) - let get_return_type tenv ms = let return_type = CMethod_signature.ms_get_ret_type ms in CTypes_decl.type_ptr_to_sil_type tenv return_type diff --git a/infer/src/clang/cMethod_trans.mli b/infer/src/clang/cMethod_trans.mli index 72f2907fc..db48cfb33 100644 --- a/infer/src/clang/cMethod_trans.mli +++ b/infer/src/clang/cMethod_trans.mli @@ -25,8 +25,6 @@ val create_local_procdesc : Cfg.cfg -> Sil.tenv -> CMethod_signature.method_sign val create_external_procdesc : Cfg.cfg -> Procname.t -> bool -> (Sil.typ * Sil.typ list) option -> unit -val captured_vars_from_block_info : CContext.t -> Clang_ast_t.block_captured_variable list -> (Mangled.t * Sil.typ * bool) list - val get_class_selector_instance : CContext.t -> Clang_ast_t.obj_c_message_expr_info -> (Sil.exp * Sil.typ) list -> (string * string * Clang_ast_t.pointer option * method_call_type) diff --git a/infer/src/clang/cTrans.ml b/infer/src/clang/cTrans.ml index 9ec5b59f1..f8c9d9dc9 100644 --- a/infer/src/clang/cTrans.ml +++ b/infer/src/clang/cTrans.ml @@ -301,64 +301,71 @@ struct let name = get_name_decl_ref_exp_info decl_ref_expr_info stmt_info in let procname = Cfg.Procdesc.get_proc_name context.procdesc in let pointer = CTrans_utils.get_decl_pointer decl_ref_expr_info in - let is_function = - match get_decl_kind decl_ref_expr_info with - | `Function -> true - | _ -> false in - if is_enumeration_constant d then ( - let const_exp = (match CTypes.search_enum_type_by_name context.tenv name with - | Some v -> - let ce = Sil.Const v in - Printing.log_out " ....Found enum constant '%s', " name; - Printing.log_out "replacing with integer '%s' \n" (Sil.exp_to_string ce); ce - | None -> - Printing.log_stats - " WARNING: Found enum constant '%s', but its value was not found in the tenv. Returning 0.\n" name; - (Sil.Const(Sil.Cint Sil.Int.zero))) in - { root_nodes = []; leaf_nodes = []; ids = []; instrs = []; exps = [(const_exp, typ)]} - ) else if is_function then ( - let pname = - if CTrans_models.is_modeled_builtin name then - Procname.from_string_c_fun (CFrontend_config.infer ^ name) - else CMethod_trans.create_procdesc_with_pointer context pointer None name tp in - let address_of_function = not context.CContext.is_callee_expression in - (* If we are not translating a callee expression, then the address of the function is being taken.*) - (* As e.g. in fun_ptr = foo; *) - let non_mangled_func_name = - if name = CFrontend_config.malloc && - (!CFrontend_config.language = CFrontend_config.OBJC || - !CFrontend_config.language = CFrontend_config.OBJCPP) then - SymExec.ModelBuiltins.malloc_no_fail - else Procname.from_string_c_fun name in - let is_builtin = SymExec.function_is_builtin non_mangled_func_name in - if is_builtin then (* malloc, free, exit, scanf, ... *) - { empty_res_trans with exps = [(Sil.Const (Sil.Cfun non_mangled_func_name), typ)] } - else - begin - if address_of_function then Cfg.set_procname_priority context.cfg pname; - { empty_res_trans with exps = [(Sil.Const (Sil.Cfun pname), typ)] } - end - ) else ( - let pvar = - if not (Utils.string_is_prefix CFrontend_config.pointer_prefix stmt_info.Clang_ast_t.si_pointer) then - try - CContext.LocalVars.find_var_with_pointer context stmt_info.Clang_ast_t.si_pointer - with _ -> assert false - else Sil.mk_pvar (Mangled.from_string name) procname in - let e = Sil.Lvar pvar in - let exps = - if Self.is_var_self pvar (CContext.is_objc_method context) then - let curr_class = CContext.get_curr_class context in - if (CTypes.is_class typ) then - raise (Self.SelfClassException (CContext.get_curr_class_name curr_class)) - else - let typ = CTypes.add_pointer_to_typ - (CTypes_decl.get_type_curr_class context.tenv curr_class) in - [(e, typ)] - else [(e, typ)] in - Printing.log_out "\n\n PVAR ='%s'\n\n" (Sil.pvar_to_string pvar); - { empty_res_trans with exps = exps } - ) + let decl_kind = get_decl_kind decl_ref_expr_info in + match decl_kind with + | `EnumConstant -> + let const_exp = (match CTypes.search_enum_type_by_name context.tenv name with + | Some v -> + let ce = Sil.Const v in + Printing.log_out " ....Found enum constant '%s', " name; + Printing.log_out "replacing with integer '%s' \n" (Sil.exp_to_string ce); ce + | None -> + Printing.log_out + "WARNING: Found enum constant '%s', but its value was not found in the tenv.\n" + name; + (Sil.Const(Sil.Cint Sil.Int.zero))) in + { root_nodes = []; leaf_nodes = []; ids = []; instrs = []; exps = [(const_exp, typ)]} + | `Function -> + let pname = + if CTrans_models.is_modeled_builtin name then + Procname.from_string_c_fun (CFrontend_config.infer ^ name) + else CMethod_trans.create_procdesc_with_pointer context pointer None name tp in + let address_of_function = not context.CContext.is_callee_expression in + (* If we are not translating a callee expression, *) + (* then the address of the function is being taken.*) + (* As e.g. in fun_ptr = foo; *) + let non_mangled_func_name = + if name = CFrontend_config.malloc && + (!CFrontend_config.language = CFrontend_config.OBJC || + !CFrontend_config.language = CFrontend_config.OBJCPP) then + SymExec.ModelBuiltins.malloc_no_fail + else Procname.from_string_c_fun name in + let is_builtin = SymExec.function_is_builtin non_mangled_func_name in + if is_builtin then (* malloc, free, exit, scanf, ... *) + { empty_res_trans with exps = [(Sil.Const (Sil.Cfun non_mangled_func_name), typ)] } + else + begin + if address_of_function then Cfg.set_procname_priority context.cfg pname; + { empty_res_trans with exps = [(Sil.Const (Sil.Cfun pname), typ)] } + end + | `Var | `ImplicitParam | `ParmVar -> + let pvar = + match decl_ref_expr_info.Clang_ast_t.drti_decl_ref with + | Some decl_ref -> CVar_decl.sil_var_of_decl_ref context decl_ref procname + | None -> assert false in + let e = Sil.Lvar pvar in + let exps = + if Self.is_var_self pvar (CContext.is_objc_method context) then + let curr_class = CContext.get_curr_class context in + if (CTypes.is_class typ) then + raise (Self.SelfClassException (CContext.get_curr_class_name curr_class)) + else + let typ = CTypes.add_pointer_to_typ + (CTypes_decl.get_type_curr_class context.tenv curr_class) in + [(e, typ)] + else [(e, typ)] in + Printing.log_out "\n\n PVAR ='%s'\n\n" (Sil.pvar_to_string pvar); + { empty_res_trans with exps = exps } + | _ -> + let print_error decl_kind = + Printing.log_stats + "Warning: Decl ref expression %s with pointer %s still needs to be translated " + (Clang_ast_j.string_of_decl_kind decl_kind) + pointer in + match decl_kind with + | `CXXMethod -> print_error decl_kind; assert false + | _ -> print_error decl_kind; assert false + let cxxThisExpr_trans trans_state stmt_info expr_info = let context = trans_state.context in @@ -431,6 +438,7 @@ struct and binaryOperator_trans trans_state binary_operator_info stmt_info expr_info stmt_list = let open Clang_ast_t in + let procname = Cfg.Procdesc.get_proc_name trans_state.context.CContext.procdesc in let bok = (Clang_ast_j.string_of_binary_operator_kind binary_operator_info.Clang_ast_t.boi_kind) in Printing.log_out " BinaryOperator '%s' " bok; Printing.log_out " priority node free = '%s'\n@." @@ -442,10 +450,11 @@ struct let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv expr_info.Clang_ast_t.ei_type_ptr in (match stmt_list with | [s1; ImplicitCastExpr (stmt, [CompoundLiteralExpr (cle_stmt_info, stmts, expr_info)], _, cast_expr_info)] -> - let di, line_number = get_decl_ref_info s1 parent_line_number in + let decl_ref, line_number = get_decl_ref_info s1 parent_line_number in let line_number = CLocation.get_line cle_stmt_info line_number in let trans_state' = { trans_state with parent_line_number = line_number } in - let res_trans_tmp = initListExpr_trans trans_state' stmt_info expr_info di stmts in + let pvar = CVar_decl.sil_var_of_decl_ref context decl_ref procname in + let res_trans_tmp = initListExpr_trans trans_state' stmt_info expr_info stmts pvar in { res_trans_tmp with leaf_nodes =[]} | [s1; s2] -> (* Assumption: We expect precisely 2 stmt corresponding to the 2 operands*) let rhs_owning_method = CTrans_utils.is_owning_method s2 in @@ -473,7 +482,7 @@ struct let instrs_after_assign, assign_ids, exp_to_parent = if (is_binary_assign_op binary_operator_info) - && ((not creating_node) || (is_return_temp trans_state.continuation)) then ( + && ((not creating_node) || (is_return_temp trans_state.continuation)) then ( (* We are in this case when an assignment is inside *) (* another operator that creates a node. Eg. another *) (* assignment. *) @@ -756,7 +765,6 @@ struct Printing.log_out "\n Call to a dispatch function treated as special case...\n"; let procname = Cfg.Procdesc.get_proc_name trans_state.context.CContext.procdesc in let pvar = CFrontend_utils.General_utils.get_next_block_pvar procname in - CContext.LocalVars.add_pointer_var stmt_info.Clang_ast_t.si_pointer pvar trans_state.context; let transformed_stmt, tp = Ast_expressions.translate_dispatch_function (Sil.pvar_to_string pvar) stmt_info stmt_list ei n in let typ = CTypes_decl.type_ptr_to_sil_type trans_state.context.CContext.tenv tp in @@ -771,8 +779,6 @@ struct and block_enumeration_trans trans_state stmt_info stmt_list ei = let declare_nullify_vars loc res_state roots preds (pvar, typ) = - (* Add declare locals to the first node *) - list_iter (fun n -> Cfg.Node.prepend_instrs_temps n [Sil.Declare_locals([(pvar, typ)], loc)] []) roots; (* Add nullify of the temp block var to the last node (predecessor or the successor nodes)*) list_iter (fun n -> Cfg.Node.append_instrs_temps n [Sil.Nullify(pvar, loc, true)] []) preds in @@ -784,7 +790,6 @@ struct let pvars_types = list_map (fun (v, pointer, tp) -> let pvar = Sil.mk_pvar (Mangled.from_string v) procname in let typ = CTypes_decl.type_ptr_to_sil_type trans_state.context.CContext.tenv tp in - CContext.LocalVars.add_pointer_var pointer pvar trans_state.context; (pvar, typ)) vars_to_register in let loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number trans_state.context in let res_state = instruction trans_state transformed_stmt in @@ -1217,6 +1222,9 @@ struct { empty_res_trans with root_nodes = root_nodes; leaf_nodes = leaf_nodes } and objCForCollectionStmt_trans trans_state item items body stmt_info = + let _ = instruction trans_state item in + (* Here we do ast transformation, so we don't need the value of the translation of the *) + (* variable item but we still need to add the variable to the locals *) let bin_op = Ast_expressions.make_next_object_exp stmt_info item items in let while_kind = Loops.While (bin_op, body) in let root_nodes, leaf_nodes = loop_instruction trans_state while_kind stmt_info in @@ -1274,7 +1282,7 @@ struct exps = exp_to_parent' } | _ -> assert false) (* Compound assign statement should have two operands*) - and initListExpr_trans trans_state stmt_info expr_info di_pointer stmts = + and initListExpr_trans trans_state stmt_info expr_info stmts pvar = let context = trans_state.context in let succ_nodes = trans_state.succ_nodes in let rec collect_right_hand_exprs ts stmt = match stmt with @@ -1319,7 +1327,6 @@ struct | _ -> [ [(e, typ)] ] in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in let var_type = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv expr_info.Clang_ast_t.ei_type_ptr in - let pvar = CContext.LocalVars.find_var_with_pointer context di_pointer in let lh = list_flatten (collect_left_hand_exprs (Sil.Lvar pvar) var_type Utils.StringSet.empty) in let rh = list_flatten (list_map (collect_right_hand_exprs trans_state_pri) stmts ) in if (list_length rh != list_length lh) then ( @@ -1369,8 +1376,14 @@ struct and collect_all_decl trans_state var_decls next_nodes stmt_info = let open Clang_ast_t in let context = trans_state.context in + let procdesc = context.CContext.procdesc in + let procname = Cfg.Procdesc.get_proc_name procdesc in let pln = trans_state.parent_line_number in let do_var_dec (di, var_name, type_ptr, vdi) next_node = + let var_decl = VarDecl (di, var_name, type_ptr, vdi) in + let pvar = CVar_decl.sil_var_of_decl context var_decl procname in + let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv type_ptr in + CVar_decl.add_var_to_locals procdesc var_decl typ pvar; match vdi.Clang_ast_t.vdi_init_expr with | None -> { empty_res_trans with root_nodes = next_node } (* Nothing to do if no init expression *) | Some (ImplicitValueInitExpr (_, stmt_list, _)) -> @@ -1382,7 +1395,7 @@ struct { empty_res_trans with root_nodes = next_node } | Some (InitListExpr (stmt_info , stmts , expr_info)) | Some (ExprWithCleanups (_, [InitListExpr (stmt_info , stmts , expr_info)], _, _)) -> - initListExpr_trans trans_state stmt_info expr_info di.Clang_ast_t.di_pointer stmts + initListExpr_trans trans_state stmt_info expr_info stmts pvar | Some ie -> (*For init expr, translate how to compute it and assign to the var*) let sil_loc = CLocation.get_sil_location stmt_info pln context in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in @@ -1393,7 +1406,6 @@ struct Cfg.Node.set_succs_exn node next_node []; [node] ) else next_node in - let pvar = CContext.LocalVars.find_var_with_pointer context di.Clang_ast_t.di_pointer in let line_number = CLocation.get_line stmt_info pln in (* if ie is a block the translation need to be done with the block special cases by exec_with_block_priority*) let res_trans_ie = @@ -1706,7 +1718,7 @@ struct let sil_loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number trans_state.context in let fname = SymExec.ModelBuiltins.__objc_release_autorelease_pool in let ret_id = Ident.create_fresh Ident.knormal in - let autorelease_pool_vars = compute_autorelease_pool_vars trans_state.context stmts in + let autorelease_pool_vars = CVar_decl.compute_autorelease_pool_vars trans_state.context stmts in let stmt_call = Sil.Call([ret_id], (Sil.Const (Sil.Cfun fname)), autorelease_pool_vars, sil_loc, Sil.cf_default) in let node_kind = Cfg.Node.Stmt_node ("Release the autorelease pool") in let call_node = create_node node_kind ([ret_id]) ([stmt_call]) sil_loc trans_state.context in @@ -1759,23 +1771,19 @@ struct (* We need to set the explicit dependency between the newly created block and the *) (* defining procedure. We add an edge in the call graph.*) Cg.add_edge context.cg procname block_pname; - let static_locals = list_filter (fun (v, t, s) -> s = true) context.local_vars in - (*list_iter (fun (v, _, _) -> L.err "Static Locals %s@." (Mangled.to_string v)) static_locals;*) - let static_formals = list_filter (fun (v, t, s) -> s = true) context.captured_vars in - (*list_iter (fun (v, _, _) -> L.err "Formal Static %s@." (Mangled.to_string v)) static_formals;*) - let static_vars = static_locals @ static_formals in - let captured_vars = - (CMethod_trans.captured_vars_from_block_info context block_decl_info.Clang_ast_t.bdi_captured_variables) in - let all_captured_vars = captured_vars @ static_vars in - let ids_instrs = list_map assign_captured_var all_captured_vars in + let captured_block_vars = block_decl_info.Clang_ast_t.bdi_captured_variables in + let captured_vars = CVar_decl.captured_vars_from_block_info context captured_block_vars in + let ids_instrs = list_map assign_captured_var captured_vars in let ids, instrs = list_split ids_instrs in - let block_data = (context, type_ptr, block_pname, all_captured_vars) in + let block_data = (context, type_ptr, block_pname, captured_vars) in CContext.add_block context block_pname; M.function_decl context.tenv context.cfg context.cg context.namespace decl (Some block_data); Cfg.set_procname_priority context.cfg block_pname; let captured_exps = list_map (fun id -> Sil.Var id) ids in let tu = Sil.Ctuple ((Sil.Const (Sil.Cfun block_pname)) :: captured_exps) in - let alloc_block_instr, ids_block = allocate_block trans_state (Procname.to_string block_pname) all_captured_vars loc in + let block_name = Procname.to_string block_pname in + let alloc_block_instr, ids_block = + allocate_block trans_state block_name captured_vars loc in { empty_res_trans with ids = ids_block @ ids; instrs = alloc_block_instr @ instrs; exps = [(Sil.Const tu, typ)]} | _ -> assert false diff --git a/infer/src/clang/cTrans_utils.ml b/infer/src/clang/cTrans_utils.ml index 805e93c66..00af5f767 100644 --- a/infer/src/clang/cTrans_utils.ml +++ b/infer/src/clang/cTrans_utils.ml @@ -622,13 +622,16 @@ let rec is_method_call s = let rec get_decl_ref_info s parent_line_number = match s with | Clang_ast_t.DeclRefExpr (stmt_info, stmt_list, expr_info, decl_ref_expr_info) -> - let line_number = CLocation.get_line stmt_info parent_line_number in - stmt_info.Clang_ast_t.si_pointer, line_number - | _ -> (match Clang_ast_proj.get_stmt_tuple s with + (let line_number = CLocation.get_line stmt_info parent_line_number in + match decl_ref_expr_info.Clang_ast_t.drti_decl_ref with + | Some decl_ref -> decl_ref, line_number + | None -> assert false) + | _ -> + match Clang_ast_proj.get_stmt_tuple s with | stmt_info, [] -> assert false | stmt_info, s'':: _ -> let line_number = CLocation.get_line stmt_info parent_line_number in - get_decl_ref_info s'' line_number) + get_decl_ref_info s'' line_number let rec contains_opaque_value_expr s = match s with @@ -637,25 +640,6 @@ let rec contains_opaque_value_expr s = | [] -> false | s'':: _ -> contains_opaque_value_expr s'' -let rec compute_autorelease_pool_vars context stmts = - match stmts with - | [] -> [] - | Clang_ast_t.DeclRefExpr (si, sl, ei, drei):: stmts' -> - let name = get_name_decl_ref_exp_info drei si in - let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in - let local_vars = Cfg.Procdesc.get_locals context.CContext.procdesc in - let mname = try - list_filter (fun (m, t) -> Mangled.to_string m = name) local_vars - with _ -> [] in - (match mname with - | [(m, t)] -> - CFrontend_utils.General_utils.append_no_duplicated_pvars - [(Sil.Lvar (Sil.mk_pvar m procname), t)] (compute_autorelease_pool_vars context stmts') - | _ -> compute_autorelease_pool_vars context stmts') - | s :: stmts' -> - let sl = snd(Clang_ast_proj.get_stmt_tuple s) in - compute_autorelease_pool_vars context (sl @ stmts') - (* checks if a unary operator is a logic negation applied to integers*) let is_logical_negation_of_int tenv ei uoi = match CTypes_decl.type_ptr_to_sil_type tenv ei.Clang_ast_t.ei_type_ptr, uoi.Clang_ast_t.uoi_kind with diff --git a/infer/src/clang/cTrans_utils.mli b/infer/src/clang/cTrans_utils.mli index 8493cb32f..d8c5fe2cf 100644 --- a/infer/src/clang/cTrans_utils.mli +++ b/infer/src/clang/cTrans_utils.mli @@ -97,7 +97,7 @@ val is_method_call : Clang_ast_t.stmt -> bool val contains_opaque_value_expr : Clang_ast_t.stmt -> bool -val get_decl_ref_info : Clang_ast_t.stmt -> int -> string * int +val get_decl_ref_info : Clang_ast_t.stmt -> int -> Clang_ast_t.decl_ref * int val builtin_trans : trans_state -> Location.t -> Clang_ast_t.stmt_info -> Sil.typ -> Procname.t option -> trans_result option @@ -209,8 +209,6 @@ sig val is_var_self : Sil.pvar -> bool -> bool end -val compute_autorelease_pool_vars : CContext.t -> Clang_ast_t.stmt list -> (Sil.exp * Sil.typ) list - val is_logical_negation_of_int : Sil.tenv -> Clang_ast_t.expr_info -> Clang_ast_t.unary_operator_info -> bool val is_dispatch_function : Clang_ast_t.stmt list -> int option diff --git a/infer/src/clang/cTypes.ml b/infer/src/clang/cTypes.ml index b2fc1be02..4f3df9d7b 100644 --- a/infer/src/clang/cTypes.ml +++ b/infer/src/clang/cTypes.ml @@ -16,32 +16,6 @@ module L = Logging let get_type_from_expr_info ei = ei.Clang_ast_t.ei_type_ptr -let lookup_var_type context pvar = - let formals = Cfg.Procdesc.get_formals context.CContext.procdesc in - let locals = Cfg.Procdesc.get_locals context.CContext.procdesc in - try - let s, t = list_find (fun (s, t) -> s = (Sil.pvar_to_string pvar)) formals in - Printing.log_out "When looking for type of variable '%s' " (Sil.pvar_to_string pvar); - Printing.log_out "found '%s' in formals.@." (Sil.typ_to_string t); - t - with Not_found -> - try - let s, t = list_find (fun (s, t) -> Mangled.equal (Sil.pvar_get_name pvar) s) locals in - Printing.log_out "When looking for type of variable '%s' " (Sil.pvar_to_string pvar); - Printing.log_out "found '%s' in locals.@." (Sil.typ_to_string t); - t - with Not_found -> - try - let typ = CGlobal_vars.var_get_typ (CGlobal_vars.find (Sil.pvar_get_name pvar)) in - Printing.log_out "When looking for type of variable '%s'" (Sil.pvar_to_string pvar); - Printing.log_out " found '%s' in globals.@." (Sil.typ_to_string typ); - typ - with Not_found -> - Printing.log_err - "WARNING: Variable '%s' not found in local+formal when looking for its type. Returning void.\n%!" - (Sil.pvar_to_string pvar); - Sil.Tvoid - let get_name_from_struct s = match s with | Sil.Tstruct(_, _, _, Some n, _, _, _) -> n diff --git a/infer/src/clang/cTypes.mli b/infer/src/clang/cTypes.mli index f2db931dc..85b06ea9f 100644 --- a/infer/src/clang/cTypes.mli +++ b/infer/src/clang/cTypes.mli @@ -9,8 +9,6 @@ (** Utility module for retrieving types *) -val lookup_var_type : CContext.t -> Sil.pvar -> Sil.typ - val add_pointer_to_typ : Sil.typ -> Sil.typ val search_enum_type_by_name : Sil.tenv -> string -> Sil.const option diff --git a/infer/src/clang/cVar_decl.ml b/infer/src/clang/cVar_decl.ml index 98e84e23f..f3fbe7443 100644 --- a/infer/src/clang/cVar_decl.ml +++ b/infer/src/clang/cVar_decl.ml @@ -15,160 +15,89 @@ open CFrontend_utils module L = Logging -(* For a variable declaration it return/construct the type *) -let get_var_type tenv name t = - let typ = CTypes_decl.type_ptr_to_sil_type tenv t in - Printing.log_out " Getting/Defining type for variable '%s'" name; - Printing.log_out " as sil type '%s'\n" (Sil.typ_to_string typ); - typ +let is_custom_var_pointer pointer = + Utils.string_is_prefix CFrontend_config.pointer_prefix pointer -(* NOTE: Currently we use this function to avoid certain C++ global variable definition defined *) -(* in traits and config files.*) -(* We recogneze them because these declaration have di_parent_pointer and di_previous_decl defined*) -let global_to_be_added di = - (di.Clang_ast_t.di_parent_pointer = None) && (di.Clang_ast_t.di_previous_decl =`None) - -let global_var_decl tenv namespace decl_info name t = - Printing.log_out "PASSING: VarDecl for '%s' to global procdesc" name; - Printing.log_out " pointer= '%s'\n" decl_info.Clang_ast_t.di_pointer; - if global_to_be_added decl_info then ( - let typ = get_var_type tenv name t in - Printing.log_out " >>> Adding entry to global procdesc: ('%s', " name; - Printing.log_out "'%s')\n" (Sil.typ_to_string typ); - CGlobal_vars.add name typ) - else Printing.log_out "SKIPPING VarDecl for '%s'\n" name - -let rec lookup_ahead_for_vardecl context pointer var_name kind decl_list = - match decl_list with - | [] -> Printing.log_out " Failing when looking ahead for variable '%s'\n" var_name; - assert false (* nothing has been found ahead, maybe something bad in the AST *) - | Clang_ast_t.VarDecl (decl_info, var_info, t, _) :: rest - when var_name = var_info.Clang_ast_t.ni_name -> - let var_name' = var_info.Clang_ast_t.ni_name in - if global_to_be_added decl_info then ( - let tenv = CContext.get_tenv context in - Printing.log_out "ADDING (later-defined): VarDecl '%s' to global procdesc\n" var_name'; - let typ = get_var_type tenv var_name' t in - Printing.log_out " >>> Adding (later-defined) entry to global procdesc: ('%s', " var_name'; - Printing.log_out "'%s')\n" (Sil.typ_to_string typ); - CGlobal_vars.add var_name' typ; - let mangled_var_name = Mangled.from_string var_name' in - let global_var = CGlobal_vars.find mangled_var_name in - CGlobal_vars.var_get_name global_var) - else (Printing.log_out "SKIPPING VarDecl for '%s'\n" var_name; - lookup_ahead_for_vardecl context pointer var_name kind rest) - | _ :: rest -> - lookup_ahead_for_vardecl context pointer var_name kind rest - -let lookup_var_static_globals context name = - let remove_separator s = - match Str.split (Str.regexp_string Config.anonymous_block_num_sep) s with - | s'':: _ -> s'' - | _ -> assert false in - let remove_block_prefix s = - match Str.split (Str.regexp_string Config.anonymous_block_prefix) s with - | [_; s''] -> s'' - | [s''] -> s'' - | _ -> assert false in - let remove_block_name pname = - let s = Procname.to_string pname in - let s'= remove_block_prefix s in - let s'' = if s'= s then s' - else remove_separator s' in - s'' in - let pname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in - let str_pname = remove_block_name pname in - let static_name = Sil.mk_static_local_name str_pname name in - Printing.log_out " ...Looking for variable '%s' in static globals...\n" static_name; - let var_name = Mangled.from_string static_name in - let global_var = CGlobal_vars.find var_name in - let var = CGlobal_vars.var_get_name global_var in - Printing.log_out " ...Variable '%s' found in static globals!!\n" (Sil.pvar_to_string var); - var +let sil_var_of_decl context var_decl procname = + let outer_procname = CContext.get_outer_procname context in + let open Clang_ast_t in + match var_decl with + | VarDecl (decl_info, name_info, type_ptr, var_decl_info) -> + let shoud_be_mangled = + not (is_custom_var_pointer decl_info.Clang_ast_t.di_pointer) in + let var_decl_details = Some (decl_info, type_ptr, var_decl_info, shoud_be_mangled) in + General_utils.mk_sil_var name_info var_decl_details procname outer_procname + | ParmVarDecl (decl_info, name_info, type_ptr, var_decl_info) -> + let var_decl_details = Some (decl_info, type_ptr, var_decl_info, false) in + General_utils.mk_sil_var name_info var_decl_details procname outer_procname + | _ -> assert false -let lookup_var stmt_info context pointer var_name kind = - let pvar = CContext.LocalVars.lookup_var context stmt_info.Clang_ast_t.si_pointer var_name kind in - match pvar with - | Some var -> var - | None -> - try - lookup_var_static_globals context var_name - with Not_found -> - (Printing.log_out "Looking on later-defined decls for '%s' with pointer '%s' \n" var_name stmt_info.Clang_ast_t.si_pointer; - let decl_list = !CFrontend_config.global_translation_unit_decls in - lookup_ahead_for_vardecl context pointer var_name kind decl_list ) +let sil_var_of_decl_ref context decl_ref procname = + let name = + match decl_ref.Clang_ast_t.dr_name with + | Some name_info -> name_info + | None -> assert false in + let pointer = decl_ref.Clang_ast_t.dr_decl_pointer in + match decl_ref.Clang_ast_t.dr_kind with + | `ImplicitParam -> + let outer_procname = CContext.get_outer_procname context in + General_utils.mk_sil_var name None procname outer_procname + | _ -> + if is_custom_var_pointer pointer then + Sil.mk_pvar (Mangled.from_string name.Clang_ast_t.ni_name) procname + else match Ast_utils.get_decl decl_ref.Clang_ast_t.dr_decl_pointer with + | Some var_decl -> sil_var_of_decl context var_decl procname + | None -> assert false -(* Traverses the body of the method top down and collects the *) -(* variable definitions in a map in the context. To be able to find the right variable name *) -(* in the reference instructions, all the variable names are also saved in a map from pointers *) -(* to variable names to be used in the translation of the method's body. *) -let rec get_variables_stmt context (stmt : Clang_ast_t.stmt) : unit = +let add_var_to_locals procdesc var_decl sil_typ pvar = let open Clang_ast_t in - match stmt with - | DeclStmt (_, lstmt, decl_list) -> - get_variables_decls context decl_list; - get_fun_locals context lstmt; - | DeclRefExpr (stmt_info, stmt_list, expr_info, decl_ref_expr_info) -> - (* Notice that DeclRefExpr is the reference to a declared var/function/enum... *) - (* so no declaration here *) - Printing.log_out "Collecting variables, passing from DeclRefExpr '%s'\n" - stmt_info.Clang_ast_t.si_pointer; - let var_name = CTrans_utils.get_name_decl_ref_exp_info decl_ref_expr_info stmt_info in - let kind = CTrans_utils.get_decl_kind decl_ref_expr_info in - (match kind with - | `EnumConstant | `ObjCIvar | `CXXMethod | `ObjCProperty -> () - | _ -> - let pvar = lookup_var stmt_info context stmt_info.Clang_ast_t.si_pointer var_name kind in - CContext.LocalVars.add_pointer_var stmt_info.Clang_ast_t.si_pointer pvar context) - | CompoundStmt (stmt_info, lstmt) -> - Printing.log_out "Collecting variables, passing from CompoundStmt '%s'\n" - stmt_info.Clang_ast_t.si_pointer; - CContext.LocalVars.enter_and_leave_scope context get_fun_locals lstmt - | ForStmt (stmt_info, lstmt) -> - Printing.log_out "Collecting variables, passing from ForStmt '%s'\n" - stmt_info.Clang_ast_t.si_pointer; - CContext.LocalVars.enter_and_leave_scope context get_fun_locals lstmt - | _ -> - let lstmt = Ast_utils.get_stmts_from_stmt stmt in - get_fun_locals context lstmt + match var_decl with + | VarDecl (di, var_name, type_ptr, vdi) -> + let is_block_var = + match var_name.Clang_ast_t.ni_qual_name with + | [name; qual_name] -> qual_name = CFrontend_config.block + | _ -> false in + if not vdi.Clang_ast_t.vdi_is_global && not is_block_var then + Cfg.Procdesc.append_locals procdesc [(Sil.pvar_get_name pvar, sil_typ)] + | _ -> assert false -and get_fun_locals context (stmts : Clang_ast_t.stmt list) : unit = +let rec compute_autorelease_pool_vars context stmts = + let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in match stmts with - | [] -> () - | stmt:: rest -> - (get_variables_stmt context stmt); - (get_fun_locals context rest) + | [] -> [] + | Clang_ast_t.DeclRefExpr (si, sl, ei, drei):: stmts' -> + (let res = compute_autorelease_pool_vars context stmts' in + match drei.Clang_ast_t.drti_decl_ref with + | Some decl_ref -> + (match decl_ref.Clang_ast_t.dr_type_ptr with + | Some type_ptr when decl_ref.Clang_ast_t.dr_kind = `Var -> + let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv type_ptr in + let pvar = sil_var_of_decl_ref context decl_ref procname in + if Sil.pvar_is_local pvar then + General_utils.append_no_duplicated_pvars [(Sil.Lvar pvar, typ)] res + else res + | _ -> res) + | _ -> res) + | s :: stmts' -> + let sl = snd (Clang_ast_proj.get_stmt_tuple s) in + compute_autorelease_pool_vars context (sl @ stmts') -(* Collects the local of a function. *) -and get_variables_decls context (decl_list : Clang_ast_t.decl list) : unit = - let do_one_decl decl = - let open Clang_ast_t in - match decl with - | VarDecl (decl_info, name_info, type_ptr, var_decl_info) -> - Printing.log_out "Collecting variables, passing from VarDecl '%s'\n" decl_info.Clang_ast_t.di_pointer; - let name = name_info.Clang_ast_t.ni_name in - let typ = get_var_type context.CContext.tenv name type_ptr in - (match var_decl_info.Clang_ast_t.vdi_storage_class with - | Some "static" -> - let pname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in - let static_name = (Procname.to_string pname)^"_"^name in - CGlobal_vars.add static_name typ; - let var = Sil.mk_pvar_global (Mangled.from_string static_name) in - CContext.LocalVars.add_pointer_var decl_info.Clang_ast_t.di_pointer var context - | _ -> - CContext.LocalVars.add_local_var context name typ decl_info.Clang_ast_t.di_pointer - (CFrontend_utils.General_utils.is_static_var var_decl_info)) - | CXXRecordDecl _ | RecordDecl _ -> - let typ = CTypes_decl.get_declaration_type context.CContext.tenv context.CContext.namespace decl in - CTypes_decl.add_struct_to_tenv context.CContext.tenv typ - | TypedefDecl (decl_info, name_info, opt_type, _, typedef_decl_info) -> - Printing.log_out "%s" "Skipping typedef. Will expand the type in its occurrences." - | StaticAssertDecl decl_info -> (* We do not treat Assertions. *) - Printing.log_out - "WARNING: When collecting variables, passing from StaticAssertDecl '%s'. Skipped.\n" - decl_info.Clang_ast_t.di_pointer - | _ -> Printing.log_out - "!!! When collecting locals of a function found '%s'. Cannot continue\n\n" - (Clang_ast_j.string_of_decl decl); - assert false in - list_iter do_one_decl decl_list + +(* Returns a list of captured variables as sil variables. *) +let captured_vars_from_block_info context cvl = + let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in + let sil_var_of_captured_var cv vars = + match cv.Clang_ast_t.bcv_variable with + | Some dr -> + (match dr.Clang_ast_t.dr_name, dr.Clang_ast_t.dr_type_ptr with + | Some name_info, Some type_ptr -> + let n = name_info.Clang_ast_t.ni_name in + if n = CFrontend_config.self && not (CContext.is_objc_instance context) then + vars + else + let pvar = sil_var_of_decl_ref context dr procname in + let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv type_ptr in + (Sil.pvar_get_name pvar, typ, false) :: vars + | _ -> assert false) + | _ -> assert false in + list_fold_right sil_var_of_captured_var cvl [] diff --git a/infer/src/clang/cVar_decl.mli b/infer/src/clang/cVar_decl.mli index e5a5f1b2e..b4ad0782f 100644 --- a/infer/src/clang/cVar_decl.mli +++ b/infer/src/clang/cVar_decl.mli @@ -10,8 +10,13 @@ (** Process variable declarations by saving them as local or global variables. *) (** Computes the local variables of a function or method to be added to the procdesc *) -val get_fun_locals : CContext.t -> Clang_ast_t.stmt list -> unit +val sil_var_of_decl : CContext.t -> Clang_ast_t.decl -> Procname.t -> Sil.pvar -val global_var_decl : Sil.tenv -> string option -> Clang_ast_t.decl_info -> string -> - Clang_ast_t.type_ptr -> unit +val sil_var_of_decl_ref : CContext.t -> Clang_ast_t.decl_ref -> Procname.t -> Sil.pvar +val add_var_to_locals : Cfg.Procdesc.t -> Clang_ast_t.decl -> Sil.typ -> Sil.pvar -> unit + +val compute_autorelease_pool_vars : CContext.t -> Clang_ast_t.stmt list -> (Sil.exp * Sil.typ) list + +val captured_vars_from_block_info : CContext.t -> Clang_ast_t.block_captured_variable list -> + (Mangled.t * Sil.typ * bool) list diff --git a/infer/tests/codetoanalyze/c/frontend/arithmetic/compound_assignment.c.dot b/infer/tests/codetoanalyze/c/frontend/arithmetic/compound_assignment.c.dot index 5be036182..b04cd4c67 100644 --- a/infer/tests/codetoanalyze/c/frontend/arithmetic/compound_assignment.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/arithmetic/compound_assignment.c.dot @@ -54,7 +54,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: x:double b:int \n DECLARE_LOCALS(&return,&x,&b); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&x,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int x:double \n DECLARE_LOCALS(&return,&b,&x); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&x,false); [line 10]\n " color=yellow style=filled] 1 -> 15 ; diff --git a/infer/tests/codetoanalyze/c/frontend/arithmetic/int_const.c.dot b/infer/tests/codetoanalyze/c/frontend/arithmetic/int_const.c.dot index 4bf01f503..1d641a7cb 100644 --- a/infer/tests/codetoanalyze/c/frontend/arithmetic/int_const.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/arithmetic/int_const.c.dot @@ -18,7 +18,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: a:int b:int * c:float * d:long double large_int:int overflow_int:int \n DECLARE_LOCALS(&return,&a,&b,&c,&d,&large_int,&overflow_int); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&c,false); [line 10]\n NULLIFY(&d,false); [line 10]\n NULLIFY(&large_int,false); [line 10]\n NULLIFY(&overflow_int,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: overflow_int:int large_int:int d:long double c:float * b:int * a:int \n DECLARE_LOCALS(&return,&overflow_int,&large_int,&d,&c,&b,&a); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&c,false); [line 10]\n NULLIFY(&d,false); [line 10]\n NULLIFY(&large_int,false); [line 10]\n NULLIFY(&overflow_int,false); [line 10]\n " color=yellow style=filled] 1 -> 6 ; diff --git a/infer/tests/codetoanalyze/c/frontend/arithmetic/plus_expr.c.dot b/infer/tests/codetoanalyze/c/frontend/arithmetic/plus_expr.c.dot index b884e44bd..74dec03c9 100644 --- a/infer/tests/codetoanalyze/c/frontend/arithmetic/plus_expr.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/arithmetic/plus_expr.c.dot @@ -14,7 +14,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: x:int z:int \n DECLARE_LOCALS(&return,&x,&z); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&z,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: z:int x:int \n DECLARE_LOCALS(&return,&z,&x); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&z,false); [line 10]\n " color=yellow style=filled] 1 -> 5 ; diff --git a/infer/tests/codetoanalyze/c/frontend/arithmetic/unary.c.dot b/infer/tests/codetoanalyze/c/frontend/arithmetic/unary.c.dot index 6ba616ac5..610197f7d 100644 --- a/infer/tests/codetoanalyze/c/frontend/arithmetic/unary.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/arithmetic/unary.c.dot @@ -54,7 +54,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: x:int y:int a:int b:int * \n DECLARE_LOCALS(&return,&x,&y,&a,&b); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int * a:int y:int x:int \n DECLARE_LOCALS(&return,&b,&a,&y,&x); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] 1 -> 15 ; diff --git a/infer/tests/codetoanalyze/c/frontend/comma/comma.c.dot b/infer/tests/codetoanalyze/c/frontend/comma/comma.c.dot index 5be14d300..a46467d61 100644 --- a/infer/tests/codetoanalyze/c/frontend/comma/comma.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/comma/comma.c.dot @@ -22,7 +22,7 @@ digraph iCFG { 14 [label="14: Exit comma_3 \n " color=yellow style=filled] -13 [label="13: Start comma_3\nFormals: \nLocals: a:int b:int c:int d:int \n DECLARE_LOCALS(&return,&a,&b,&c,&d); [line 22]\n NULLIFY(&a,false); [line 22]\n NULLIFY(&b,false); [line 22]\n NULLIFY(&c,false); [line 22]\n NULLIFY(&d,false); [line 22]\n " color=yellow style=filled] +13 [label="13: Start comma_3\nFormals: \nLocals: d:int c:int b:int a:int \n DECLARE_LOCALS(&return,&d,&c,&b,&a); [line 22]\n NULLIFY(&a,false); [line 22]\n NULLIFY(&b,false); [line 22]\n NULLIFY(&c,false); [line 22]\n NULLIFY(&d,false); [line 22]\n " color=yellow style=filled] 13 -> 19 ; @@ -45,7 +45,7 @@ digraph iCFG { 8 [label="8: Exit comma_2 \n " color=yellow style=filled] -7 [label="7: Start comma_2\nFormals: \nLocals: a:int b:int d:int \n DECLARE_LOCALS(&return,&a,&b,&d); [line 16]\n NULLIFY(&a,false); [line 16]\n NULLIFY(&b,false); [line 16]\n NULLIFY(&d,false); [line 16]\n " color=yellow style=filled] +7 [label="7: Start comma_2\nFormals: \nLocals: d:int b:int a:int \n DECLARE_LOCALS(&return,&d,&b,&a); [line 16]\n NULLIFY(&a,false); [line 16]\n NULLIFY(&b,false); [line 16]\n NULLIFY(&d,false); [line 16]\n " color=yellow style=filled] 7 -> 12 ; @@ -68,7 +68,7 @@ digraph iCFG { 2 [label="2: Exit comma_1 \n " color=yellow style=filled] -1 [label="1: Start comma_1\nFormals: \nLocals: a:int b:int d:int \n DECLARE_LOCALS(&return,&a,&b,&d); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&d,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start comma_1\nFormals: \nLocals: d:int b:int a:int \n DECLARE_LOCALS(&return,&d,&b,&a); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&d,false); [line 10]\n " color=yellow style=filled] 1 -> 6 ; diff --git a/infer/tests/codetoanalyze/c/frontend/conditional_operator/binary_operator.c.dot b/infer/tests/codetoanalyze/c/frontend/conditional_operator/binary_operator.c.dot index 3b2f9609f..3b75a2730 100644 --- a/infer/tests/codetoanalyze/c/frontend/conditional_operator/binary_operator.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/conditional_operator/binary_operator.c.dot @@ -193,7 +193,7 @@ digraph iCFG { 2 [label="2: Exit binop_with_side_effects \n " color=yellow style=filled] -1 [label="1: Start binop_with_side_effects\nFormals: z:int \nLocals: x1:int x2:int x3:int y1:int y2:int y3:int \n DECLARE_LOCALS(&return,&x1,&x2,&x3,&y1,&y2,&y3); [line 10]\n NULLIFY(&x1,false); [line 10]\n NULLIFY(&x2,false); [line 10]\n NULLIFY(&x3,false); [line 10]\n NULLIFY(&y1,false); [line 10]\n NULLIFY(&y2,false); [line 10]\n NULLIFY(&y3,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start binop_with_side_effects\nFormals: z:int \nLocals: y3:int y2:int y1:int x3:int x2:int x1:int \n DECLARE_LOCALS(&return,&y3,&y2,&y1,&x3,&x2,&x1); [line 10]\n NULLIFY(&x1,false); [line 10]\n NULLIFY(&x2,false); [line 10]\n NULLIFY(&x3,false); [line 10]\n NULLIFY(&y1,false); [line 10]\n NULLIFY(&y2,false); [line 10]\n NULLIFY(&y3,false); [line 10]\n " color=yellow style=filled] 1 -> 44 ; diff --git a/infer/tests/codetoanalyze/c/frontend/conditional_operator/cond2.c.dot b/infer/tests/codetoanalyze/c/frontend/conditional_operator/cond2.c.dot index 19ade5e13..9573c6473 100644 --- a/infer/tests/codetoanalyze/c/frontend/conditional_operator/cond2.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/conditional_operator/cond2.c.dot @@ -81,7 +81,7 @@ digraph iCFG { 38 [label="38: Exit bar \n " color=yellow style=filled] -37 [label="37: Start bar\nFormals: \nLocals: x:int y:int \n DECLARE_LOCALS(&return,&x,&y); [line 21]\n NULLIFY(&x,false); [line 21]\n NULLIFY(&y,false); [line 21]\n " color=yellow style=filled] +37 [label="37: Start bar\nFormals: \nLocals: y:int x:int \n DECLARE_LOCALS(&return,&y,&x); [line 21]\n NULLIFY(&x,false); [line 21]\n NULLIFY(&y,false); [line 21]\n " color=yellow style=filled] 37 -> 52 ; @@ -231,7 +231,7 @@ digraph iCFG { 2 [label="2: Exit foo \n " color=yellow style=filled] -1 [label="1: Start foo\nFormals: \nLocals: x:int y:int n:int \n DECLARE_LOCALS(&return,&x,&y,&n); [line 10]\n NULLIFY(&n,false); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start foo\nFormals: \nLocals: n:int y:int x:int \n DECLARE_LOCALS(&return,&n,&y,&x); [line 10]\n NULLIFY(&n,false); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] 1 -> 36 ; diff --git a/infer/tests/codetoanalyze/c/frontend/conditional_operator/if_short_circuit.c.dot b/infer/tests/codetoanalyze/c/frontend/conditional_operator/if_short_circuit.c.dot index 724aa462c..cf5ddc6ee 100644 --- a/infer/tests/codetoanalyze/c/frontend/conditional_operator/if_short_circuit.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/conditional_operator/if_short_circuit.c.dot @@ -137,7 +137,7 @@ digraph iCFG { 61 [label="61: Exit main \n " color=yellow style=filled] -60 [label="60: Start main\nFormals: \nLocals: spec:char * block_size:char * \n DECLARE_LOCALS(&return,&spec,&block_size); [line 46]\n NULLIFY(&block_size,false); [line 46]\n NULLIFY(&spec,false); [line 46]\n " color=yellow style=filled] +60 [label="60: Start main\nFormals: \nLocals: block_size:char * spec:char * \n DECLARE_LOCALS(&return,&block_size,&spec); [line 46]\n NULLIFY(&block_size,false); [line 46]\n NULLIFY(&spec,false); [line 46]\n " color=yellow style=filled] 60 -> 93 ; @@ -254,7 +254,7 @@ digraph iCFG { 33 [label="33: Exit test_loop \n " color=yellow style=filled] -32 [label="32: Start test_loop\nFormals: \nLocals: spec:char * block_size:char * \n DECLARE_LOCALS(&return,&spec,&block_size); [line 28]\n NULLIFY(&block_size,false); [line 28]\n NULLIFY(&spec,false); [line 28]\n " color=yellow style=filled] +32 [label="32: Start test_loop\nFormals: \nLocals: block_size:char * spec:char * \n DECLARE_LOCALS(&return,&block_size,&spec); [line 28]\n NULLIFY(&block_size,false); [line 28]\n NULLIFY(&spec,false); [line 28]\n " color=yellow style=filled] 32 -> 59 ; diff --git a/infer/tests/codetoanalyze/c/frontend/conditional_operator/unary_operator.c.dot b/infer/tests/codetoanalyze/c/frontend/conditional_operator/unary_operator.c.dot index f0de12ce5..b39e62800 100644 --- a/infer/tests/codetoanalyze/c/frontend/conditional_operator/unary_operator.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/conditional_operator/unary_operator.c.dot @@ -76,7 +76,7 @@ digraph iCFG { 2 [label="2: Exit dereference_ifthenelse \n " color=yellow style=filled] -1 [label="1: Start dereference_ifthenelse\nFormals: p:int *\nLocals: x:int y:int \n DECLARE_LOCALS(&return,&x,&y); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start dereference_ifthenelse\nFormals: p:int *\nLocals: y:int x:int \n DECLARE_LOCALS(&return,&y,&x); [line 10]\n NULLIFY(&x,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] 1 -> 16 ; diff --git a/infer/tests/codetoanalyze/c/frontend/enumeration/enum.c.dot b/infer/tests/codetoanalyze/c/frontend/enumeration/enum.c.dot index 670640094..c0aeed424 100644 --- a/infer/tests/codetoanalyze/c/frontend/enumeration/enum.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/enumeration/enum.c.dot @@ -26,7 +26,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: today:enum { (sunday, 0) (monday, 1) (tuesday, 2) (wednesday, 0) (thursday, 3) (friday, 4) (saturday, 5) } i:int \n DECLARE_LOCALS(&return,&today,&i); [line 12]\n NULLIFY(&i,false); [line 12]\n NULLIFY(&today,false); [line 12]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: i:int today:enum { (sunday, 0) (monday, 1) (tuesday, 2) (wednesday, 0) (thursday, 3) (friday, 4) (saturday, 5) } \n DECLARE_LOCALS(&return,&i,&today); [line 12]\n NULLIFY(&i,false); [line 12]\n NULLIFY(&today,false); [line 12]\n " color=yellow style=filled] 1 -> 8 ; diff --git a/infer/tests/codetoanalyze/c/frontend/gotostmt/goto_ex.c.dot b/infer/tests/codetoanalyze/c/frontend/gotostmt/goto_ex.c.dot index 27bb80870..932e52ebb 100644 --- a/infer/tests/codetoanalyze/c/frontend/gotostmt/goto_ex.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/gotostmt/goto_ex.c.dot @@ -127,7 +127,7 @@ digraph iCFG { 222 [label="222: Exit g8 \n " color=yellow style=filled] -221 [label="221: Start g8\nFormals: q:int \nLocals: i:int j:int k:int v:int \n DECLARE_LOCALS(&return,&i,&j,&k,&v); [line 180]\n NULLIFY(&i,false); [line 180]\n NULLIFY(&j,false); [line 180]\n NULLIFY(&k,false); [line 180]\n NULLIFY(&v,false); [line 180]\n " color=yellow style=filled] +221 [label="221: Start g8\nFormals: q:int \nLocals: v:int k:int j:int i:int \n DECLARE_LOCALS(&return,&v,&k,&j,&i); [line 180]\n NULLIFY(&i,false); [line 180]\n NULLIFY(&j,false); [line 180]\n NULLIFY(&k,false); [line 180]\n NULLIFY(&v,false); [line 180]\n " color=yellow style=filled] 221 -> 252 ; @@ -246,7 +246,7 @@ digraph iCFG { 193 [label="193: Exit g7 \n " color=yellow style=filled] -192 [label="192: Start g7\nFormals: \nLocals: i:int j:int k:int v:int \n DECLARE_LOCALS(&return,&i,&j,&k,&v); [line 156]\n NULLIFY(&i,false); [line 156]\n NULLIFY(&j,false); [line 156]\n NULLIFY(&k,false); [line 156]\n NULLIFY(&v,false); [line 156]\n " color=yellow style=filled] +192 [label="192: Start g7\nFormals: \nLocals: v:int k:int j:int i:int \n DECLARE_LOCALS(&return,&v,&k,&j,&i); [line 156]\n NULLIFY(&i,false); [line 156]\n NULLIFY(&j,false); [line 156]\n NULLIFY(&k,false); [line 156]\n NULLIFY(&v,false); [line 156]\n " color=yellow style=filled] 192 -> 220 ; diff --git a/infer/tests/codetoanalyze/c/frontend/initialization/array_initlistexpr.c.dot b/infer/tests/codetoanalyze/c/frontend/initialization/array_initlistexpr.c.dot index 5196aed68..3481d8f7d 100644 --- a/infer/tests/codetoanalyze/c/frontend/initialization/array_initlistexpr.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/initialization/array_initlistexpr.c.dot @@ -6,7 +6,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: z:int a:int [2][3] \n DECLARE_LOCALS(&return,&z,&a); [line 10]\n NULLIFY(&a,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: a:int [2][3] z:int \n DECLARE_LOCALS(&return,&a,&z); [line 10]\n NULLIFY(&a,false); [line 10]\n " color=yellow style=filled] 1 -> 3 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/do_while.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/do_while.c.dot index db0012659..6a8991e86 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/do_while.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/do_while.c.dot @@ -35,7 +35,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: a:int b:int \n DECLARE_LOCALS(&return,&a,&b); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int a:int \n DECLARE_LOCALS(&return,&b,&a); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] 1 -> 10 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/do_while_condition_side_effects.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/do_while_condition_side_effects.c.dot index 1dba30529..ff988fe74 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/do_while_condition_side_effects.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/do_while_condition_side_effects.c.dot @@ -35,7 +35,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: a:int b:int \n DECLARE_LOCALS(&return,&a,&b); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int a:int \n DECLARE_LOCALS(&return,&b,&a); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] 1 -> 10 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/do_while_nested.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/do_while_nested.c.dot index 22d03fbe1..36d8c22bc 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/do_while_nested.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/do_while_nested.c.dot @@ -56,7 +56,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: a:int b:int \n DECLARE_LOCALS(&return,&a,&b); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int a:int \n DECLARE_LOCALS(&return,&b,&a); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] 1 -> 15 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/for_condition_side_effects.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/for_condition_side_effects.c.dot index 4e5e55190..1d39169f7 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/for_condition_side_effects.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/for_condition_side_effects.c.dot @@ -43,7 +43,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: j:int i:int b:int \n DECLARE_LOCALS(&return,&j,&i,&b); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int i:int j:int \n DECLARE_LOCALS(&return,&b,&i,&j); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] 1 -> 12 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/for_nested.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/for_nested.c.dot index 3f0355e9d..fe29aedee 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/for_nested.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/for_nested.c.dot @@ -64,7 +64,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: k:int i:int j:int \n DECLARE_LOCALS(&return,&k,&i,&j); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&j,false); [line 10]\n NULLIFY(&k,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: i:int j:int k:int \n DECLARE_LOCALS(&return,&i,&j,&k); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&j,false); [line 10]\n NULLIFY(&k,false); [line 10]\n " color=yellow style=filled] 1 -> 17 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition.c.dot index b703449af..5c38bdc12 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition.c.dot @@ -35,7 +35,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: j:int b:int \n DECLARE_LOCALS(&return,&j,&b); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int j:int \n DECLARE_LOCALS(&return,&b,&j); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] 1 -> 10 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition_incr.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition_incr.c.dot index f4c1516be..bed84a262 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition_incr.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/for_no_condition_incr.c.dot @@ -31,7 +31,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: j:int b:int \n DECLARE_LOCALS(&return,&j,&b); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int j:int \n DECLARE_LOCALS(&return,&b,&j); [line 10]\n NULLIFY(&b,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] 1 -> 9 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/for_simple.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/for_simple.c.dot index 69d9987d7..03bd23456 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/for_simple.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/for_simple.c.dot @@ -39,7 +39,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: j:int i:int \n DECLARE_LOCALS(&return,&j,&i); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: i:int j:int \n DECLARE_LOCALS(&return,&i,&j); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&j,false); [line 10]\n " color=yellow style=filled] 1 -> 11 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/for_while_nested.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/for_while_nested.c.dot index 72ec2cb75..81e3eaeed 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/for_while_nested.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/for_while_nested.c.dot @@ -56,7 +56,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: k:int i:int \n DECLARE_LOCALS(&return,&k,&i); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&k,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: i:int k:int \n DECLARE_LOCALS(&return,&i,&k); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&k,false); [line 10]\n " color=yellow style=filled] 1 -> 15 ; diff --git a/infer/tests/codetoanalyze/c/frontend/loops/while_nested.c.dot b/infer/tests/codetoanalyze/c/frontend/loops/while_nested.c.dot index f69f8fdd5..45db423e8 100644 --- a/infer/tests/codetoanalyze/c/frontend/loops/while_nested.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/loops/while_nested.c.dot @@ -56,7 +56,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: i:int k:int \n DECLARE_LOCALS(&return,&i,&k); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&k,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: k:int i:int \n DECLARE_LOCALS(&return,&k,&i); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&k,false); [line 10]\n " color=yellow style=filled] 1 -> 15 ; diff --git a/infer/tests/codetoanalyze/c/frontend/nestedoperators/gnuexpr.c.dot b/infer/tests/codetoanalyze/c/frontend/nestedoperators/gnuexpr.c.dot index 9bbb89467..2a60498a6 100644 --- a/infer/tests/codetoanalyze/c/frontend/nestedoperators/gnuexpr.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/nestedoperators/gnuexpr.c.dot @@ -14,7 +14,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: y:int X:int \n DECLARE_LOCALS(&return,&y,&X); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: X:int y:int \n DECLARE_LOCALS(&return,&X,&y); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] 1 -> 5 ; diff --git a/infer/tests/codetoanalyze/c/frontend/nestedoperators/nestedassignment.c.dot b/infer/tests/codetoanalyze/c/frontend/nestedoperators/nestedassignment.c.dot index 2b3fb9e8d..ee850b21c 100644 --- a/infer/tests/codetoanalyze/c/frontend/nestedoperators/nestedassignment.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/nestedoperators/nestedassignment.c.dot @@ -30,7 +30,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: x:double q:double r:double s:double t:double \n DECLARE_LOCALS(&return,&x,&q,&r,&s,&t); [line 10]\n NULLIFY(&q,false); [line 10]\n NULLIFY(&x,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: t:double s:double r:double q:double x:double \n DECLARE_LOCALS(&return,&t,&s,&r,&q,&x); [line 10]\n NULLIFY(&q,false); [line 10]\n NULLIFY(&x,false); [line 10]\n " color=yellow style=filled] 1 -> 9 ; diff --git a/infer/tests/codetoanalyze/c/frontend/switchstmt/switch.c.dot b/infer/tests/codetoanalyze/c/frontend/switchstmt/switch.c.dot index 34ac948b7..7976ed27d 100644 --- a/infer/tests/codetoanalyze/c/frontend/switchstmt/switch.c.dot +++ b/infer/tests/codetoanalyze/c/frontend/switchstmt/switch.c.dot @@ -211,7 +211,7 @@ digraph iCFG { 144 [label="144: Exit m8 \n " color=yellow style=filled] -143 [label="143: Start m8\nFormals: \nLocals: value:int something:int z:int a:int \n DECLARE_LOCALS(&return,&value,&something,&z,&a); [line 176]\n NULLIFY(&a,false); [line 176]\n NULLIFY(&something,false); [line 176]\n NULLIFY(&value,false); [line 176]\n NULLIFY(&z,false); [line 176]\n " color=yellow style=filled] +143 [label="143: Start m8\nFormals: \nLocals: a:int z:int something:int value:int \n DECLARE_LOCALS(&return,&a,&z,&something,&value); [line 176]\n NULLIFY(&a,false); [line 176]\n NULLIFY(&something,false); [line 176]\n NULLIFY(&value,false); [line 176]\n NULLIFY(&z,false); [line 176]\n " color=yellow style=filled] 143 -> 171 ; @@ -282,7 +282,7 @@ digraph iCFG { 127 [label="127: Exit m7 \n " color=yellow style=filled] -126 [label="126: Start m7\nFormals: \nLocals: value:int something:int z:int \n DECLARE_LOCALS(&return,&value,&something,&z); [line 156]\n NULLIFY(&something,false); [line 156]\n NULLIFY(&value,false); [line 156]\n NULLIFY(&z,false); [line 156]\n " color=yellow style=filled] +126 [label="126: Start m7\nFormals: \nLocals: z:int something:int value:int \n DECLARE_LOCALS(&return,&z,&something,&value); [line 156]\n NULLIFY(&something,false); [line 156]\n NULLIFY(&value,false); [line 156]\n NULLIFY(&z,false); [line 156]\n " color=yellow style=filled] 126 -> 142 ; @@ -389,7 +389,7 @@ digraph iCFG { 101 [label="101: Exit m6 \n " color=yellow style=filled] -100 [label="100: Start m6\nFormals: \nLocals: value:int something:int z:int \n DECLARE_LOCALS(&return,&value,&something,&z); [line 130]\n NULLIFY(&something,false); [line 130]\n NULLIFY(&value,false); [line 130]\n NULLIFY(&z,false); [line 130]\n " color=yellow style=filled] +100 [label="100: Start m6\nFormals: \nLocals: z:int something:int value:int \n DECLARE_LOCALS(&return,&z,&something,&value); [line 130]\n NULLIFY(&something,false); [line 130]\n NULLIFY(&value,false); [line 130]\n NULLIFY(&z,false); [line 130]\n " color=yellow style=filled] 100 -> 122 ; @@ -450,7 +450,7 @@ digraph iCFG { 86 [label="86: Exit m5 \n " color=yellow style=filled] -85 [label="85: Start m5\nFormals: \nLocals: value:int x:int \n DECLARE_LOCALS(&return,&value,&x); [line 112]\n NULLIFY(&value,false); [line 112]\n NULLIFY(&x,false); [line 112]\n " color=yellow style=filled] +85 [label="85: Start m5\nFormals: \nLocals: x:int value:int \n DECLARE_LOCALS(&return,&x,&value); [line 112]\n NULLIFY(&value,false); [line 112]\n NULLIFY(&x,false); [line 112]\n " color=yellow style=filled] 85 -> 99 ; @@ -541,7 +541,7 @@ digraph iCFG { 64 [label="64: Exit m4 \n " color=yellow style=filled] -63 [label="63: Start m4\nFormals: \nLocals: value:int x:int z:int something:int \n DECLARE_LOCALS(&return,&value,&x,&z,&something); [line 85]\n NULLIFY(&something,false); [line 85]\n NULLIFY(&value,false); [line 85]\n NULLIFY(&x,false); [line 85]\n NULLIFY(&z,false); [line 85]\n " color=yellow style=filled] +63 [label="63: Start m4\nFormals: \nLocals: something:int z:int x:int value:int \n DECLARE_LOCALS(&return,&something,&z,&x,&value); [line 85]\n NULLIFY(&something,false); [line 85]\n NULLIFY(&value,false); [line 85]\n NULLIFY(&x,false); [line 85]\n NULLIFY(&z,false); [line 85]\n " color=yellow style=filled] 63 -> 84 ; @@ -612,7 +612,7 @@ digraph iCFG { 47 [label="47: Exit m3 \n " color=yellow style=filled] -46 [label="46: Start m3\nFormals: \nLocals: value:int something:int z:int \n DECLARE_LOCALS(&return,&value,&something,&z); [line 64]\n NULLIFY(&something,false); [line 64]\n NULLIFY(&value,false); [line 64]\n NULLIFY(&z,false); [line 64]\n " color=yellow style=filled] +46 [label="46: Start m3\nFormals: \nLocals: z:int something:int value:int \n DECLARE_LOCALS(&return,&z,&something,&value); [line 64]\n NULLIFY(&something,false); [line 64]\n NULLIFY(&value,false); [line 64]\n NULLIFY(&z,false); [line 64]\n " color=yellow style=filled] 46 -> 62 ; @@ -703,7 +703,7 @@ digraph iCFG { 25 [label="25: Exit m2 \n " color=yellow style=filled] -24 [label="24: Start m2\nFormals: \nLocals: value:int x:int z:int something:int \n DECLARE_LOCALS(&return,&value,&x,&z,&something); [line 37]\n NULLIFY(&something,false); [line 37]\n NULLIFY(&value,false); [line 37]\n NULLIFY(&x,false); [line 37]\n NULLIFY(&z,false); [line 37]\n " color=yellow style=filled] +24 [label="24: Start m2\nFormals: \nLocals: something:int z:int x:int value:int \n DECLARE_LOCALS(&return,&something,&z,&x,&value); [line 37]\n NULLIFY(&something,false); [line 37]\n NULLIFY(&value,false); [line 37]\n NULLIFY(&x,false); [line 37]\n NULLIFY(&z,false); [line 37]\n " color=yellow style=filled] 24 -> 45 ; @@ -798,7 +798,7 @@ digraph iCFG { 2 [label="2: Exit m1 \n " color=yellow style=filled] -1 [label="1: Start m1\nFormals: \nLocals: value:int x:int \n DECLARE_LOCALS(&return,&value,&x); [line 12]\n NULLIFY(&value,false); [line 12]\n NULLIFY(&x,false); [line 12]\n " color=yellow style=filled] +1 [label="1: Start m1\nFormals: \nLocals: x:int value:int \n DECLARE_LOCALS(&return,&x,&value); [line 12]\n NULLIFY(&value,false); [line 12]\n NULLIFY(&x,false); [line 12]\n " color=yellow style=filled] 1 -> 23 ; diff --git a/infer/tests/codetoanalyze/cpp/frontend/builtin/new.cpp.dot b/infer/tests/codetoanalyze/cpp/frontend/builtin/new.cpp.dot index d3a2266e1..e4c41ba59 100644 --- a/infer/tests/codetoanalyze/cpp/frontend/builtin/new.cpp.dot +++ b/infer/tests/codetoanalyze/cpp/frontend/builtin/new.cpp.dot @@ -18,7 +18,7 @@ digraph iCFG { 2 [label="2: Exit test \n " color=yellow style=filled] -1 [label="1: Start test\nFormals: \nLocals: x:int i:int * \n DECLARE_LOCALS(&return,&x,&i); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&x,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start test\nFormals: \nLocals: i:int * x:int \n DECLARE_LOCALS(&return,&i,&x); [line 10]\n NULLIFY(&i,false); [line 10]\n NULLIFY(&x,false); [line 10]\n " color=yellow style=filled] 1 -> 6 ; diff --git a/infer/tests/codetoanalyze/cpp/frontend/types/casts.cpp.dot b/infer/tests/codetoanalyze/cpp/frontend/types/casts.cpp.dot index 51222836f..2148536a0 100644 --- a/infer/tests/codetoanalyze/cpp/frontend/types/casts.cpp.dot +++ b/infer/tests/codetoanalyze/cpp/frontend/types/casts.cpp.dot @@ -6,7 +6,7 @@ digraph iCFG { 2 [label="2: Exit stat_cast \n " color=yellow style=filled] -1 [label="1: Start stat_cast\nFormals: \nLocals: a:int la:long long \n DECLARE_LOCALS(&return,&a,&la); [line 10]\n NULLIFY(&la,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start stat_cast\nFormals: \nLocals: la:long long a:int \n DECLARE_LOCALS(&return,&la,&a); [line 10]\n NULLIFY(&la,false); [line 10]\n " color=yellow style=filled] 1 -> 3 ; diff --git a/infer/tests/codetoanalyze/cpp/frontend/types/inheritance.cpp.dot b/infer/tests/codetoanalyze/cpp/frontend/types/inheritance.cpp.dot index 2ae86f838..6a1ff3f9f 100644 --- a/infer/tests/codetoanalyze/cpp/frontend/types/inheritance.cpp.dot +++ b/infer/tests/codetoanalyze/cpp/frontend/types/inheritance.cpp.dot @@ -38,7 +38,7 @@ digraph iCFG { 11 [label="11: Exit call_static_methods \n " color=yellow style=filled] -10 [label="10: Start call_static_methods\nFormals: \nLocals: b:class Base * s1:class Base * s2:class Sub * \n DECLARE_LOCALS(&return,&b,&s1,&s2); [line 21]\n NULLIFY(&b,false); [line 21]\n NULLIFY(&s1,false); [line 21]\n NULLIFY(&s2,false); [line 21]\n " color=yellow style=filled] +10 [label="10: Start call_static_methods\nFormals: \nLocals: s2:class Sub * s1:class Base * b:class Base * \n DECLARE_LOCALS(&return,&s2,&s1,&b); [line 21]\n NULLIFY(&b,false); [line 21]\n NULLIFY(&s1,false); [line 21]\n NULLIFY(&s2,false); [line 21]\n " color=yellow style=filled] 10 -> 20 ; diff --git a/infer/tests/codetoanalyze/cpp/frontend/types/struct.cpp.dot b/infer/tests/codetoanalyze/cpp/frontend/types/struct.cpp.dot index 5e4faaa65..b1abc94a2 100644 --- a/infer/tests/codetoanalyze/cpp/frontend/types/struct.cpp.dot +++ b/infer/tests/codetoanalyze/cpp/frontend/types/struct.cpp.dot @@ -18,7 +18,7 @@ digraph iCFG { 2 [label="2: Exit test \n " color=yellow style=filled] -1 [label="1: Start test\nFormals: \nLocals: xs:struct X_struct * xc:class X_class * \n DECLARE_LOCALS(&return,&xs,&xc); [line 12]\n " color=yellow style=filled] +1 [label="1: Start test\nFormals: \nLocals: xc:class X_class * xs:struct X_struct * \n DECLARE_LOCALS(&return,&xc,&xs); [line 12]\n " color=yellow style=filled] 1 -> 6 ; diff --git a/infer/tests/codetoanalyze/objc/errors/category_procdesc/main.dot b/infer/tests/codetoanalyze/objc/errors/category_procdesc/main.dot index 60403bcc8..4bd5e4aa2 100644 --- a/infer/tests/codetoanalyze/objc/errors/category_procdesc/main.dot +++ b/infer/tests/codetoanalyze/objc/errors/category_procdesc/main.dot @@ -18,7 +18,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: person:class EOCPerson * x:int * \n DECLARE_LOCALS(&return,&person,&x); [line 12]\n NULLIFY(&person,false); [line 12]\n NULLIFY(&x,false); [line 12]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: x:int * person:class EOCPerson * \n DECLARE_LOCALS(&return,&x,&person); [line 12]\n NULLIFY(&person,false); [line 12]\n NULLIFY(&x,false); [line 12]\n " color=yellow style=filled] 1 -> 6 ; 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 4ae8cf7c2..b83ca241b 100644 --- a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/AutoreleaseExample.dot +++ b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/AutoreleaseExample.dot @@ -18,7 +18,7 @@ digraph iCFG { 37 [label="37: Exit test3 \n " color=yellow style=filled] -36 [label="36: Start test3\nFormals: \nLocals: pool:class NSAutoreleasePool * string:class NSString * c:class NSString * \n DECLARE_LOCALS(&return,&pool,&string,&c); [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] +36 [label="36: Start test3\nFormals: \nLocals: c:class NSString * string:class NSString * pool:class NSAutoreleasePool * \n DECLARE_LOCALS(&return,&c,&string,&pool); [line 59]\n NULLIFY(&c,false); [line 59]\n NULLIFY(&pool,false); [line 59]\n NULLIFY(&string,false); [line 59]\n " color=yellow style=filled] 36 -> 41 ; @@ -57,7 +57,7 @@ digraph iCFG { 27 [label="27: Exit test2 \n " color=yellow style=filled] -26 [label="26: Start test2\nFormals: \nLocals: s1:class A * s2:class A * s3:class A * \n DECLARE_LOCALS(&return,&s1,&s2,&s3); [line 47]\n " color=yellow style=filled] +26 [label="26: Start test2\nFormals: \nLocals: s3:class A * s2:class A * s1:class A * \n DECLARE_LOCALS(&return,&s3,&s2,&s1); [line 47]\n " color=yellow style=filled] 26 -> 35 ; @@ -100,7 +100,7 @@ digraph iCFG { 16 [label="16: Exit test1 \n " color=yellow style=filled] -15 [label="15: Start test1\nFormals: \nLocals: s1:class A * s2:class A * s3:class A * \n DECLARE_LOCALS(&return,&s1,&s2,&s3); [line 34]\n " color=yellow style=filled] +15 [label="15: Start test1\nFormals: \nLocals: s3:class A * s2:class A * s1:class A * \n DECLARE_LOCALS(&return,&s3,&s2,&s1); [line 34]\n " color=yellow style=filled] 15 -> 25 ; 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 0a548f735..e0dc65927 100644 --- a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/MemoryLeakExample.dot +++ b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/MemoryLeakExample.dot @@ -70,7 +70,7 @@ digraph iCFG { 30 [label="30: Exit MemoryLeakExample_createCloseCrossGlyphNoLeak: \n " color=yellow style=filled] -29 [label="29: Start MemoryLeakExample_createCloseCrossGlyphNoLeak:\nFormals: rect:struct CGRect \nLocals: lineThickness:double path1:struct CGPath * \n DECLARE_LOCALS(&return,&lineThickness,&path1); [line 65]\n NULLIFY(&lineThickness,false); [line 65]\n NULLIFY(&path1,false); [line 65]\n " color=yellow style=filled] +29 [label="29: Start MemoryLeakExample_createCloseCrossGlyphNoLeak:\nFormals: rect:struct CGRect \nLocals: path1:struct CGPath * lineThickness:double \n DECLARE_LOCALS(&return,&path1,&lineThickness); [line 65]\n NULLIFY(&lineThickness,false); [line 65]\n NULLIFY(&path1,false); [line 65]\n " color=yellow style=filled] 29 -> 33 ; @@ -85,7 +85,7 @@ digraph iCFG { 26 [label="26: Exit MemoryLeakExample_createCloseCrossGlyph: \n " color=yellow style=filled] -25 [label="25: Start MemoryLeakExample_createCloseCrossGlyph:\nFormals: rect:struct CGRect \nLocals: lineThickness:double path1:struct CGPath * \n DECLARE_LOCALS(&return,&lineThickness,&path1); [line 57]\n NULLIFY(&lineThickness,false); [line 57]\n NULLIFY(&path1,false); [line 57]\n " color=yellow style=filled] +25 [label="25: Start MemoryLeakExample_createCloseCrossGlyph:\nFormals: rect:struct CGRect \nLocals: path1:struct CGPath * lineThickness:double \n DECLARE_LOCALS(&return,&path1,&lineThickness); [line 57]\n NULLIFY(&lineThickness,false); [line 57]\n NULLIFY(&path1,false); [line 57]\n " color=yellow style=filled] 25 -> 28 ; @@ -175,7 +175,7 @@ digraph iCFG { 2 [label="2: Exit MemoryLeakExample_layoutSubviews \n " color=yellow style=filled] -1 [label="1: Start MemoryLeakExample_layoutSubviews\nFormals: self:class MemoryLeakExample *\nLocals: attachmentContainerView:class UIView * shadowPath:struct CGPath * \n DECLARE_LOCALS(&return,&attachmentContainerView,&shadowPath); [line 19]\n NULLIFY(&attachmentContainerView,false); [line 19]\n NULLIFY(&self,false); [line 19]\n NULLIFY(&shadowPath,false); [line 19]\n " color=yellow style=filled] +1 [label="1: Start MemoryLeakExample_layoutSubviews\nFormals: self:class MemoryLeakExample *\nLocals: shadowPath:struct CGPath * attachmentContainerView:class UIView * \n DECLARE_LOCALS(&return,&shadowPath,&attachmentContainerView); [line 19]\n NULLIFY(&attachmentContainerView,false); [line 19]\n NULLIFY(&self,false); [line 19]\n NULLIFY(&shadowPath,false); [line 19]\n " color=yellow style=filled] 1 -> 6 ; diff --git a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/TollBridgeExample.dot b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/TollBridgeExample.dot index ac027c260..f6e154985 100644 --- a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/TollBridgeExample.dot +++ b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/TollBridgeExample.dot @@ -36,7 +36,7 @@ digraph iCFG { 10 [label="10: Exit TollBridgeExample_brideRetained \n " color=yellow style=filled] -9 [label="9: Start TollBridgeExample_brideRetained\nFormals: self:class TollBridgeExample *\nLocals: observer:struct objc_object * a:struct __CFLocale * \n DECLARE_LOCALS(&return,&observer,&a); [line 31]\n NULLIFY(&a,false); [line 31]\n NULLIFY(&observer,false); [line 31]\n NULLIFY(&self,false); [line 31]\n " color=yellow style=filled] +9 [label="9: Start TollBridgeExample_brideRetained\nFormals: self:class TollBridgeExample *\nLocals: a:struct __CFLocale * observer:struct objc_object * \n DECLARE_LOCALS(&return,&a,&observer); [line 31]\n NULLIFY(&a,false); [line 31]\n NULLIFY(&observer,false); [line 31]\n NULLIFY(&self,false); [line 31]\n " color=yellow style=filled] 9 -> 12 ; @@ -51,7 +51,7 @@ digraph iCFG { 6 [label="6: Exit TollBridgeExample_bridge \n " color=yellow style=filled] -5 [label="5: Start TollBridgeExample_bridge\nFormals: self:class TollBridgeExample *\nLocals: nameRef:struct __CFLocale * a:class NSLocale * \n DECLARE_LOCALS(&return,&nameRef,&a); [line 25]\n NULLIFY(&a,false); [line 25]\n NULLIFY(&nameRef,false); [line 25]\n NULLIFY(&self,false); [line 25]\n " color=yellow style=filled] +5 [label="5: Start TollBridgeExample_bridge\nFormals: self:class TollBridgeExample *\nLocals: a:class NSLocale * nameRef:struct __CFLocale * \n DECLARE_LOCALS(&return,&a,&nameRef); [line 25]\n NULLIFY(&a,false); [line 25]\n NULLIFY(&nameRef,false); [line 25]\n NULLIFY(&self,false); [line 25]\n " color=yellow style=filled] 5 -> 8 ; @@ -66,7 +66,7 @@ digraph iCFG { 2 [label="2: Exit TollBridgeExample_bridgeTransfer \n " color=yellow style=filled] -1 [label="1: Start TollBridgeExample_bridgeTransfer\nFormals: self:class TollBridgeExample *\nLocals: nameRef:struct __CFLocale * a:class NSLocale * \n DECLARE_LOCALS(&return,&nameRef,&a); [line 20]\n NULLIFY(&a,false); [line 20]\n NULLIFY(&nameRef,false); [line 20]\n NULLIFY(&self,false); [line 20]\n " color=yellow style=filled] +1 [label="1: Start TollBridgeExample_bridgeTransfer\nFormals: self:class TollBridgeExample *\nLocals: a:class NSLocale * nameRef:struct __CFLocale * \n DECLARE_LOCALS(&return,&a,&nameRef); [line 20]\n NULLIFY(&a,false); [line 20]\n NULLIFY(&nameRef,false); [line 20]\n NULLIFY(&self,false); [line 20]\n " color=yellow style=filled] 1 -> 4 ; diff --git a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/arc_methods.dot b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/arc_methods.dot index 5366b345f..a202b47ca 100644 --- a/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/arc_methods.dot +++ b/infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/arc_methods.dot @@ -22,7 +22,7 @@ digraph iCFG { 10 [label="10: Exit main \n " color=yellow style=filled] -9 [label="9: Start main\nFormals: \nLocals: a1:class A * aa:class A * a2:class A * ab:class A * \n DECLARE_LOCALS(&return,&a1,&aa,&a2,&ab); [line 35]\n NULLIFY(&a1,false); [line 35]\n NULLIFY(&a2,false); [line 35]\n NULLIFY(&aa,false); [line 35]\n NULLIFY(&ab,false); [line 35]\n " color=yellow style=filled] +9 [label="9: Start main\nFormals: \nLocals: ab:class A * a2:class A * aa:class A * a1:class A * \n DECLARE_LOCALS(&return,&ab,&a2,&aa,&a1); [line 35]\n NULLIFY(&a1,false); [line 35]\n NULLIFY(&a2,false); [line 35]\n NULLIFY(&aa,false); [line 35]\n NULLIFY(&ab,false); [line 35]\n " color=yellow style=filled] 9 -> 15 ; 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 396f7da43..f1497991c 100644 --- a/infer/tests/codetoanalyze/objc/errors/npe/Nonnull_attribute_example.dot +++ b/infer/tests/codetoanalyze/objc/errors/npe/Nonnull_attribute_example.dot @@ -59,7 +59,7 @@ digraph iCFG { 5 [label="5: Exit C_initWithCoder:and: \n " color=yellow style=filled] -4 [label="4: Start C_initWithCoder:and:\nFormals: self:class C * aDecoder:class NSString * a:class A *\nLocals: a1:class A * y:int \n DECLARE_LOCALS(&return,&a1,&y); [line 37]\n NULLIFY(&a1,false); [line 37]\n NULLIFY(&aDecoder,false); [line 37]\n NULLIFY(&y,false); [line 37]\n " color=yellow style=filled] +4 [label="4: Start C_initWithCoder:and:\nFormals: self:class C * aDecoder:class NSString * a:class A *\nLocals: y:int a1:class A * \n DECLARE_LOCALS(&return,&y,&a1); [line 37]\n NULLIFY(&a1,false); [line 37]\n NULLIFY(&aDecoder,false); [line 37]\n NULLIFY(&y,false); [line 37]\n " color=yellow style=filled] 4 -> 9 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot b/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot index 282166d67..18ad1861f 100644 --- a/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot +++ b/infer/tests/codetoanalyze/objc/frontend/assertions/NSAssert_example.dot @@ -126,7 +126,7 @@ digraph iCFG { 93 [label="93: Exit test2 \n " color=yellow style=filled] -92 [label="92: Start test2\nFormals: target:class A *\nLocals: __assert_fn__:class NSString * __assert_file__:class NSString * \n DECLARE_LOCALS(&return,&__assert_fn__,&__assert_file__); [line 35]\n NULLIFY(&__assert_file__,false); [line 35]\n NULLIFY(&__assert_fn__,false); [line 35]\n " color=yellow style=filled] +92 [label="92: Start test2\nFormals: target:class A *\nLocals: __assert_file__:class NSString * __assert_fn__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__,&__assert_fn__); [line 35]\n NULLIFY(&__assert_file__,false); [line 35]\n NULLIFY(&__assert_fn__,false); [line 35]\n " color=yellow style=filled] 92 -> 98 ; @@ -250,7 +250,7 @@ digraph iCFG { 60 [label="60: Exit test1 \n " color=yellow style=filled] -59 [label="59: Start test1\nFormals: target:class A *\nLocals: __assert_fn__:class NSString * __assert_file__:class NSString * \n DECLARE_LOCALS(&return,&__assert_fn__,&__assert_file__); [line 30]\n NULLIFY(&__assert_file__,false); [line 30]\n NULLIFY(&__assert_fn__,false); [line 30]\n " color=yellow style=filled] +59 [label="59: Start test1\nFormals: target:class A *\nLocals: __assert_file__:class NSString * __assert_fn__:class NSString * \n DECLARE_LOCALS(&return,&__assert_file__,&__assert_fn__); [line 30]\n NULLIFY(&__assert_file__,false); [line 30]\n NULLIFY(&__assert_fn__,false); [line 30]\n " color=yellow style=filled] 59 -> 65 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/block/BlockVar.dot b/infer/tests/codetoanalyze/objc/frontend/block/BlockVar.dot index 42c9da0be..12037e4d9 100644 --- a/infer/tests/codetoanalyze/objc/frontend/block/BlockVar.dot +++ b/infer/tests/codetoanalyze/objc/frontend/block/BlockVar.dot @@ -14,7 +14,7 @@ digraph iCFG { 9 [label="9: Exit __objc_anonymous_block_BlockVar_navigateToURLInBackground:resolver:______1 \n " color=yellow style=filled] -8 [label="8: Start __objc_anonymous_block_BlockVar_navigateToURLInBackground:resolver:______1\nFormals: a:int b:int \nLocals: error:class NSError * res:int \n DECLARE_LOCALS(&return,&error,&res); [line 21]\n NULLIFY(&error,false); [line 21]\n NULLIFY(&res,false); [line 21]\n " color=yellow style=filled] +8 [label="8: Start __objc_anonymous_block_BlockVar_navigateToURLInBackground:resolver:______1\nFormals: a:int b:int \nLocals: res:int error:class NSError * \n DECLARE_LOCALS(&return,&res,&error); [line 21]\n NULLIFY(&error,false); [line 21]\n NULLIFY(&res,false); [line 21]\n " color=yellow style=filled] 8 -> 12 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/block/block-it.dot b/infer/tests/codetoanalyze/objc/frontend/block/block-it.dot index a88dc73c2..7a5c921d5 100644 --- a/infer/tests/codetoanalyze/objc/frontend/block/block-it.dot +++ b/infer/tests/codetoanalyze/objc/frontend/block/block-it.dot @@ -100,7 +100,7 @@ digraph iCFG { 28 [label="28: Exit MyBlock_array_trans \n " color=yellow style=filled] -27 [label="27: Start MyBlock_array_trans\nFormals: self:class MyBlock *\nLocals: a:class NSArray * objects:class NSArray * enumerateObjectsUsingBlock:_fn_ (*) stop:_Bool * idx:unsigned long object:struct objc_object * \n DECLARE_LOCALS(&return,&a,&objects,&enumerateObjectsUsingBlock,&stop,&idx,&object); [line 28]\n NULLIFY(&a,false); [line 28]\n NULLIFY(&enumerateObjectsUsingBlock,false); [line 28]\n NULLIFY(&idx,false); [line 28]\n NULLIFY(&object,false); [line 28]\n NULLIFY(&objects,false); [line 28]\n NULLIFY(&self,false); [line 28]\n NULLIFY(&stop,false); [line 28]\n " color=yellow style=filled] +27 [label="27: Start MyBlock_array_trans\nFormals: self:class MyBlock *\nLocals: idx:unsigned long object:struct objc_object * stop:_Bool * enumerateObjectsUsingBlock:_fn_ (*) objects:class NSArray * a:class NSArray * \n DECLARE_LOCALS(&return,&idx,&object,&stop,&enumerateObjectsUsingBlock,&objects,&a); [line 28]\n NULLIFY(&a,false); [line 28]\n NULLIFY(&enumerateObjectsUsingBlock,false); [line 28]\n NULLIFY(&idx,false); [line 28]\n NULLIFY(&object,false); [line 28]\n NULLIFY(&objects,false); [line 28]\n NULLIFY(&self,false); [line 28]\n NULLIFY(&stop,false); [line 28]\n " color=yellow style=filled] 27 -> 52 ; @@ -108,7 +108,7 @@ digraph iCFG { 26 -> 25 ; -25 [label="25: DeclStmt \n DECLARE_LOCALS(&infer___objc_anonymous_block_MyBlock_array______1); [line 15]\n DECLARE_LOCALS(&objects); [line 15]\n DECLARE_LOCALS(&stop); [line 15]\n DECLARE_LOCALS(&idx); [line 15]\n DECLARE_LOCALS(&object); [line 15]\n n$21=*&a:class NSArray * [line 15]\n *&objects:class NSArray *=n$21 [line 15]\n REMOVE_TEMPS(n$21); [line 15]\n NULLIFY(&a,false); [line 15]\n " shape="box"] +25 [label="25: DeclStmt \n n$21=*&a:class NSArray * [line 15]\n *&objects:class NSArray *=n$21 [line 15]\n REMOVE_TEMPS(n$21); [line 15]\n NULLIFY(&a,false); [line 15]\n " shape="box"] 25 -> 18 ; @@ -148,7 +148,7 @@ digraph iCFG { 16 -> 5 ; -15 [label="15: DeclStmt \n n$14=*&objects:class NSArray * [line 15]\n n$15=*&idx:unsigned long [line 15]\n n$13=_fun_NSArray_objectAtIndexedSubscript:(n$14:class NSArray *,n$15:unsigned long ) virtual [line 15]\n *&object:struct objc_object *=n$13 [line 15]\n REMOVE_TEMPS(n$13,n$14,n$15); [line 15]\n " shape="box"] +15 [label="15: DeclStmt \n n$14=*&objects:class NSArray * [line 15]\n n$15=*&idx:unsigned long [line 15]\n n$13=_fun_NSArray_objectAtIndexedSubscript:(n$14:class NSArray *,n$15:unsigned long ) virtual [line 15]\n *&object:struct objc_object *=n$13 [line 15]\n REMOVE_TEMPS(n$13,n$14,n$15); [line 15]\n NULLIFY(&object,false); [line 15]\n " shape="box"] 15 -> 14 ; @@ -198,14 +198,14 @@ digraph iCFG { 4 -> 7 ; -3 [label="3: Call _fun_free \n n$0=*&stop:_Bool * [line 15]\n n$1=_fun_free(n$0:void *) [line 15]\n NULLIFY(&object,true); [line 15]\n NULLIFY(&idx,true); [line 15]\n NULLIFY(&stop,true); [line 15]\n NULLIFY(&objects,true); [line 15]\n REMOVE_TEMPS(n$0,n$1); [line 15]\n NULLIFY(&__objc_anonymous_block_MyBlock_array______1,true); [line 15]\n NULLIFY(&infer___objc_anonymous_block_MyBlock_array______1,true); [line 15]\n APPLY_ABSTRACTION; [line 15]\n " shape="box"] +3 [label="3: Call _fun_free \n NULLIFY(&idx,false); [line 15]\n NULLIFY(&infer___objc_anonymous_block_MyBlock_array______1,false); [line 15]\n NULLIFY(&objects,false); [line 15]\n n$0=*&stop:_Bool * [line 15]\n n$1=_fun_free(n$0:void *) [line 15]\n NULLIFY(&object,true); [line 15]\n NULLIFY(&idx,true); [line 15]\n NULLIFY(&stop,true); [line 15]\n NULLIFY(&objects,true); [line 15]\n REMOVE_TEMPS(n$0,n$1); [line 15]\n NULLIFY(&__objc_anonymous_block_MyBlock_array______1,true); [line 15]\n NULLIFY(&infer___objc_anonymous_block_MyBlock_array______1,true); [line 15]\n NULLIFY(&idx,false); [line 15]\n NULLIFY(&infer___objc_anonymous_block_MyBlock_array______1,false); [line 15]\n NULLIFY(&objects,false); [line 15]\n NULLIFY(&stop,false); [line 15]\n APPLY_ABSTRACTION; [line 15]\n " shape="box"] 3 -> 2 ; 2 [label="2: Exit MyBlock_array \n " color=yellow style=filled] -1 [label="1: Start MyBlock_array\nFormals: self:class MyBlock *\nLocals: a:class NSArray * \n DECLARE_LOCALS(&return,&a); [line 12]\n NULLIFY(&a,false); [line 12]\n NULLIFY(&self,false); [line 12]\n " color=yellow style=filled] +1 [label="1: Start MyBlock_array\nFormals: self:class MyBlock *\nLocals: idx:unsigned long object:struct objc_object * stop:_Bool * infer___objc_anonymous_block_MyBlock_array______1:_fn_ (*) objects:class NSArray * a:class NSArray * \n DECLARE_LOCALS(&return,&idx,&object,&stop,&infer___objc_anonymous_block_MyBlock_array______1,&objects,&a); [line 12]\n NULLIFY(&a,false); [line 12]\n NULLIFY(&idx,false); [line 12]\n NULLIFY(&infer___objc_anonymous_block_MyBlock_array______1,false); [line 12]\n NULLIFY(&object,false); [line 12]\n NULLIFY(&objects,false); [line 12]\n NULLIFY(&self,false); [line 12]\n NULLIFY(&stop,false); [line 12]\n " color=yellow style=filled] 1 -> 26 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/block/block.dot b/infer/tests/codetoanalyze/objc/frontend/block/block.dot index 30a00b239..859a3b24f 100644 --- a/infer/tests/codetoanalyze/objc/frontend/block/block.dot +++ b/infer/tests/codetoanalyze/objc/frontend/block/block.dot @@ -52,7 +52,7 @@ digraph iCFG { 12 [label="12: Exit __objc_anonymous_block_main1______2 \n " color=yellow style=filled] -11 [label="11: Start __objc_anonymous_block_main1______2\nFormals: x:int c:int d:int \nLocals: addblock2:_fn_ (*) add2:int bla:int \nCaptured: x:int \n DECLARE_LOCALS(&return,&addblock2,&add2,&bla); [line 19]\n NULLIFY(&add2,false); [line 19]\n NULLIFY(&addblock2,false); [line 19]\n NULLIFY(&d,false); [line 19]\n " color=yellow style=filled] +11 [label="11: Start __objc_anonymous_block_main1______2\nFormals: x:int c:int d:int \nLocals: bla:int add2:int addblock2:_fn_ (*)\nCaptured: x:int \n DECLARE_LOCALS(&return,&bla,&add2,&addblock2); [line 19]\n NULLIFY(&add2,false); [line 19]\n NULLIFY(&addblock2,false); [line 19]\n NULLIFY(&d,false); [line 19]\n " color=yellow style=filled] 11 -> 19 ; @@ -90,7 +90,7 @@ digraph iCFG { 2 [label="2: Exit main1 \n " color=yellow style=filled] -1 [label="1: Start main1\nFormals: y:int \nLocals: x:int add1:int add2:int addblock:_fn_ (*) \n DECLARE_LOCALS(&return,&x,&add1,&add2,&addblock); [line 10]\n NULLIFY(&add1,false); [line 10]\n NULLIFY(&add2,false); [line 10]\n NULLIFY(&addblock,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main1\nFormals: y:int \nLocals: addblock:_fn_ (*) add2:int add1:int x:int \n DECLARE_LOCALS(&return,&addblock,&add2,&add1,&x); [line 10]\n NULLIFY(&add1,false); [line 10]\n NULLIFY(&add2,false); [line 10]\n NULLIFY(&addblock,false); [line 10]\n NULLIFY(&y,false); [line 10]\n " color=yellow style=filled] 1 -> 22 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/block/block_no_args.dot b/infer/tests/codetoanalyze/objc/frontend/block/block_no_args.dot index 3d6dc8007..e129d530c 100644 --- a/infer/tests/codetoanalyze/objc/frontend/block/block_no_args.dot +++ b/infer/tests/codetoanalyze/objc/frontend/block/block_no_args.dot @@ -33,7 +33,7 @@ digraph iCFG { 2 [label="2: Exit My_manager_my_mehtod \n " color=yellow style=filled] -1 [label="1: Start My_manager_my_mehtod\nFormals: self:class My_manager *\nLocals: b:_fn_ (*) z:int \n DECLARE_LOCALS(&return,&b,&z); [line 21]\n NULLIFY(&b,false); [line 21]\n NULLIFY(&self,false); [line 21]\n " color=yellow style=filled] +1 [label="1: Start My_manager_my_mehtod\nFormals: self:class My_manager *\nLocals: z:int b:_fn_ (*) \n DECLARE_LOCALS(&return,&z,&b); [line 21]\n NULLIFY(&b,false); [line 21]\n NULLIFY(&self,false); [line 21]\n " color=yellow style=filled] 1 -> 10 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/block/block_release.dot b/infer/tests/codetoanalyze/objc/frontend/block/block_release.dot index 08f4930b5..759184603 100644 --- a/infer/tests/codetoanalyze/objc/frontend/block/block_release.dot +++ b/infer/tests/codetoanalyze/objc/frontend/block/block_release.dot @@ -71,7 +71,7 @@ digraph iCFG { 2 [label="2: Exit My_manager_my_mehtod \n " color=yellow style=filled] -1 [label="1: Start My_manager_my_mehtod\nFormals: self:class My_manager *\nLocals: b:_fn_ (*) z:int context:struct CGContext * newImage:struct CGImage * \n DECLARE_LOCALS(&return,&b,&z,&context,&newImage); [line 22]\n NULLIFY(&b,false); [line 22]\n NULLIFY(&context,false); [line 22]\n NULLIFY(&self,false); [line 22]\n NULLIFY(&z,false); [line 22]\n " color=yellow style=filled] +1 [label="1: Start My_manager_my_mehtod\nFormals: self:class My_manager *\nLocals: newImage:struct CGImage * context:struct CGContext * z:int b:_fn_ (*) \n DECLARE_LOCALS(&return,&newImage,&context,&z,&b); [line 22]\n NULLIFY(&b,false); [line 22]\n NULLIFY(&context,false); [line 22]\n NULLIFY(&self,false); [line 22]\n NULLIFY(&z,false); [line 22]\n " color=yellow style=filled] 1 -> 19 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/boxing/Boxing.dot b/infer/tests/codetoanalyze/objc/frontend/boxing/Boxing.dot index 7d424daa0..476e394e5 100644 --- a/infer/tests/codetoanalyze/objc/frontend/boxing/Boxing.dot +++ b/infer/tests/codetoanalyze/objc/frontend/boxing/Boxing.dot @@ -93,7 +93,7 @@ digraph iCFG { 2 [label="2: Exit Boxing_getIntExp \n " color=yellow style=filled] -1 [label="1: Start Boxing_getIntExp\nFormals: self:class Boxing *\nLocals: x:int y:int n:class NSNumber * \n DECLARE_LOCALS(&return,&x,&y,&n); [line 14]\n NULLIFY(&n,false); [line 14]\n NULLIFY(&self,false); [line 14]\n NULLIFY(&x,false); [line 14]\n NULLIFY(&y,false); [line 14]\n " color=yellow style=filled] +1 [label="1: Start Boxing_getIntExp\nFormals: self:class Boxing *\nLocals: n:class NSNumber * y:int x:int \n DECLARE_LOCALS(&return,&n,&y,&x); [line 14]\n NULLIFY(&n,false); [line 14]\n NULLIFY(&self,false); [line 14]\n NULLIFY(&x,false); [line 14]\n NULLIFY(&y,false); [line 14]\n " color=yellow style=filled] 1 -> 6 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/boxing/array.dot b/infer/tests/codetoanalyze/objc/frontend/boxing/array.dot index 8ea5ed515..e69e7dc7d 100644 --- a/infer/tests/codetoanalyze/objc/frontend/boxing/array.dot +++ b/infer/tests/codetoanalyze/objc/frontend/boxing/array.dot @@ -35,7 +35,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: s:class NSString * germanCars:class NSArray * item:class NSString * \n DECLARE_LOCALS(&return,&s,&germanCars,&item); [line 14]\n NULLIFY(&germanCars,false); [line 14]\n NULLIFY(&item,false); [line 14]\n NULLIFY(&s,false); [line 14]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: item:class NSString * germanCars:class NSArray * s:class NSString * \n DECLARE_LOCALS(&return,&item,&germanCars,&s); [line 14]\n NULLIFY(&germanCars,false); [line 14]\n NULLIFY(&item,false); [line 14]\n NULLIFY(&s,false); [line 14]\n " color=yellow style=filled] 1 -> 10 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/fast_enumeration/Fast_enumeration.dot b/infer/tests/codetoanalyze/objc/frontend/fast_enumeration/Fast_enumeration.dot index 3370a2130..e2ade226b 100644 --- a/infer/tests/codetoanalyze/objc/frontend/fast_enumeration/Fast_enumeration.dot +++ b/infer/tests/codetoanalyze/objc/frontend/fast_enumeration/Fast_enumeration.dot @@ -35,7 +35,7 @@ digraph iCFG { 11 [label="11: Exit A_while_loop: \n " color=yellow style=filled] -10 [label="10: Start A_while_loop:\nFormals: self:class A * items:class NSArray *\nLocals: size:int item:class NSArray * \n DECLARE_LOCALS(&return,&size,&item); [line 25]\n NULLIFY(&item,false); [line 25]\n NULLIFY(&self,false); [line 25]\n NULLIFY(&size,false); [line 25]\n " color=yellow style=filled] +10 [label="10: Start A_while_loop:\nFormals: self:class A * items:class NSArray *\nLocals: item:class NSArray * size:int \n DECLARE_LOCALS(&return,&item,&size); [line 25]\n NULLIFY(&item,false); [line 25]\n NULLIFY(&self,false); [line 25]\n NULLIFY(&size,false); [line 25]\n " color=yellow style=filled] 10 -> 19 ; @@ -71,7 +71,7 @@ digraph iCFG { 2 [label="2: Exit A_fast_loop: \n " color=yellow style=filled] -1 [label="1: Start A_fast_loop:\nFormals: self:class A * items:class NSArray *\nLocals: size:int item:class NSArray * \n DECLARE_LOCALS(&return,&size,&item); [line 17]\n NULLIFY(&item,false); [line 17]\n NULLIFY(&self,false); [line 17]\n NULLIFY(&size,false); [line 17]\n " color=yellow style=filled] +1 [label="1: Start A_fast_loop:\nFormals: self:class A * items:class NSArray *\nLocals: item:class NSArray * size:int \n DECLARE_LOCALS(&return,&item,&size); [line 17]\n NULLIFY(&item,false); [line 17]\n NULLIFY(&self,false); [line 17]\n NULLIFY(&size,false); [line 17]\n " color=yellow style=filled] 1 -> 9 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/returnstmt/void_return.dot b/infer/tests/codetoanalyze/objc/frontend/returnstmt/void_return.dot index 3a6fcc0b5..ac7392229 100644 --- a/infer/tests/codetoanalyze/objc/frontend/returnstmt/void_return.dot +++ b/infer/tests/codetoanalyze/objc/frontend/returnstmt/void_return.dot @@ -52,7 +52,7 @@ digraph iCFG { 2 [label="2: Exit MyClass_aMethod \n " color=yellow style=filled] -1 [label="1: Start MyClass_aMethod\nFormals: self:class MyClass *\nLocals: i:int j:int \n DECLARE_LOCALS(&return,&i,&j); [line 18]\n NULLIFY(&i,false); [line 18]\n NULLIFY(&j,false); [line 18]\n NULLIFY(&self,false); [line 18]\n " color=yellow style=filled] +1 [label="1: Start MyClass_aMethod\nFormals: self:class MyClass *\nLocals: j:int i:int \n DECLARE_LOCALS(&return,&j,&i); [line 18]\n NULLIFY(&i,false); [line 18]\n NULLIFY(&j,false); [line 18]\n NULLIFY(&self,false); [line 18]\n " color=yellow style=filled] 1 -> 14 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/types/attributes.dot b/infer/tests/codetoanalyze/objc/frontend/types/attributes.dot index 383181ae0..7fc954a9a 100644 --- a/infer/tests/codetoanalyze/objc/frontend/types/attributes.dot +++ b/infer/tests/codetoanalyze/objc/frontend/types/attributes.dot @@ -50,7 +50,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: aWeakRef:class A __weak * aStrongRef:class A * anUnsafeUnretRef:class A __unsafe_unretained * anAutoRelRef:class A __autoreleasing * aStdRef:class A * \n DECLARE_LOCALS(&return,&aWeakRef,&aStrongRef,&anUnsafeUnretRef,&anAutoRelRef,&aStdRef); [line 20]\n NULLIFY(&aStdRef,false); [line 20]\n NULLIFY(&aStrongRef,false); [line 20]\n NULLIFY(&aWeakRef,false); [line 20]\n NULLIFY(&anAutoRelRef,false); [line 20]\n NULLIFY(&anUnsafeUnretRef,false); [line 20]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: aStdRef:class A * anAutoRelRef:class A __autoreleasing * anUnsafeUnretRef:class A __unsafe_unretained * aStrongRef:class A * aWeakRef:class A __weak * \n DECLARE_LOCALS(&return,&aStdRef,&anAutoRelRef,&anUnsafeUnretRef,&aStrongRef,&aWeakRef); [line 20]\n NULLIFY(&aStdRef,false); [line 20]\n NULLIFY(&aStrongRef,false); [line 20]\n NULLIFY(&aWeakRef,false); [line 20]\n NULLIFY(&anAutoRelRef,false); [line 20]\n NULLIFY(&anUnsafeUnretRef,false); [line 20]\n " color=yellow style=filled] 1 -> 14 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/types/void_call.dot b/infer/tests/codetoanalyze/objc/frontend/types/void_call.dot index 26e0da04e..f3e33ac02 100644 --- a/infer/tests/codetoanalyze/objc/frontend/types/void_call.dot +++ b/infer/tests/codetoanalyze/objc/frontend/types/void_call.dot @@ -43,7 +43,7 @@ digraph iCFG { 14 [label="14: Exit main \n " color=yellow style=filled] -13 [label="13: Start main\nFormals: \nLocals: x:int o:class AClass * \n DECLARE_LOCALS(&return,&x,&o); [line 41]\n NULLIFY(&o,false); [line 41]\n NULLIFY(&x,false); [line 41]\n " color=yellow style=filled] +13 [label="13: Start main\nFormals: \nLocals: o:class AClass * x:int \n DECLARE_LOCALS(&return,&o,&x); [line 41]\n NULLIFY(&o,false); [line 41]\n NULLIFY(&x,false); [line 41]\n " color=yellow style=filled] 13 -> 24 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/vardecl/initlist.dot b/infer/tests/codetoanalyze/objc/frontend/vardecl/initlist.dot index bd61e5b86..2c70dd106 100644 --- a/infer/tests/codetoanalyze/objc/frontend/vardecl/initlist.dot +++ b/infer/tests/codetoanalyze/objc/frontend/vardecl/initlist.dot @@ -14,7 +14,7 @@ digraph iCFG { 5 [label="5: Exit test \n " color=yellow style=filled] -4 [label="4: Start test\nFormals: \nLocals: c1:class C * c2:class C * a:class C *[3] \n DECLARE_LOCALS(&return,&c1,&c2,&a); [line 21]\n NULLIFY(&a,false); [line 21]\n NULLIFY(&c1,false); [line 21]\n NULLIFY(&c2,false); [line 21]\n " color=yellow style=filled] +4 [label="4: Start test\nFormals: \nLocals: a:class C *[3] c2:class C * c1:class C * \n DECLARE_LOCALS(&return,&a,&c2,&c1); [line 21]\n NULLIFY(&a,false); [line 21]\n NULLIFY(&c1,false); [line 21]\n NULLIFY(&c2,false); [line 21]\n " color=yellow style=filled] 4 -> 8 ; @@ -25,7 +25,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: z:int a:int [2][3] \n DECLARE_LOCALS(&return,&z,&a); [line 12]\n NULLIFY(&a,false); [line 12]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: a:int [2][3] z:int \n DECLARE_LOCALS(&return,&a,&z); [line 12]\n NULLIFY(&a,false); [line 12]\n " color=yellow style=filled] 1 -> 3 ; diff --git a/infer/tests/codetoanalyze/objc/frontend/vardecl/last_af.dot b/infer/tests/codetoanalyze/objc/frontend/vardecl/last_af.dot index 8da05cbd9..7fc359dc4 100644 --- a/infer/tests/codetoanalyze/objc/frontend/vardecl/last_af.dot +++ b/infer/tests/codetoanalyze/objc/frontend/vardecl/last_af.dot @@ -10,7 +10,7 @@ digraph iCFG { 2 [label="2: Exit main \n " color=yellow style=filled] -1 [label="1: Start main\nFormals: \nLocals: a:int b:int \n DECLARE_LOCALS(&return,&a,&b); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] +1 [label="1: Start main\nFormals: \nLocals: b:int a:int \n DECLARE_LOCALS(&return,&b,&a); [line 10]\n NULLIFY(&a,false); [line 10]\n NULLIFY(&b,false); [line 10]\n " color=yellow style=filled] 1 -> 4 ;