diff --git a/infer/src/clang/cContext.ml b/infer/src/clang/cContext.ml index 1741dac0d..0e771f439 100644 --- a/infer/src/clang/cContext.ml +++ b/infer/src/clang/cContext.ml @@ -15,6 +15,7 @@ module Hashtbl = Caml.Hashtbl (** and the cg, cfg, and tenv corresponding to the current file. *) module L = Logging +module StmtMap = ClangPointers.Map type pointer = int [@@deriving compare] @@ -39,10 +40,11 @@ type t = (** in case of objc blocks, the context of the method containing the block *) ; mutable blocks_static_vars: (Pvar.t * Typ.t) list Typ.Procname.Map.t - ; label_map: str_node_map } + ; label_map: str_node_map + ; vars_to_destroy: Clang_ast_t.decl list StmtMap.t } let create_context translation_unit_context tenv cg cfg procdesc curr_class return_param_typ - is_objc_method outer_context = + is_objc_method outer_context vars_to_destroy = { translation_unit_context ; tenv ; cg @@ -53,7 +55,8 @@ let create_context translation_unit_context tenv cg cfg procdesc curr_class retu ; is_objc_method ; outer_context ; blocks_static_vars= Typ.Procname.Map.empty - ; label_map= Hashtbl.create 17 } + ; label_map= Hashtbl.create 17 + ; vars_to_destroy } let get_cfg context = context.cfg diff --git a/infer/src/clang/cContext.mli b/infer/src/clang/cContext.mli index 1587545de..95862fb3c 100644 --- a/infer/src/clang/cContext.mli +++ b/infer/src/clang/cContext.mli @@ -13,6 +13,8 @@ open! IStd (** and the cg, cfg, and tenv corresponding to the current file. *) +module StmtMap = ClangPointers.Map + type curr_class = ContextClsDeclPtr of int | ContextNoCls [@@deriving compare] val equal_curr_class : curr_class -> curr_class -> bool @@ -32,7 +34,10 @@ type t = (** in case of objc blocks, the context of the method containing the block *) ; mutable blocks_static_vars: (Pvar.t * Typ.t) list Typ.Procname.Map.t - ; label_map: str_node_map } + ; label_map: str_node_map + ; vars_to_destroy: Clang_ast_t.decl list StmtMap.t + (* mapping from a statement to a list of variables, that go out of scope after the end of the statement *) + } val get_procdesc : t -> Procdesc.t @@ -54,7 +59,7 @@ val get_tenv : t -> Tenv.t val create_context : CFrontend_config.translation_unit_context -> Tenv.t -> Cg.t -> Cfg.cfg -> Procdesc.t - -> curr_class -> Typ.t option -> bool -> t option -> t + -> curr_class -> Typ.t option -> bool -> t option -> Clang_ast_t.decl list StmtMap.t -> t val add_block_static_var : t -> Typ.Procname.t -> Pvar.t * Typ.t -> unit diff --git a/infer/src/clang/cFrontend_decl.ml b/infer/src/clang/cFrontend_decl.ml index ba063d905..6a6551c6c 100644 --- a/infer/src/clang/cFrontend_decl.ml +++ b/infer/src/clang/cFrontend_decl.ml @@ -29,9 +29,10 @@ module CFrontend_decl_funct (T : CModule_type.CTranslation) : CModule_type.CFron match Cfg.find_proc_desc_from_name cfg procname with | Some procdesc -> if Procdesc.is_defined procdesc && not (model_exists procname) then + let vars_to_destroy = CTrans_utils.Scope.compute_vars_to_destroy body in let context = CContext.create_context trans_unit_ctx tenv cg cfg procdesc class_decl_opt - has_return_param is_objc_method outer_context_opt + has_return_param is_objc_method outer_context_opt vars_to_destroy in let start_node = Procdesc.get_start_node procdesc in let exit_node = Procdesc.get_exit_node procdesc in diff --git a/infer/src/clang/cTrans.ml b/infer/src/clang/cTrans.ml index 26d5f5f1c..d829eb7dd 100644 --- a/infer/src/clang/cTrans.ml +++ b/infer/src/clang/cTrans.ml @@ -666,8 +666,18 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s -> None in match destruct_decl_ref_opt with - | Some decl_ref - -> method_deref_trans trans_state pvar_trans_result decl_ref si `CXXDestructor + | Some decl_ref -> ( + match CAst_utils.get_decl decl_ref.Clang_ast_t.dr_decl_pointer with + | Some CXXDestructorDecl (_, named_decl_info, _, {fdi_body= None}, _) + -> L.(debug Capture Verbose) + "@\n Trying to translate destructor call, but found empty destructor body for %s@\n@." + (CAst_utils.get_unqualified_name named_decl_info) ; + empty_res_trans + | Some CXXDestructorDecl (_, _, _, {fdi_body= Some _}, _) + (* Translate only those destructors that have bodies *) + -> method_deref_trans trans_state pvar_trans_result decl_ref si `CXXDestructor + | _ + -> empty_res_trans ) | None -> empty_res_trans @@ -1248,7 +1258,68 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s in instruction trans_state transformed_stmt - and compoundStmt_trans trans_state stmt_list = instructions trans_state stmt_list + and inject_destructors trans_state stmt_info = + let context = trans_state.context in + if not (CGeneral_utils.is_cpp_translation context.translation_unit_context) then + empty_res_trans + else + let procname = Procdesc.get_proc_name context.CContext.procdesc in + (* The source location of destructor should reflect the end of the statement *) + let _, sloc2 = stmt_info.Clang_ast_t.si_source_range in + let stmt_info_loc = {stmt_info with Clang_ast_t.si_source_range= (sloc2, sloc2)} in + (* ReturnStmt may claim a priority with the same `stmt_info`. + New pointer is generated to avoid premature node creation *) + let stmt_info' = + {stmt_info_loc with Clang_ast_t.si_pointer= CAst_utils.get_fresh_pointer ()} + in + let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info' in + let all_res_trans = + try + let map = context.CContext.vars_to_destroy in + let vars_to_destroy = CContext.StmtMap.find_exn map stmt_info.Clang_ast_t.si_pointer in + List.map + ~f:(function + | Clang_ast_t.VarDecl (_, _, qual_type, _) as decl + -> let pvar = CVar_decl.sil_var_of_decl context decl procname in + let exp = Exp.Lvar pvar in + let typ = CType_decl.qual_type_to_sil_type context.CContext.tenv qual_type in + let this_res_trans_destruct = + {empty_res_trans with exps= [(exp, CType.add_pointer_to_typ typ)]} + in + (* cxx_destructor_call_trans may claim a priority with the same `stmt_info`. + New pointer is generated to avoid premature node creation *) + let stmt_info'' = + {stmt_info_loc with Clang_ast_t.si_pointer= CAst_utils.get_fresh_pointer ()} + in + cxx_destructor_call_trans trans_state_pri stmt_info'' this_res_trans_destruct + qual_type + | _ + -> assert false) + vars_to_destroy + with Not_found -> + L.(debug Capture Verbose) "@\n Variables that go out of scope are not found...@\n@." ; [] + in + let sil_loc = CLocation.get_sil_location stmt_info context in + PriorityNode.compute_results_to_parent trans_state_pri sil_loc "Destruction" stmt_info' + all_res_trans + + and compoundStmt_trans trans_state stmt_info stmt_list = + (* Computing destructor call nodes to inject at the end of the compound statement, + except if the statement ends with Return statemenent *) + let destr_trans_result = + match List.last stmt_list with + | Some Clang_ast_t.ReturnStmt _ + -> empty_res_trans + | _ + -> inject_destructors trans_state stmt_info + in + (* Injecting destructor call nodes at the end of the compound statement *) + let succ_nodes = + if destr_trans_result.root_nodes <> [] then destr_trans_result.root_nodes + else trans_state.succ_nodes + in + let trans_state' = {trans_state with succ_nodes} in + instructions trans_state' stmt_list and conditionalOperator_trans trans_state stmt_info stmt_list expr_info = let context = trans_state.context in @@ -2171,7 +2242,11 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s let sil_loc = CLocation.get_sil_location stmt_info context in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in let mk_ret_node instrs = - let ret_node = create_node (Procdesc.Node.Stmt_node "Return Stmt") instrs sil_loc context in + let destr_trans_result = inject_destructors trans_state_pri stmt_info in + let ret_node = + create_node (Procdesc.Node.Stmt_node "Return Stmt") (instrs @ destr_trans_result.instrs) + sil_loc context + in Procdesc.node_set_succs_exn context.procdesc ret_node [Procdesc.get_exit_node context.CContext.procdesc] [] ; ret_node @@ -2766,9 +2841,9 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s block_enumeration_trans trans_state stmt_info stmt_list expr_info else objCMessageExpr_trans trans_state stmt_info obj_c_message_expr_info stmt_list expr_info - | CompoundStmt (_, stmt_list) + | CompoundStmt (stmt_info, stmt_list) -> (* No node for this statement. We just collect its statement list*) - compoundStmt_trans trans_state stmt_list + compoundStmt_trans trans_state stmt_info stmt_list | ConditionalOperator (stmt_info, stmt_list, expr_info) -> (* Ternary operator "cond ? exp1 : exp2" *) conditionalOperator_trans trans_state stmt_info stmt_list expr_info @@ -2885,19 +2960,19 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s -> blockExpr_trans trans_state stmt_info expr_info decl | ObjCAutoreleasePoolStmt (stmt_info, stmts) -> objcAutoreleasePool_trans trans_state stmt_info stmts - | ObjCAtTryStmt (_, stmts) - -> compoundStmt_trans trans_state stmts - | CXXTryStmt (_, stmts) + | ObjCAtTryStmt (stmt_info, stmts) + -> compoundStmt_trans trans_state stmt_info stmts + | CXXTryStmt (stmt_info, stmts) -> L.(debug Capture Medium) "@\n!!!!WARNING: found statement %s. @\nTranslation need to be improved.... @\n" (Clang_ast_proj.get_stmt_kind_string instr) ; - compoundStmt_trans trans_state stmts + compoundStmt_trans trans_state stmt_info stmts | ObjCAtThrowStmt (stmt_info, stmts) | CXXThrowExpr (stmt_info, stmts, _) -> objc_cxx_throw_trans trans_state stmt_info stmts - | ObjCAtFinallyStmt (_, stmts) - -> compoundStmt_trans trans_state stmts - | ObjCAtCatchStmt _ | CXXCatchStmt _ - -> compoundStmt_trans trans_state [] + | ObjCAtFinallyStmt (stmt_info, stmts) + -> compoundStmt_trans trans_state stmt_info stmts + | ObjCAtCatchStmt (stmt_info, _, _) | CXXCatchStmt (stmt_info, _, _) + -> compoundStmt_trans trans_state stmt_info [] | PredefinedExpr (_, _, expr_info, _) -> stringLiteral_trans trans_state expr_info "" | BinaryConditionalOperator (stmt_info, stmts, expr_info) diff --git a/infer/src/clang/cTrans_utils.ml b/infer/src/clang/cTrans_utils.ml index 2ab16ad9b..7666633f7 100644 --- a/infer/src/clang/cTrans_utils.ml +++ b/infer/src/clang/cTrans_utils.ml @@ -291,6 +291,50 @@ module Loops = struct with For (_, _, cond, _, _) | While (_, cond, _) | DoWhile (cond, _) -> cond end +module Scope = struct + module StmtMap = ClangPointers.Map + + let add_scope_vars_to_destroy var_map stmt_info vars = + let ptr = stmt_info.Clang_ast_t.si_pointer in + StmtMap.add var_map ~key:ptr ~data:vars + + let rec compute_vars vars_in_scope var_map stmt = + (* vars_in_scope corresponds to the list of all variables existing in the current scope *) + let open Clang_ast_t in + let get_var_info_from_decl = function VarDecl _ as decl -> Some decl | _ -> None in + let get_new_vars = function + | DeclStmt (_, _, decl_list) + -> List.filter_map ~f:get_var_info_from_decl decl_list + | _ + -> [] + in + let rec handle_instructions_block var_map vars_in_scope instrs = + match instrs with + | [] + -> (vars_in_scope, var_map) + | stmt :: rest + -> let new_var_map = compute_vars vars_in_scope var_map stmt in + let new_vars_in_stmt = get_new_vars stmt in + handle_instructions_block new_var_map (new_vars_in_stmt @ vars_in_scope) rest + in + (* TODO handle following stmts: *) + (* BreakStmt _ | ContinueStmt _ | GotoStmt _ | ForStmt _ | WhileStmt _ | + DoStmt _ | IfStmt _ | SwitchStmt _ | CXXForRangeStmt _ | LabelStmt_ *) + match stmt with + | CompoundStmt (stmt_info, stmt_list) + -> let vars, new_var_map = handle_instructions_block var_map vars_in_scope stmt_list in + (* vars contains the variables defined in the current compound statement + vars_in_scope *) + let vars_to_destroy = List.take vars (List.length vars - List.length vars_in_scope) in + add_scope_vars_to_destroy new_var_map stmt_info vars_to_destroy + | ReturnStmt (stmt_info, _) + -> add_scope_vars_to_destroy var_map stmt_info vars_in_scope + | _ + -> let stmt_list = snd (Clang_ast_proj.get_stmt_tuple stmt) in + List.fold_left ~f:(compute_vars vars_in_scope) stmt_list ~init:var_map + + let compute_vars_to_destroy body = List.fold_left ~f:(compute_vars []) ~init:StmtMap.empty [body] +end + (** This function handles ObjC new/alloc and C++ new calls *) let create_alloc_instrs sil_loc function_type fname size_exp_opt procname_opt = let function_type, function_type_np = diff --git a/infer/src/clang/cTrans_utils.mli b/infer/src/clang/cTrans_utils.mli index 7cd4d9f4f..a525cbcfb 100644 --- a/infer/src/clang/cTrans_utils.mli +++ b/infer/src/clang/cTrans_utils.mli @@ -197,6 +197,13 @@ module Loops : sig val get_body : loop_kind -> Clang_ast_t.stmt end +(** Module that provides utilities for scopes *) +module Scope : sig + module StmtMap = ClangPointers.Map + + val compute_vars_to_destroy : Clang_ast_t.stmt -> Clang_ast_t.decl list StmtMap.t +end + (** This module handles the translation of the variable self which is challenging because self is used both as a variable in instance method calls and also as a type in class method calls. *) module Self : sig diff --git a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main.cpp.dot b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main.cpp.dot index 200d4305b..9b4a951af 100644 --- a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main.cpp.dot +++ b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main.cpp.dot @@ -3,30 +3,34 @@ digraph iCFG { "main.fad58de7366495db4650cfefac2fcd61_1" [label="1: Start main\nFormals: \nLocals: s:std::basic_string,std::allocator> x:int* \n DECLARE_LOCALS(&return,&s,&x); [line 17]\n " color=yellow style=filled] - "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; + "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_8" ; "main.fad58de7366495db4650cfefac2fcd61_2" [label="2: Exit main \n " color=yellow style=filled] -"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: Destruction \n _=*&s:std::basic_string,std::allocator> [line 24]\n _fun_std::basic_string,std::allocator>_~basic_string(&s:std::basic_string,std::allocator>*) [line 24]\n _=*&x:int* [line 24]\n _fun_std::shared_ptr_~shared_ptr(&x:int**) [line 24]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_3" -> "main.fad58de7366495db4650cfefac2fcd61_2" ; -"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$0=*&x:int* [line 21]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_4" -> "main.fad58de7366495db4650cfefac2fcd61_3" ; -"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: Call _fun_external::fun \n n$1=_fun_external::fun(1:int) [line 20]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$2=*&x:int* [line 21]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_5" -> "main.fad58de7366495db4650cfefac2fcd61_4" ; -"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_internal_exclude::fun \n n$2=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_external::fun \n n$3=_fun_external::fun(1:int) [line 20]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_6" -> "main.fad58de7366495db4650cfefac2fcd61_5" ; -"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal::fun \n n$3=_fun_internal::fun(1:int) [line 18]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal_exclude::fun \n n$4=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_7" -> "main.fad58de7366495db4650cfefac2fcd61_6" ; +"main.fad58de7366495db4650cfefac2fcd61_8" [label="8: Call _fun_internal::fun \n n$5=_fun_internal::fun(1:int) [line 18]\n " shape="box"] + + + "main.fad58de7366495db4650cfefac2fcd61_8" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; "fun#internal#_ZN8internal3funEi.155c7f802a6b5777ac6736e35c7e46a6_1" [label="1: Start internal::fun\nFormals: a:int\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] diff --git a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_root.cpp.dot b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_root.cpp.dot index 200d4305b..9b4a951af 100644 --- a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_root.cpp.dot +++ b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_root.cpp.dot @@ -3,30 +3,34 @@ digraph iCFG { "main.fad58de7366495db4650cfefac2fcd61_1" [label="1: Start main\nFormals: \nLocals: s:std::basic_string,std::allocator> x:int* \n DECLARE_LOCALS(&return,&s,&x); [line 17]\n " color=yellow style=filled] - "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; + "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_8" ; "main.fad58de7366495db4650cfefac2fcd61_2" [label="2: Exit main \n " color=yellow style=filled] -"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: Destruction \n _=*&s:std::basic_string,std::allocator> [line 24]\n _fun_std::basic_string,std::allocator>_~basic_string(&s:std::basic_string,std::allocator>*) [line 24]\n _=*&x:int* [line 24]\n _fun_std::shared_ptr_~shared_ptr(&x:int**) [line 24]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_3" -> "main.fad58de7366495db4650cfefac2fcd61_2" ; -"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$0=*&x:int* [line 21]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_4" -> "main.fad58de7366495db4650cfefac2fcd61_3" ; -"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: Call _fun_external::fun \n n$1=_fun_external::fun(1:int) [line 20]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$2=*&x:int* [line 21]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_5" -> "main.fad58de7366495db4650cfefac2fcd61_4" ; -"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_internal_exclude::fun \n n$2=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_external::fun \n n$3=_fun_external::fun(1:int) [line 20]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_6" -> "main.fad58de7366495db4650cfefac2fcd61_5" ; -"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal::fun \n n$3=_fun_internal::fun(1:int) [line 18]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal_exclude::fun \n n$4=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_7" -> "main.fad58de7366495db4650cfefac2fcd61_6" ; +"main.fad58de7366495db4650cfefac2fcd61_8" [label="8: Call _fun_internal::fun \n n$5=_fun_internal::fun(1:int) [line 18]\n " shape="box"] + + + "main.fad58de7366495db4650cfefac2fcd61_8" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; "fun#internal#_ZN8internal3funEi.155c7f802a6b5777ac6736e35c7e46a6_1" [label="1: Start internal::fun\nFormals: a:int\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] diff --git a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_symlink.cpp.dot b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_symlink.cpp.dot index 200d4305b..9b4a951af 100644 --- a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_symlink.cpp.dot +++ b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_default_symlink.cpp.dot @@ -3,30 +3,34 @@ digraph iCFG { "main.fad58de7366495db4650cfefac2fcd61_1" [label="1: Start main\nFormals: \nLocals: s:std::basic_string,std::allocator> x:int* \n DECLARE_LOCALS(&return,&s,&x); [line 17]\n " color=yellow style=filled] - "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; + "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_8" ; "main.fad58de7366495db4650cfefac2fcd61_2" [label="2: Exit main \n " color=yellow style=filled] -"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: Destruction \n _=*&s:std::basic_string,std::allocator> [line 24]\n _fun_std::basic_string,std::allocator>_~basic_string(&s:std::basic_string,std::allocator>*) [line 24]\n _=*&x:int* [line 24]\n _fun_std::shared_ptr_~shared_ptr(&x:int**) [line 24]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_3" -> "main.fad58de7366495db4650cfefac2fcd61_2" ; -"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$0=*&x:int* [line 21]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_4" -> "main.fad58de7366495db4650cfefac2fcd61_3" ; -"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: Call _fun_external::fun \n n$1=_fun_external::fun(1:int) [line 20]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$2=*&x:int* [line 21]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_5" -> "main.fad58de7366495db4650cfefac2fcd61_4" ; -"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_internal_exclude::fun \n n$2=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_external::fun \n n$3=_fun_external::fun(1:int) [line 20]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_6" -> "main.fad58de7366495db4650cfefac2fcd61_5" ; -"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal::fun \n n$3=_fun_internal::fun(1:int) [line 18]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal_exclude::fun \n n$4=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_7" -> "main.fad58de7366495db4650cfefac2fcd61_6" ; +"main.fad58de7366495db4650cfefac2fcd61_8" [label="8: Call _fun_internal::fun \n n$5=_fun_internal::fun(1:int) [line 18]\n " shape="box"] + + + "main.fad58de7366495db4650cfefac2fcd61_8" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; "fun#internal#_ZN8internal3funEi.155c7f802a6b5777ac6736e35c7e46a6_1" [label="1: Start internal::fun\nFormals: a:int\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] diff --git a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_symlink.cpp.dot b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_symlink.cpp.dot index 200d4305b..9b4a951af 100644 --- a/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_symlink.cpp.dot +++ b/infer/tests/build_systems/codetoanalyze/clang_translation/src/main_symlink.cpp.dot @@ -3,30 +3,34 @@ digraph iCFG { "main.fad58de7366495db4650cfefac2fcd61_1" [label="1: Start main\nFormals: \nLocals: s:std::basic_string,std::allocator> x:int* \n DECLARE_LOCALS(&return,&s,&x); [line 17]\n " color=yellow style=filled] - "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; + "main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_8" ; "main.fad58de7366495db4650cfefac2fcd61_2" [label="2: Exit main \n " color=yellow style=filled] -"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: Destruction \n _=*&s:std::basic_string,std::allocator> [line 24]\n _fun_std::basic_string,std::allocator>_~basic_string(&s:std::basic_string,std::allocator>*) [line 24]\n _=*&x:int* [line 24]\n _fun_std::shared_ptr_~shared_ptr(&x:int**) [line 24]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_3" -> "main.fad58de7366495db4650cfefac2fcd61_2" ; -"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$0=*&x:int* [line 21]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: DeclStmt \n _fun_std::basic_string,std::allocator>_basic_string(&s:std::basic_string,std::allocator>*,\"1234\":char const *) [line 22]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_4" -> "main.fad58de7366495db4650cfefac2fcd61_3" ; -"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: Call _fun_external::fun \n n$1=_fun_external::fun(1:int) [line 20]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: DeclStmt \n _fun_std::shared_ptr_shared_ptr(&x:int**) [line 21]\n n$2=*&x:int* [line 21]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_5" -> "main.fad58de7366495db4650cfefac2fcd61_4" ; -"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_internal_exclude::fun \n n$2=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: Call _fun_external::fun \n n$3=_fun_external::fun(1:int) [line 20]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_6" -> "main.fad58de7366495db4650cfefac2fcd61_5" ; -"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal::fun \n n$3=_fun_internal::fun(1:int) [line 18]\n " shape="box"] +"main.fad58de7366495db4650cfefac2fcd61_7" [label="7: Call _fun_internal_exclude::fun \n n$4=_fun_internal_exclude::fun(1:int) [line 19]\n " shape="box"] "main.fad58de7366495db4650cfefac2fcd61_7" -> "main.fad58de7366495db4650cfefac2fcd61_6" ; +"main.fad58de7366495db4650cfefac2fcd61_8" [label="8: Call _fun_internal::fun \n n$5=_fun_internal::fun(1:int) [line 18]\n " shape="box"] + + + "main.fad58de7366495db4650cfefac2fcd61_8" -> "main.fad58de7366495db4650cfefac2fcd61_7" ; "fun#internal#_ZN8internal3funEi.155c7f802a6b5777ac6736e35c7e46a6_1" [label="1: Start internal::fun\nFormals: a:int\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] diff --git a/infer/tests/codetoanalyze/cpp/errors/issues.exp b/infer/tests/codetoanalyze/cpp/errors/issues.exp index 9c637d06c..039e14828 100644 --- a/infer/tests/codetoanalyze/cpp/errors/issues.exp +++ b/infer/tests/codetoanalyze/cpp/errors/issues.exp @@ -56,8 +56,8 @@ codetoanalyze/cpp/errors/npe/npe_added_to_b1.cpp, npe_added_to_b1::causes_npe, 2 codetoanalyze/cpp/errors/npe/npe_added_to_b1.cpp, npe_added_to_b1::causes_npe_person, 2, NULL_DEREFERENCE, [start of procedure npe_added_to_b1::causes_npe_person(),start of procedure Person,return from a call to npe_added_to_b1::Person_Person,start of procedure npe_added_to_b1::deref_person()] codetoanalyze/cpp/errors/npe/null_returned_by_method.cpp, testNullDeref, 3, NULL_DEREFERENCE, [start of procedure testNullDeref(),Condition is true,start of procedure getNull,return from a call to XFactory_getNull] codetoanalyze/cpp/errors/npe/object_deref.cpp, object_deref::derefNullField, 2, NULL_DEREFERENCE, [start of procedure object_deref::derefNullField(),start of procedure object_deref::getNull(),return from a call to object_deref::getNull] -codetoanalyze/cpp/errors/npe/skip_function_with_const_formals.cpp, const_skip2_then_split_case, 5, MEMORY_LEAK, [start of procedure const_skip2_then_split_case(),Skipped call: function or method not found,start of procedure test_pointer(),Condition is true,return from a call to test_pointer,return from a call to const_skip2_then_split_case] -codetoanalyze/cpp/errors/npe/skip_function_with_const_formals.cpp, const_skip_then_split_case, 6, MEMORY_LEAK, [start of procedure const_skip_then_split_case(),Skipped call: function or method not found,start of procedure test_pointer(),Condition is true,return from a call to test_pointer,return from a call to const_skip_then_split_case] +codetoanalyze/cpp/errors/npe/skip_function_with_const_formals.cpp, const_skip2_then_split_case, 5, MEMORY_LEAK, [start of procedure const_skip2_then_split_case(),Skipped call: function or method not found,start of procedure test_pointer(),Condition is true,return from a call to test_pointer] +codetoanalyze/cpp/errors/npe/skip_function_with_const_formals.cpp, const_skip_then_split_case, 6, MEMORY_LEAK, [start of procedure const_skip_then_split_case(),Skipped call: function or method not found,start of procedure test_pointer(),Condition is true,return from a call to test_pointer] codetoanalyze/cpp/errors/npe/skip_function_with_const_formals.cpp, skip_then_split_case, 2, MEMORY_LEAK, [start of procedure skip_then_split_case(),Skipped call: function or method not found] codetoanalyze/cpp/errors/npe/skip_function_with_const_formals.cpp, skip_then_split_case, 5, NULL_DEREFERENCE, [start of procedure skip_then_split_case(),Skipped call: function or method not found,start of procedure test_pointer(),Condition is false,return from a call to test_pointer] codetoanalyze/cpp/errors/npe/skip_function_with_const_formals.cpp, typedef_skip_then_split_case, 2, MEMORY_LEAK, [start of procedure typedef_skip_then_split_case(),Skipped call: function or method not found] @@ -81,8 +81,8 @@ codetoanalyze/cpp/errors/smart_ptr/const_volatile_type.cpp, test_volatile2, 2, N codetoanalyze/cpp/errors/smart_ptr/const_volatile_type.cpp, test_volatile3, 3, NULL_DEREFERENCE, [start of procedure test_volatile3()] codetoanalyze/cpp/errors/smart_ptr/const_volatile_type.cpp, test_volatile4, 2, NULL_DEREFERENCE, [start of procedure test_volatile4()] codetoanalyze/cpp/errors/smart_ptr/deref_after_move_example.cpp, deref_after_mode_example::deref_after_move_crash, 4, NULL_DEREFERENCE, [start of procedure deref_after_mode_example::deref_after_move_crash(),start of procedure Person,return from a call to deref_after_mode_example::Person_Person,start of procedure move_age,return from a call to deref_after_mode_example::Person_move_age,start of procedure access_age] -codetoanalyze/cpp/errors/smart_ptr/deref_after_move_example.cpp, deref_after_mode_example::deref_after_move_ok, 4, MEMORY_LEAK, [start of procedure deref_after_mode_example::deref_after_move_ok(),start of procedure Person,return from a call to deref_after_mode_example::Person_Person,start of procedure move_age,return from a call to deref_after_mode_example::Person_move_age,return from a call to deref_after_mode_example::deref_after_move_ok] -codetoanalyze/cpp/errors/smart_ptr/deref_after_move_example.cpp, deref_after_mode_example::deref_ok, 3, MEMORY_LEAK, [start of procedure deref_after_mode_example::deref_ok(),start of procedure Person,return from a call to deref_after_mode_example::Person_Person,start of procedure access_age,return from a call to deref_after_mode_example::Person_access_age,return from a call to deref_after_mode_example::deref_ok] +codetoanalyze/cpp/errors/smart_ptr/deref_after_move_example.cpp, deref_after_mode_example::deref_after_move_ok, 3, MEMORY_LEAK, [start of procedure deref_after_mode_example::deref_after_move_ok(),start of procedure Person,return from a call to deref_after_mode_example::Person_Person,start of procedure move_age,return from a call to deref_after_mode_example::Person_move_age,start of procedure ~Person,return from a call to deref_after_mode_example::Person_~Person] +codetoanalyze/cpp/errors/smart_ptr/deref_after_move_example.cpp, deref_after_mode_example::deref_ok, 3, MEMORY_LEAK, [start of procedure deref_after_mode_example::deref_ok(),start of procedure Person,return from a call to deref_after_mode_example::Person_Person,start of procedure access_age,return from a call to deref_after_mode_example::Person_access_age,start of procedure ~Person,return from a call to deref_after_mode_example::Person_~Person,return from a call to deref_after_mode_example::deref_ok] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_constructors.cpp, shared_ptr_constructors::aliasing_member_null_bad, 4, NULL_DEREFERENCE, [start of procedure shared_ptr_constructors::aliasing_member_null_bad(),start of procedure shared_ptr_constructors::aliasing_construct_from_internal(),start of procedure shared_ptr_constructors::internal_null_def(),Skipped call: function or method not found,return from a call to shared_ptr_constructors::internal_null_def,Condition is true,Condition is false,return from a call to shared_ptr_constructors::aliasing_construct_from_internal] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_constructors.cpp, shared_ptr_constructors::get_from_base1_null_f1_deref, 6, NULL_DEREFERENCE, [start of procedure shared_ptr_constructors::get_from_base1_null_f1_deref(),start of procedure Base,return from a call to shared_ptr_constructors::Base_Base,start of procedure shared_ptr_constructors::getFromBase1(),return from a call to shared_ptr_constructors::getFromBase1] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_constructors.cpp, shared_ptr_constructors::get_from_base1_nullptr_deref, 0, NULL_DEREFERENCE, [start of procedure shared_ptr_constructors::get_from_base1_nullptr_deref(),start of procedure shared_ptr_constructors::getFromBase1(),return from a call to shared_ptr_constructors::getFromBase1] @@ -104,17 +104,17 @@ codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_n codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_null_deref2, 2, MEMORY_LEAK, [start of procedure shared_ptr::reset_ptr_null_deref2()] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_null_deref2, 3, MEMORY_LEAK, [start of procedure shared_ptr::reset_ptr_null_deref2()] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_null_deref2, 4, NULL_DEREFERENCE, [start of procedure shared_ptr::reset_ptr_null_deref2()] +codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_ok_deref, 3, MEMORY_LEAK, [start of procedure shared_ptr::reset_ptr_ok_deref()] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_ok_deref, 3, UNINITIALIZED_VALUE, [start of procedure shared_ptr::reset_ptr_ok_deref()] -codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_ok_deref, 4, MEMORY_LEAK, [start of procedure shared_ptr::reset_ptr_ok_deref(),return from a call to shared_ptr::reset_ptr_ok_deref] +codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_ok_deref2, 4, MEMORY_LEAK, [start of procedure shared_ptr::reset_ptr_ok_deref2()] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_ok_deref2, 4, UNINITIALIZED_VALUE, [start of procedure shared_ptr::reset_ptr_ok_deref2()] -codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::reset_ptr_ok_deref2, 5, MEMORY_LEAK, [start of procedure shared_ptr::reset_ptr_ok_deref2(),return from a call to shared_ptr::reset_ptr_ok_deref2] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_assign_null_deref, 3, MEMORY_LEAK, [start of procedure shared_ptr::shared_ptr_assign_null_deref()] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_assign_null_deref, 4, NULL_DEREFERENCE, [start of procedure shared_ptr::shared_ptr_assign_null_deref()] +codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_assign_ok_deref, 5, MEMORY_LEAK, [start of procedure shared_ptr::shared_ptr_assign_ok_deref()] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_assign_ok_deref, 5, UNINITIALIZED_VALUE, [start of procedure shared_ptr::shared_ptr_assign_ok_deref()] -codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_assign_ok_deref, 6, MEMORY_LEAK, [start of procedure shared_ptr::shared_ptr_assign_ok_deref(),return from a call to shared_ptr::shared_ptr_assign_ok_deref] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_copy_null_deref, 3, NULL_DEREFERENCE, [start of procedure shared_ptr::shared_ptr_copy_null_deref()] +codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_copy_ok_deref, 3, MEMORY_LEAK, [start of procedure shared_ptr::shared_ptr_copy_ok_deref()] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_copy_ok_deref, 3, UNINITIALIZED_VALUE, [start of procedure shared_ptr::shared_ptr_copy_ok_deref()] -codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_copy_ok_deref, 4, MEMORY_LEAK, [start of procedure shared_ptr::shared_ptr_copy_ok_deref(),return from a call to shared_ptr::shared_ptr_copy_ok_deref] codetoanalyze/cpp/errors/smart_ptr/shared_ptr_deref.cpp, shared_ptr::shared_ptr_move_null_deref, 3, NULL_DEREFERENCE, [start of procedure shared_ptr::shared_ptr_move_null_deref()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::empty_array_ptr_deref, 2, NULL_DEREFERENCE, [start of procedure unique_ptr::empty_array_ptr_deref()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::empty_ptr_deref, 2, NULL_DEREFERENCE, [start of procedure unique_ptr::empty_ptr_deref()] @@ -128,18 +128,18 @@ codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_n codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_null_deref2, 2, MEMORY_LEAK, [start of procedure unique_ptr::reset_ptr_null_deref2()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_null_deref2, 3, MEMORY_LEAK, [start of procedure unique_ptr::reset_ptr_null_deref2()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_null_deref2, 4, NULL_DEREFERENCE, [start of procedure unique_ptr::reset_ptr_null_deref2()] +codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_ok_deref, 3, MEMORY_LEAK, [start of procedure unique_ptr::reset_ptr_ok_deref()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_ok_deref, 3, UNINITIALIZED_VALUE, [start of procedure unique_ptr::reset_ptr_ok_deref()] -codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_ok_deref, 4, MEMORY_LEAK, [start of procedure unique_ptr::reset_ptr_ok_deref(),return from a call to unique_ptr::reset_ptr_ok_deref] +codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_ok_deref2, 4, MEMORY_LEAK, [start of procedure unique_ptr::reset_ptr_ok_deref2()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_ok_deref2, 4, UNINITIALIZED_VALUE, [start of procedure unique_ptr::reset_ptr_ok_deref2()] -codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::reset_ptr_ok_deref2, 5, MEMORY_LEAK, [start of procedure unique_ptr::reset_ptr_ok_deref2(),return from a call to unique_ptr::reset_ptr_ok_deref2] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_assign_null_deref, 3, MEMORY_LEAK, [start of procedure unique_ptr::unique_ptr_assign_null_deref()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_assign_null_deref, 4, NULL_DEREFERENCE, [start of procedure unique_ptr::unique_ptr_assign_null_deref()] +codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_assign_ok_deref, 5, MEMORY_LEAK, [start of procedure unique_ptr::unique_ptr_assign_ok_deref()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_assign_ok_deref, 5, UNINITIALIZED_VALUE, [start of procedure unique_ptr::unique_ptr_assign_ok_deref()] -codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_assign_ok_deref, 6, MEMORY_LEAK, [start of procedure unique_ptr::unique_ptr_assign_ok_deref(),return from a call to unique_ptr::unique_ptr_assign_ok_deref] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_copy_null_deref, 3, NULL_DEREFERENCE, [start of procedure unique_ptr::unique_ptr_copy_null_deref()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_move_null_deref, 3, NULL_DEREFERENCE, [start of procedure unique_ptr::unique_ptr_move_null_deref()] +codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_move_ok_deref, 3, MEMORY_LEAK, [start of procedure unique_ptr::unique_ptr_move_ok_deref()] codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_move_ok_deref, 3, UNINITIALIZED_VALUE, [start of procedure unique_ptr::unique_ptr_move_ok_deref()] -codetoanalyze/cpp/errors/smart_ptr/unique_ptr_deref.cpp, unique_ptr::unique_ptr_move_ok_deref, 4, MEMORY_LEAK, [start of procedure unique_ptr::unique_ptr_move_ok_deref(),return from a call to unique_ptr::unique_ptr_move_ok_deref] codetoanalyze/cpp/errors/smart_ptr/weak_ptr.cpp, weak_ptr_derefs::safeGetFromSharedBaseAssign_bad, 4, NULL_DEREFERENCE, [start of procedure weak_ptr_derefs::safeGetFromSharedBaseAssign_bad(),start of procedure weak_ptr_constructors::fromSharedBaseAssign(),return from a call to weak_ptr_constructors::fromSharedBaseAssign,start of procedure weak_ptr_derefs::safeGet(),Condition is true,Condition is false,return from a call to weak_ptr_derefs::safeGet] codetoanalyze/cpp/errors/smart_ptr/weak_ptr.cpp, weak_ptr_derefs::safeGetFromSharedBaseConstr_bad, 4, NULL_DEREFERENCE, [start of procedure weak_ptr_derefs::safeGetFromSharedBaseConstr_bad(),start of procedure weak_ptr_constructors::fromSharedBaseConstr(),return from a call to weak_ptr_constructors::fromSharedBaseConstr,start of procedure weak_ptr_derefs::safeGet(),Condition is true,Condition is false,return from a call to weak_ptr_derefs::safeGet] codetoanalyze/cpp/errors/smart_ptr/weak_ptr.cpp, weak_ptr_derefs::safeGetFromSharedDerivedAssign_bad, 4, NULL_DEREFERENCE, [start of procedure weak_ptr_derefs::safeGetFromSharedDerivedAssign_bad(),start of procedure weak_ptr_constructors::fromSharedDerivedAssign(),return from a call to weak_ptr_constructors::fromSharedDerivedAssign,start of procedure weak_ptr_derefs::safeGet(),Condition is true,Condition is false,return from a call to weak_ptr_derefs::safeGet] @@ -188,7 +188,7 @@ codetoanalyze/cpp/errors/types/typeid_expr.cpp, person_typeid_name, 4, MEMORY_LE codetoanalyze/cpp/errors/types/typeid_expr.cpp, person_typeid_name, 8, DIVIDE_BY_ZERO, [start of procedure person_typeid_name(),start of procedure Person,return from a call to Person_Person,Condition is false] codetoanalyze/cpp/errors/types/typeid_expr.cpp, template_type_id_person, 2, MEMORY_LEAK, [start of procedure template_type_id_person(),start of procedure Person,return from a call to Person_Person,Skipped call: function or method not found] codetoanalyze/cpp/errors/types/typeid_expr.cpp, template_type_id_person, 5, DIVIDE_BY_ZERO, [start of procedure template_type_id_person(),start of procedure Person,return from a call to Person_Person,Condition is false] -codetoanalyze/cpp/errors/types/typeid_expr.cpp, template_typeid, 2, MEMORY_LEAK, [start of procedure template_typeid(),start of procedure Person,return from a call to Person_Person,start of procedure Person,return from a call to Person_Person] +codetoanalyze/cpp/errors/types/typeid_expr.cpp, template_typeid, 2, MEMORY_LEAK, [start of procedure template_typeid(),start of procedure Person,return from a call to Person_Person,start of procedure Person,return from a call to Person_Person,start of procedure ~Person,return from a call to Person_~Person] codetoanalyze/cpp/errors/vector/access_field_later.cpp, getIntPtr, 1, RETURN_VALUE_IGNORED, [start of procedure getIntPtr()] codetoanalyze/cpp/errors/vector/access_field_later.cpp, getIntPtr, 2, EMPTY_VECTOR_ACCESS, [start of procedure getIntPtr()] codetoanalyze/cpp/errors/vector/access_field_later.cpp, getWithCopy, 1, RETURN_VALUE_IGNORED, [start of procedure getWithCopy()] diff --git a/infer/tests/codetoanalyze/cpp/frontend/destructors/scope.cpp b/infer/tests/codetoanalyze/cpp/frontend/destructors/scope.cpp new file mode 100644 index 000000000..af387924a --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/frontend/destructors/scope.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2017 - 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. + */ +namespace destructor_scope { + +struct X { + ~X() {} +}; + +struct Y { + ~Y() {} +}; + +struct Z {}; + +struct S { + X x; +}; + +void test1(bool a, bool b) { + X x1; + S s; + { + X x2; + Y y2; + if (a) { + return; + } + { + X x3; + if (b) { + return; + } + } + } + Y y1; + { Y y3; } +} + +int test2(bool a) { + X x1; + if (a) { + X x2; + return 1; + } else { + X x3; + return 2; + } +} + +X getX() { + X x; + return x; +} + +Z getZ() { + Z z; + return z; +} + +/* Having `callgetZ` with a function call to `getZ` + makes clang to add a destructor ~Z with empty body for `Z`. + We want to test if we do not inject empty-body destructor + call in `getZ`. */ +void callgetZ() { getZ(); } +} // namespace destructor_scope diff --git a/infer/tests/codetoanalyze/cpp/frontend/destructors/scope.cpp.dot b/infer/tests/codetoanalyze/cpp/frontend/destructors/scope.cpp.dot new file mode 100644 index 000000000..34f9d3408 --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/frontend/destructors/scope.cpp.dot @@ -0,0 +1,240 @@ +/* @generated */ +digraph iCFG { +"callgetZ#destructor_scope#_ZN16destructor_scope8callgetZEv.2c9a1cb54f86af11f45d83039775201e_1" [label="1: Start destructor_scope::callgetZ\nFormals: \nLocals: 0$?%__sil_tmp__temp_return_n$1:destructor_scope::Z \n DECLARE_LOCALS(&return,&0$?%__sil_tmp__temp_return_n$1); [line 70]\n " color=yellow style=filled] + + + "callgetZ#destructor_scope#_ZN16destructor_scope8callgetZEv.2c9a1cb54f86af11f45d83039775201e_1" -> "callgetZ#destructor_scope#_ZN16destructor_scope8callgetZEv.2c9a1cb54f86af11f45d83039775201e_3" ; +"callgetZ#destructor_scope#_ZN16destructor_scope8callgetZEv.2c9a1cb54f86af11f45d83039775201e_2" [label="2: Exit destructor_scope::callgetZ \n " color=yellow style=filled] + + +"callgetZ#destructor_scope#_ZN16destructor_scope8callgetZEv.2c9a1cb54f86af11f45d83039775201e_3" [label="3: Call _fun_destructor_scope::getZ \n _fun_destructor_scope::getZ(&0$?%__sil_tmp__temp_return_n$1:destructor_scope::Z*) [line 70]\n " shape="box"] + + + "callgetZ#destructor_scope#_ZN16destructor_scope8callgetZEv.2c9a1cb54f86af11f45d83039775201e_3" -> "callgetZ#destructor_scope#_ZN16destructor_scope8callgetZEv.2c9a1cb54f86af11f45d83039775201e_2" ; +"getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_1" [label="1: Start destructor_scope::getX\nFormals: __return_param:destructor_scope::X*\nLocals: x:destructor_scope::X \n DECLARE_LOCALS(&return,&x); [line 56]\n " color=yellow style=filled] + + + "getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_1" -> "getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_4" ; +"getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_2" [label="2: Exit destructor_scope::getX \n " color=yellow style=filled] + + +"getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_3" [label="3: Return Stmt \n n$0=*&__return_param:destructor_scope::X* [line 58]\n _fun_destructor_scope::X_X(n$0:destructor_scope::X*,&x:destructor_scope::X&) [line 58]\n _=*&x:destructor_scope::X [line 58]\n _fun_destructor_scope::X_~X(&x:destructor_scope::X*) [line 58]\n " shape="box"] + + + "getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_3" -> "getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_2" ; +"getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_4" [label="4: DeclStmt \n _fun_destructor_scope::X_X(&x:destructor_scope::X*) [line 57]\n " shape="box"] + + + "getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_4" -> "getX#destructor_scope#_ZN16destructor_scope4getXEv.b2ba3b7097be97728da335bbc1da58e3_3" ; +"getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_1" [label="1: Start destructor_scope::getZ\nFormals: __return_param:destructor_scope::Z*\nLocals: z:destructor_scope::Z \n DECLARE_LOCALS(&return,&z); [line 61]\n " color=yellow style=filled] + + + "getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_1" -> "getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_4" ; +"getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_2" [label="2: Exit destructor_scope::getZ \n " color=yellow style=filled] + + +"getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_3" [label="3: Return Stmt \n n$0=*&__return_param:destructor_scope::Z* [line 63]\n _fun_destructor_scope::Z_Z(n$0:destructor_scope::Z*,&z:destructor_scope::Z&) [line 63]\n " shape="box"] + + + "getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_3" -> "getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_2" ; +"getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_4" [label="4: DeclStmt \n _fun_destructor_scope::Z_Z(&z:destructor_scope::Z*) [line 62]\n " shape="box"] + + + "getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_4" -> "getZ#destructor_scope#_ZN16destructor_scope4getZEv.3a61a74007b69468d628bfcaa77ebe85_3" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_1" [label="1: Start destructor_scope::test2\nFormals: a:_Bool\nLocals: x2:destructor_scope::X x3:destructor_scope::X x1:destructor_scope::X \n DECLARE_LOCALS(&return,&x2,&x3,&x1); [line 45]\n " color=yellow style=filled] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_1" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_11" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_2" [label="2: Exit destructor_scope::test2 \n " color=yellow style=filled] + + +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_3" [label="3: Destruction \n _=*&x1:destructor_scope::X [line 54]\n _fun_destructor_scope::X_~X(&x1:destructor_scope::X*) [line 54]\n " shape="box"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_3" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_2" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_4" [label="4: + \n " ] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_4" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_3" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_5" [label="5: Prune (true branch) \n n$1=*&a:_Bool [line 47]\n PRUNE((n$1 != 0), true); [line 47]\n " shape="invhouse"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_5" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_8" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_6" [label="6: Prune (false branch) \n n$1=*&a:_Bool [line 47]\n PRUNE((n$1 == 0), false); [line 47]\n " shape="invhouse"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_6" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_10" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_7" [label="7: Return Stmt \n *&return:int=1 [line 49]\n _=*&x2:destructor_scope::X [line 49]\n _fun_destructor_scope::X_~X(&x2:destructor_scope::X*) [line 49]\n _=*&x1:destructor_scope::X [line 49]\n _fun_destructor_scope::X_~X(&x1:destructor_scope::X*) [line 49]\n " shape="box"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_7" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_2" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_8" [label="8: DeclStmt \n _fun_destructor_scope::X_X(&x2:destructor_scope::X*) [line 48]\n " shape="box"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_8" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_7" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_9" [label="9: Return Stmt \n *&return:int=2 [line 52]\n _=*&x3:destructor_scope::X [line 52]\n _fun_destructor_scope::X_~X(&x3:destructor_scope::X*) [line 52]\n _=*&x1:destructor_scope::X [line 52]\n _fun_destructor_scope::X_~X(&x1:destructor_scope::X*) [line 52]\n " shape="box"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_9" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_2" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_10" [label="10: DeclStmt \n _fun_destructor_scope::X_X(&x3:destructor_scope::X*) [line 51]\n " shape="box"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_10" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_9" ; +"test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_11" [label="11: DeclStmt \n _fun_destructor_scope::X_X(&x1:destructor_scope::X*) [line 46]\n " shape="box"] + + + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_11" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_5" ; + "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_11" -> "test2#destructor_scope#_ZN16destructor_scope5test2Eb.098ed11854422e6a46c509b82dd7020a_6" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_1" [label="1: Start destructor_scope::test1\nFormals: a:_Bool b:_Bool\nLocals: y3:destructor_scope::Y y1:destructor_scope::Y x3:destructor_scope::X y2:destructor_scope::Y x2:destructor_scope::X s:destructor_scope::S x1:destructor_scope::X \n DECLARE_LOCALS(&return,&y3,&y1,&x3,&y2,&x2,&s,&x1); [line 25]\n " color=yellow style=filled] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_1" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_21" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_2" [label="2: Exit destructor_scope::test1 \n " color=yellow style=filled] + + +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_3" [label="3: Destruction \n _=*&y1:destructor_scope::Y [line 43]\n _fun_destructor_scope::Y_~Y(&y1:destructor_scope::Y*) [line 43]\n _=*&s:destructor_scope::S [line 43]\n _fun_destructor_scope::S_~S(&s:destructor_scope::S*) [line 43]\n _=*&x1:destructor_scope::X [line 43]\n _fun_destructor_scope::X_~X(&x1:destructor_scope::X*) [line 43]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_3" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_2" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_4" [label="4: Destruction \n _=*&y3:destructor_scope::Y [line 42]\n _fun_destructor_scope::Y_~Y(&y3:destructor_scope::Y*) [line 42]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_4" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_3" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_5" [label="5: DeclStmt \n _fun_destructor_scope::Y_Y(&y3:destructor_scope::Y*) [line 42]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_5" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_4" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_6" [label="6: DeclStmt \n _fun_destructor_scope::Y_Y(&y1:destructor_scope::Y*) [line 41]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_6" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_5" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_7" [label="7: Destruction \n _=*&y2:destructor_scope::Y [line 40]\n _fun_destructor_scope::Y_~Y(&y2:destructor_scope::Y*) [line 40]\n _=*&x2:destructor_scope::X [line 40]\n _fun_destructor_scope::X_~X(&x2:destructor_scope::X*) [line 40]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_7" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_6" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_8" [label="8: Destruction \n _=*&x3:destructor_scope::X [line 39]\n _fun_destructor_scope::X_~X(&x3:destructor_scope::X*) [line 39]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_8" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_7" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_9" [label="9: + \n " ] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_9" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_8" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_10" [label="10: Prune (true branch) \n n$7=*&b:_Bool [line 36]\n PRUNE((n$7 != 0), true); [line 36]\n " shape="invhouse"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_10" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_12" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_11" [label="11: Prune (false branch) \n n$7=*&b:_Bool [line 36]\n PRUNE((n$7 == 0), false); [line 36]\n " shape="invhouse"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_11" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_9" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_12" [label="12: Return Stmt \n _=*&x3:destructor_scope::X [line 37]\n _fun_destructor_scope::X_~X(&x3:destructor_scope::X*) [line 37]\n _=*&y2:destructor_scope::Y [line 37]\n _fun_destructor_scope::Y_~Y(&y2:destructor_scope::Y*) [line 37]\n _=*&x2:destructor_scope::X [line 37]\n _fun_destructor_scope::X_~X(&x2:destructor_scope::X*) [line 37]\n _=*&s:destructor_scope::S [line 37]\n _fun_destructor_scope::S_~S(&s:destructor_scope::S*) [line 37]\n _=*&x1:destructor_scope::X [line 37]\n _fun_destructor_scope::X_~X(&x1:destructor_scope::X*) [line 37]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_12" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_2" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_13" [label="13: DeclStmt \n _fun_destructor_scope::X_X(&x3:destructor_scope::X*) [line 35]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_13" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_10" ; + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_13" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_11" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_14" [label="14: + \n " ] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_14" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_13" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_15" [label="15: Prune (true branch) \n n$13=*&a:_Bool [line 31]\n PRUNE((n$13 != 0), true); [line 31]\n " shape="invhouse"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_15" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_17" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_16" [label="16: Prune (false branch) \n n$13=*&a:_Bool [line 31]\n PRUNE((n$13 == 0), false); [line 31]\n " shape="invhouse"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_16" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_14" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_17" [label="17: Return Stmt \n _=*&y2:destructor_scope::Y [line 32]\n _fun_destructor_scope::Y_~Y(&y2:destructor_scope::Y*) [line 32]\n _=*&x2:destructor_scope::X [line 32]\n _fun_destructor_scope::X_~X(&x2:destructor_scope::X*) [line 32]\n _=*&s:destructor_scope::S [line 32]\n _fun_destructor_scope::S_~S(&s:destructor_scope::S*) [line 32]\n _=*&x1:destructor_scope::X [line 32]\n _fun_destructor_scope::X_~X(&x1:destructor_scope::X*) [line 32]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_17" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_2" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_18" [label="18: DeclStmt \n _fun_destructor_scope::Y_Y(&y2:destructor_scope::Y*) [line 30]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_18" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_15" ; + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_18" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_16" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_19" [label="19: DeclStmt \n _fun_destructor_scope::X_X(&x2:destructor_scope::X*) [line 29]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_19" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_18" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_20" [label="20: DeclStmt \n _fun_destructor_scope::S_S(&s:destructor_scope::S*) [line 27]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_20" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_19" ; +"test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_21" [label="21: DeclStmt \n _fun_destructor_scope::X_X(&x1:destructor_scope::X*) [line 26]\n " shape="box"] + + + "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_21" -> "test1#destructor_scope#_ZN16destructor_scope5test1Ebb.fea2570de1bd37fe2fd8c1bd9766c861_20" ; +"S#S#destructor_scope#{_ZN16destructor_scope1SC1Ev|constexpr}.8a90c7de74a36914310ae757d91d91ff_1" [label="1: Start destructor_scope::S_S\nFormals: this:destructor_scope::S*\nLocals: \n DECLARE_LOCALS(&return); [line 21]\n " color=yellow style=filled] + + + "S#S#destructor_scope#{_ZN16destructor_scope1SC1Ev|constexpr}.8a90c7de74a36914310ae757d91d91ff_1" -> "S#S#destructor_scope#{_ZN16destructor_scope1SC1Ev|constexpr}.8a90c7de74a36914310ae757d91d91ff_3" ; +"S#S#destructor_scope#{_ZN16destructor_scope1SC1Ev|constexpr}.8a90c7de74a36914310ae757d91d91ff_2" [label="2: Exit destructor_scope::S_S \n " color=yellow style=filled] + + +"S#S#destructor_scope#{_ZN16destructor_scope1SC1Ev|constexpr}.8a90c7de74a36914310ae757d91d91ff_3" [label="3: Constructor Init \n n$0=*&this:destructor_scope::S* [line 21]\n _fun_destructor_scope::X_X(n$0.x:destructor_scope::X*) [line 21]\n " shape="box"] + + + "S#S#destructor_scope#{_ZN16destructor_scope1SC1Ev|constexpr}.8a90c7de74a36914310ae757d91d91ff_3" -> "S#S#destructor_scope#{_ZN16destructor_scope1SC1Ev|constexpr}.8a90c7de74a36914310ae757d91d91ff_2" ; +"~S#S#destructor_scope#(_ZN16destructor_scope1SD0Ev).e029a1be84e1c759d19e67b6cee10d7f_1" [label="1: Start destructor_scope::S_~S\nFormals: this:destructor_scope::S*\nLocals: \n DECLARE_LOCALS(&return); [line 21]\n " color=yellow style=filled] + + + "~S#S#destructor_scope#(_ZN16destructor_scope1SD0Ev).e029a1be84e1c759d19e67b6cee10d7f_1" -> "~S#S#destructor_scope#(_ZN16destructor_scope1SD0Ev).e029a1be84e1c759d19e67b6cee10d7f_2" ; +"~S#S#destructor_scope#(_ZN16destructor_scope1SD0Ev).e029a1be84e1c759d19e67b6cee10d7f_2" [label="2: Exit destructor_scope::S_~S \n " color=yellow style=filled] + + +"X#X#destructor_scope#{_ZN16destructor_scope1XC1Ev|constexpr}.2fe4286cdaf024592bc7b4ad8b4a565f_1" [label="1: Start destructor_scope::X_X\nFormals: this:destructor_scope::X*\nLocals: \n DECLARE_LOCALS(&return); [line 11]\n " color=yellow style=filled] + + + "X#X#destructor_scope#{_ZN16destructor_scope1XC1Ev|constexpr}.2fe4286cdaf024592bc7b4ad8b4a565f_1" -> "X#X#destructor_scope#{_ZN16destructor_scope1XC1Ev|constexpr}.2fe4286cdaf024592bc7b4ad8b4a565f_2" ; +"X#X#destructor_scope#{_ZN16destructor_scope1XC1Ev|constexpr}.2fe4286cdaf024592bc7b4ad8b4a565f_2" [label="2: Exit destructor_scope::X_X \n " color=yellow style=filled] + + +"~X#X#destructor_scope#(_ZN16destructor_scope1XD0Ev).f18f0761b16fe36438c4eae7e576b682_1" [label="1: Start destructor_scope::X_~X\nFormals: this:destructor_scope::X*\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] + + + "~X#X#destructor_scope#(_ZN16destructor_scope1XD0Ev).f18f0761b16fe36438c4eae7e576b682_1" -> "~X#X#destructor_scope#(_ZN16destructor_scope1XD0Ev).f18f0761b16fe36438c4eae7e576b682_2" ; +"~X#X#destructor_scope#(_ZN16destructor_scope1XD0Ev).f18f0761b16fe36438c4eae7e576b682_2" [label="2: Exit destructor_scope::X_~X \n " color=yellow style=filled] + + +"X#X#destructor_scope#{_ZN16destructor_scope1XC1ERKS0_|constexpr}.2414d8fbaa297d1fce05355d53896b6b_1" [label="1: Start destructor_scope::X_X\nFormals: this:destructor_scope::X* __param_0:destructor_scope::X const &\nLocals: \n DECLARE_LOCALS(&return); [line 11]\n " color=yellow style=filled] + + + "X#X#destructor_scope#{_ZN16destructor_scope1XC1ERKS0_|constexpr}.2414d8fbaa297d1fce05355d53896b6b_1" -> "X#X#destructor_scope#{_ZN16destructor_scope1XC1ERKS0_|constexpr}.2414d8fbaa297d1fce05355d53896b6b_2" ; +"X#X#destructor_scope#{_ZN16destructor_scope1XC1ERKS0_|constexpr}.2414d8fbaa297d1fce05355d53896b6b_2" [label="2: Exit destructor_scope::X_X \n " color=yellow style=filled] + + +"Y#Y#destructor_scope#{_ZN16destructor_scope1YC1Ev|constexpr}.bbec2666e178558d30786fd357bae394_1" [label="1: Start destructor_scope::Y_Y\nFormals: this:destructor_scope::Y*\nLocals: \n DECLARE_LOCALS(&return); [line 15]\n " color=yellow style=filled] + + + "Y#Y#destructor_scope#{_ZN16destructor_scope1YC1Ev|constexpr}.bbec2666e178558d30786fd357bae394_1" -> "Y#Y#destructor_scope#{_ZN16destructor_scope1YC1Ev|constexpr}.bbec2666e178558d30786fd357bae394_2" ; +"Y#Y#destructor_scope#{_ZN16destructor_scope1YC1Ev|constexpr}.bbec2666e178558d30786fd357bae394_2" [label="2: Exit destructor_scope::Y_Y \n " color=yellow style=filled] + + +"~Y#Y#destructor_scope#(_ZN16destructor_scope1YD0Ev).c1e3be6c11bac066871bac643c1a7d33_1" [label="1: Start destructor_scope::Y_~Y\nFormals: this:destructor_scope::Y*\nLocals: \n DECLARE_LOCALS(&return); [line 16]\n " color=yellow style=filled] + + + "~Y#Y#destructor_scope#(_ZN16destructor_scope1YD0Ev).c1e3be6c11bac066871bac643c1a7d33_1" -> "~Y#Y#destructor_scope#(_ZN16destructor_scope1YD0Ev).c1e3be6c11bac066871bac643c1a7d33_2" ; +"~Y#Y#destructor_scope#(_ZN16destructor_scope1YD0Ev).c1e3be6c11bac066871bac643c1a7d33_2" [label="2: Exit destructor_scope::Y_~Y \n " color=yellow style=filled] + + +"Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1Ev|constexpr}.58846154fa4db51b4cb4a6dc634794d7_1" [label="1: Start destructor_scope::Z_Z\nFormals: this:destructor_scope::Z*\nLocals: \n DECLARE_LOCALS(&return); [line 19]\n " color=yellow style=filled] + + + "Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1Ev|constexpr}.58846154fa4db51b4cb4a6dc634794d7_1" -> "Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1Ev|constexpr}.58846154fa4db51b4cb4a6dc634794d7_2" ; +"Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1Ev|constexpr}.58846154fa4db51b4cb4a6dc634794d7_2" [label="2: Exit destructor_scope::Z_Z \n " color=yellow style=filled] + + +"Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1EOS0_|constexpr}.ae74c365359faeede5251886ed3ce9f9_1" [label="1: Start destructor_scope::Z_Z\nFormals: this:destructor_scope::Z* __param_0:destructor_scope::Z&\nLocals: \n DECLARE_LOCALS(&return); [line 19]\n " color=yellow style=filled] + + + "Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1EOS0_|constexpr}.ae74c365359faeede5251886ed3ce9f9_1" -> "Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1EOS0_|constexpr}.ae74c365359faeede5251886ed3ce9f9_2" ; +"Z#Z#destructor_scope#{_ZN16destructor_scope1ZC1EOS0_|constexpr}.ae74c365359faeede5251886ed3ce9f9_2" [label="2: Exit destructor_scope::Z_Z \n " color=yellow style=filled] + + +} diff --git a/infer/tests/codetoanalyze/cpp/shared/methods/virtual_methods.cpp.dot b/infer/tests/codetoanalyze/cpp/shared/methods/virtual_methods.cpp.dot index 2ff2ebc05..ca8c0dfc8 100644 --- a/infer/tests/codetoanalyze/cpp/shared/methods/virtual_methods.cpp.dot +++ b/infer/tests/codetoanalyze/cpp/shared/methods/virtual_methods.cpp.dot @@ -30,11 +30,11 @@ digraph iCFG { "tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_2" [label="2: Exit tri_area \n " color=yellow style=filled] -"tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_3" [label="3: Return Stmt \n n$0=*&ppoly2:Polygon* [line 50]\n _=*n$0:Polygon [line 50]\n n$2=_fun_Polygon_area(n$0:Polygon*) virtual [line 50]\n *&return:int=(1 / (n$2 - 10)) [line 50]\n " shape="box"] +"tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_3" [label="3: Return Stmt \n n$0=*&ppoly2:Polygon* [line 50]\n _=*n$0:Polygon [line 50]\n n$2=_fun_Polygon_area(n$0:Polygon*) virtual [line 50]\n *&return:int=(1 / (n$2 - 10)) [line 50]\n _=*&trgl:Triangle [line 50]\n _fun_Triangle_~Triangle(&trgl:Triangle*) virtual [line 50]\n " shape="box"] "tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_3" -> "tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_2" ; -"tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_4" [label="4: Call _fun_Polygon_set_values \n n$3=*&ppoly2:Polygon* [line 49]\n _=*n$3:Polygon [line 49]\n _fun_Polygon_set_values(n$3:Polygon*,4:int,5:int) [line 49]\n " shape="box"] +"tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_4" [label="4: Call _fun_Polygon_set_values \n n$4=*&ppoly2:Polygon* [line 49]\n _=*n$4:Polygon [line 49]\n _fun_Polygon_set_values(n$4:Polygon*,4:int,5:int) [line 49]\n " shape="box"] "tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_4" -> "tri_area#_Z8tri_areav.403fd0c777354a6dc0b49fdc8d1c7762_3" ; @@ -76,11 +76,11 @@ digraph iCFG { "tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_2" [label="2: Exit tri_not_virtual_area \n " color=yellow style=filled] -"tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_3" [label="3: Return Stmt \n n$0=*&ppoly2:Polygon* [line 64]\n _=*n$0:Polygon [line 64]\n n$2=_fun_Polygon_area(n$0:Polygon*) [line 64]\n *&return:int=(1 / n$2) [line 64]\n " shape="box"] +"tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_3" [label="3: Return Stmt \n n$0=*&ppoly2:Polygon* [line 64]\n _=*n$0:Polygon [line 64]\n n$2=_fun_Polygon_area(n$0:Polygon*) [line 64]\n *&return:int=(1 / n$2) [line 64]\n _=*&trgl:Triangle [line 64]\n _fun_Triangle_~Triangle(&trgl:Triangle*) virtual [line 64]\n " shape="box"] "tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_3" -> "tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_2" ; -"tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_4" [label="4: Call _fun_Polygon_set_values \n n$3=*&ppoly2:Polygon* [line 63]\n _=*n$3:Polygon [line 63]\n _fun_Polygon_set_values(n$3:Polygon*,4:int,5:int) [line 63]\n " shape="box"] +"tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_4" [label="4: Call _fun_Polygon_set_values \n n$4=*&ppoly2:Polygon* [line 63]\n _=*n$4:Polygon [line 63]\n _fun_Polygon_set_values(n$4:Polygon*,4:int,5:int) [line 63]\n " shape="box"] "tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_4" -> "tri_not_virtual_area#_Z20tri_not_virtual_areav.f5155c2065082d5f4483008c8070f701_3" ; diff --git a/infer/tests/codetoanalyze/cpp/shared/types/typeid_expr.cpp.dot b/infer/tests/codetoanalyze/cpp/shared/types/typeid_expr.cpp.dot new file mode 100644 index 000000000..ab5eb6b36 --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/shared/types/typeid_expr.cpp.dot @@ -0,0 +1,528 @@ +/* @generated */ +digraph iCFG { +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_1" [label="1: Start person_typeid\nFormals: \nLocals: t:int person:Person \n DECLARE_LOCALS(&return,&t,&person); [line 19]\n " color=yellow style=filled] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_1" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_11" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_2" [label="2: Exit person_typeid \n " color=yellow style=filled] + + +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_3" [label="3: Destruction \n _fun_Person_~Person(&person:Person&) virtual [line 26]\n " shape="box"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_3" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_2" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_4" [label="4: + \n " ] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_4" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_3" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_5" [label="5: Call _fun_std::type_info_operator== \n n$0=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$0.__type_name:void,&t:int) [line 22]\n n$1=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$1.__type_name:void,&person:Person) [line 22]\n n$2=_fun_std::type_info_operator==(n$0:std::type_info const &,n$1:std::type_info const &) [line 22]\n " shape="box"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_5" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_6" ; + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_5" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_7" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_6" [label="6: Prune (true branch) \n PRUNE((n$2 != 0), true); [line 22]\n " shape="invhouse"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_6" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_8" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_7" [label="7: Prune (false branch) \n PRUNE((n$2 == 0), false); [line 22]\n " shape="invhouse"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_7" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_9" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_8" [label="8: Return Stmt \n *&return:int=1 [line 23]\n _fun_Person_~Person(&person:Person&) virtual [line 23]\n " shape="box"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_8" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_2" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_9" [label="9: Return Stmt \n *&return:int=(1 / 0) [line 25]\n _fun_Person_~Person(&person:Person&) virtual [line 25]\n " shape="box"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_9" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_2" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_10" [label="10: DeclStmt \n *&t:int=3 [line 21]\n " shape="box"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_10" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_5" ; +"person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_11" [label="11: DeclStmt \n _fun_Person_Person(&person:Person*) [line 20]\n " shape="box"] + + + "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_11" -> "person_typeid#_Z13person_typeidv.259e8739c3aa7b455d1b67a326ce9b09_10" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_1" [label="1: Start person_typeid_name\nFormals: \nLocals: person_type_info:char const * t_type_info:char const * t:int person:Person \n DECLARE_LOCALS(&return,&person_type_info,&t_type_info,&t,&person); [line 28]\n " color=yellow style=filled] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_1" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_13" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_2" [label="2: Exit person_typeid_name \n " color=yellow style=filled] + + +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_3" [label="3: Destruction \n _fun_Person_~Person(&person:Person&) virtual [line 37]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_3" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_2" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_4" [label="4: + \n " ] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_4" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_3" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_5" [label="5: BinaryOperatorStmt: EQ \n n$0=*&t_type_info:char const * [line 33]\n n$1=*&person_type_info:char const * [line 33]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_5" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_6" ; + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_5" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_7" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_6" [label="6: Prune (true branch) \n PRUNE(((n$0 == n$1) != 0), true); [line 33]\n " shape="invhouse"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_6" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_8" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_7" [label="7: Prune (false branch) \n PRUNE(((n$0 == n$1) == 0), false); [line 33]\n " shape="invhouse"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_7" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_9" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_8" [label="8: Return Stmt \n *&return:int=0 [line 34]\n _fun_Person_~Person(&person:Person&) virtual [line 34]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_8" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_2" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_9" [label="9: Return Stmt \n *&return:int=(1 / 0) [line 36]\n _fun_Person_~Person(&person:Person&) virtual [line 36]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_9" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_2" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_10" [label="10: DeclStmt \n n$2=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$2.__type_name:void,&person:Person) [line 32]\n _=*n$2:std::type_info const [line 32]\n n$4=_fun_std::type_info_name(n$2:std::type_info const &) [line 32]\n *&person_type_info:char const *=n$4 [line 32]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_10" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_5" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_11" [label="11: DeclStmt \n n$5=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$5.__type_name:void,&t:int) [line 31]\n _=*n$5:std::type_info const [line 31]\n n$7=_fun_std::type_info_name(n$5:std::type_info const &) [line 31]\n *&t_type_info:char const *=n$7 [line 31]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_11" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_10" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_12" [label="12: DeclStmt \n *&t:int=3 [line 30]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_12" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_11" ; +"person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_13" [label="13: DeclStmt \n _fun_Person_Person(&person:Person*) [line 29]\n " shape="box"] + + + "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_13" -> "person_typeid_name#_Z18person_typeid_namev.61ab0ec473f2261bf55eb69fa502c9ca_12" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_1" [label="1: Start employee_typeid\nFormals: \nLocals: ptr:Person* employee:Employee \n DECLARE_LOCALS(&return,&ptr,&employee); [line 39]\n " color=yellow style=filled] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_1" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_11" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_2" [label="2: Exit employee_typeid \n " color=yellow style=filled] + + +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_3" [label="3: Destruction \n _fun_Employee_~Employee(&employee:Employee&) virtual [line 46]\n " shape="box"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_3" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_2" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_4" [label="4: + \n " ] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_4" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_3" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_5" [label="5: Call _fun_std::type_info_operator== \n n$0=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$0.__type_name:void,&employee:Employee) [line 42]\n n$1=*&ptr:Person* [line 42]\n n$2=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$2.__type_name:void,n$1:Person) [line 42]\n n$3=_fun_std::type_info_operator==(n$0:std::type_info const &,n$2:std::type_info const &) [line 42]\n " shape="box"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_5" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_6" ; + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_5" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_7" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_6" [label="6: Prune (true branch) \n PRUNE((n$3 != 0), true); [line 42]\n " shape="invhouse"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_6" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_8" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_7" [label="7: Prune (false branch) \n PRUNE((n$3 == 0), false); [line 42]\n " shape="invhouse"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_7" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_9" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_8" [label="8: Return Stmt \n *&return:int=(1 / 0) [line 43]\n _fun_Employee_~Employee(&employee:Employee&) virtual [line 43]\n " shape="box"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_8" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_2" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_9" [label="9: Return Stmt \n *&return:int=0 [line 45]\n _fun_Employee_~Employee(&employee:Employee&) virtual [line 45]\n " shape="box"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_9" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_2" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_10" [label="10: DeclStmt \n *&ptr:Employee*=&employee [line 41]\n " shape="box"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_10" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_5" ; +"employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_11" [label="11: DeclStmt \n _fun_Employee_Employee(&employee:Employee*) [line 40]\n " shape="box"] + + + "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_11" -> "employee_typeid#_Z15employee_typeidv.d5a1249d00c1531124f473b9003de8b4_10" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_1" [label="1: Start template_type_id_person\nFormals: \nLocals: person:Person \n DECLARE_LOCALS(&return,&person); [line 62]\n " color=yellow style=filled] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_1" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_10" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_2" [label="2: Exit template_type_id_person \n " color=yellow style=filled] + + +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_3" [label="3: Destruction \n _fun_Person_~Person(&person:Person&) virtual [line 68]\n " shape="box"] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_3" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_2" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_4" [label="4: + \n " ] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_4" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_3" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_5" [label="5: BinaryOperatorStmt: EQ \n n$0=_fun_template_typeid(&person:Person&) [line 64]\n n$1=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$1.__type_name:void,&person:Person) [line 64]\n _=*n$1:std::type_info const [line 64]\n n$3=_fun_std::type_info_name(n$1:std::type_info const &) [line 64]\n " shape="box"] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_5" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_6" ; + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_5" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_7" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_6" [label="6: Prune (true branch) \n PRUNE(((n$0 == n$3) != 0), true); [line 64]\n " shape="invhouse"] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_6" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_8" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_7" [label="7: Prune (false branch) \n PRUNE(((n$0 == n$3) == 0), false); [line 64]\n " shape="invhouse"] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_7" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_9" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_8" [label="8: Return Stmt \n *&return:int=1 [line 65]\n _fun_Person_~Person(&person:Person&) virtual [line 65]\n " shape="box"] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_8" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_2" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_9" [label="9: Return Stmt \n *&return:int=(1 / 0) [line 67]\n _fun_Person_~Person(&person:Person&) virtual [line 67]\n " shape="box"] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_9" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_2" ; +"template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_10" [label="10: DeclStmt \n _fun_Person_Person(&person:Person*) [line 63]\n " shape="box"] + + + "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_10" -> "template_type_id_person#_Z23template_type_id_personv.5fe9ce5a34a9724ffe6120b87e057895_5" ; +"value#__numeric_type#__infer_globals_initializer_std.47862f77402cf0b9a8f85342f9963960_1" [label="1: Start __infer_globals_initializer_std::__numeric_type::value\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 1697]\n " color=yellow style=filled] + + + "value#__numeric_type#__infer_globals_initializer_std.47862f77402cf0b9a8f85342f9963960_1" -> "value#__numeric_type#__infer_globals_initializer_std.47862f77402cf0b9a8f85342f9963960_3" ; +"value#__numeric_type#__infer_globals_initializer_std.47862f77402cf0b9a8f85342f9963960_2" [label="2: Exit __infer_globals_initializer_std::__numeric_type::value \n " color=yellow style=filled] + + +"value#__numeric_type#__infer_globals_initializer_std.47862f77402cf0b9a8f85342f9963960_3" [label="3: DeclStmt \n *&#GB$std::__numeric_type::value:_Bool=1 [line 1697]\n " shape="box"] + + + "value#__numeric_type#__infer_globals_initializer_std.47862f77402cf0b9a8f85342f9963960_3" -> "value#__numeric_type#__infer_globals_initializer_std.47862f77402cf0b9a8f85342f9963960_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEi.43b0259cdf1b6086b5b232de7e5ddc3b_1" [label="1: Start std::__convert_to_integral\nFormals: __val:int\nLocals: \n DECLARE_LOCALS(&return); [line 4309]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEi.43b0259cdf1b6086b5b232de7e5ddc3b_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEi.43b0259cdf1b6086b5b232de7e5ddc3b_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEi.43b0259cdf1b6086b5b232de7e5ddc3b_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEi.43b0259cdf1b6086b5b232de7e5ddc3b_3" [label="3: Return Stmt \n n$0=*&__val:int [line 4310]\n *&return:int=n$0 [line 4310]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEi.43b0259cdf1b6086b5b232de7e5ddc3b_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEi.43b0259cdf1b6086b5b232de7e5ddc3b_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEn.f0a547f6acd880fbe54bf8cd9fcfe151_1" [label="1: Start std::__convert_to_integral\nFormals: __val:int\nLocals: \n DECLARE_LOCALS(&return); [line 4328]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEn.f0a547f6acd880fbe54bf8cd9fcfe151_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEn.f0a547f6acd880fbe54bf8cd9fcfe151_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEn.f0a547f6acd880fbe54bf8cd9fcfe151_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEn.f0a547f6acd880fbe54bf8cd9fcfe151_3" [label="3: Return Stmt \n n$0=*&__val:int [line 4329]\n *&return:int=n$0 [line 4329]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEn.f0a547f6acd880fbe54bf8cd9fcfe151_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEn.f0a547f6acd880fbe54bf8cd9fcfe151_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEj.fd205920d652f02f0b9a9b89e450a068_1" [label="1: Start std::__convert_to_integral\nFormals: __val:unsigned int\nLocals: \n DECLARE_LOCALS(&return); [line 4312]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEj.fd205920d652f02f0b9a9b89e450a068_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEj.fd205920d652f02f0b9a9b89e450a068_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEj.fd205920d652f02f0b9a9b89e450a068_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEj.fd205920d652f02f0b9a9b89e450a068_3" [label="3: Return Stmt \n n$0=*&__val:unsigned int [line 4313]\n *&return:unsigned int=n$0 [line 4313]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEj.fd205920d652f02f0b9a9b89e450a068_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEj.fd205920d652f02f0b9a9b89e450a068_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEo.15fc37df335893286e47ebfc292083c1_1" [label="1: Start std::__convert_to_integral\nFormals: __val:unsigned int\nLocals: \n DECLARE_LOCALS(&return); [line 4331]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEo.15fc37df335893286e47ebfc292083c1_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEo.15fc37df335893286e47ebfc292083c1_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEo.15fc37df335893286e47ebfc292083c1_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEo.15fc37df335893286e47ebfc292083c1_3" [label="3: Return Stmt \n n$0=*&__val:unsigned int [line 4332]\n *&return:unsigned int=n$0 [line 4332]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEo.15fc37df335893286e47ebfc292083c1_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEo.15fc37df335893286e47ebfc292083c1_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEl.19b65e5b35784a4d6b1ba397569565af_1" [label="1: Start std::__convert_to_integral\nFormals: __val:long\nLocals: \n DECLARE_LOCALS(&return); [line 4315]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEl.19b65e5b35784a4d6b1ba397569565af_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEl.19b65e5b35784a4d6b1ba397569565af_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEl.19b65e5b35784a4d6b1ba397569565af_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEl.19b65e5b35784a4d6b1ba397569565af_3" [label="3: Return Stmt \n n$0=*&__val:long [line 4316]\n *&return:long=n$0 [line 4316]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEl.19b65e5b35784a4d6b1ba397569565af_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEl.19b65e5b35784a4d6b1ba397569565af_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEm.111d95b3f3b4d5dd40ab1add8f243f84_1" [label="1: Start std::__convert_to_integral\nFormals: __val:unsigned long\nLocals: \n DECLARE_LOCALS(&return); [line 4318]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEm.111d95b3f3b4d5dd40ab1add8f243f84_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEm.111d95b3f3b4d5dd40ab1add8f243f84_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEm.111d95b3f3b4d5dd40ab1add8f243f84_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEm.111d95b3f3b4d5dd40ab1add8f243f84_3" [label="3: Return Stmt \n n$0=*&__val:unsigned long [line 4319]\n *&return:unsigned long=n$0 [line 4319]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEm.111d95b3f3b4d5dd40ab1add8f243f84_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEm.111d95b3f3b4d5dd40ab1add8f243f84_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEx.c1183c63775e8691319a0bd03664ac0c_1" [label="1: Start std::__convert_to_integral\nFormals: __val:long long\nLocals: \n DECLARE_LOCALS(&return); [line 4321]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEx.c1183c63775e8691319a0bd03664ac0c_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEx.c1183c63775e8691319a0bd03664ac0c_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEx.c1183c63775e8691319a0bd03664ac0c_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEx.c1183c63775e8691319a0bd03664ac0c_3" [label="3: Return Stmt \n n$0=*&__val:long long [line 4322]\n *&return:long long=n$0 [line 4322]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEx.c1183c63775e8691319a0bd03664ac0c_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEx.c1183c63775e8691319a0bd03664ac0c_2" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEy.4261f4b82618cc6ea34bb4631aefbdda_1" [label="1: Start std::__convert_to_integral\nFormals: __val:unsigned long long\nLocals: \n DECLARE_LOCALS(&return); [line 4324]\n " color=yellow style=filled] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEy.4261f4b82618cc6ea34bb4631aefbdda_1" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEy.4261f4b82618cc6ea34bb4631aefbdda_3" ; +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEy.4261f4b82618cc6ea34bb4631aefbdda_2" [label="2: Exit std::__convert_to_integral \n " color=yellow style=filled] + + +"__convert_to_integral#std#_ZNSt3__121__convert_to_integralEy.4261f4b82618cc6ea34bb4631aefbdda_3" [label="3: Return Stmt \n n$0=*&__val:unsigned long long [line 4325]\n *&return:unsigned long long=n$0 [line 4325]\n " shape="box"] + + + "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEy.4261f4b82618cc6ea34bb4631aefbdda_3" -> "__convert_to_integral#std#_ZNSt3__121__convert_to_integralEy.4261f4b82618cc6ea34bb4631aefbdda_2" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_1" [label="1: Start person_ptr_typeid\nFormals: ptr:Person*\nLocals: person:Person \n DECLARE_LOCALS(&return,&person); [line 48]\n " color=yellow style=filled] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_1" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_10" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_2" [label="2: Exit person_ptr_typeid \n " color=yellow style=filled] + + +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_3" [label="3: Destruction \n _fun_Person_~Person(&person:Person&) virtual [line 54]\n " shape="box"] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_3" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_2" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_4" [label="4: + \n " ] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_4" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_3" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_5" [label="5: BinaryOperatorStmt: EQ \n n$0=*&ptr:Person* [line 50]\n n$1=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$1.__type_name:void,n$0:Person) [line 50]\n _=*n$1:std::type_info const [line 50]\n n$3=_fun_std::type_info_name(n$1:std::type_info const &) [line 50]\n n$4=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$4.__type_name:void,&person:Person) [line 50]\n _=*n$4:std::type_info const [line 50]\n n$6=_fun_std::type_info_name(n$4:std::type_info const &) [line 50]\n " shape="box"] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_5" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_6" ; + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_5" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_7" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_6" [label="6: Prune (true branch) \n PRUNE(((n$3 == n$6) != 0), true); [line 50]\n " shape="invhouse"] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_6" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_8" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_7" [label="7: Prune (false branch) \n PRUNE(((n$3 == n$6) == 0), false); [line 50]\n " shape="invhouse"] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_7" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_9" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_8" [label="8: Return Stmt \n *&return:int=(1 / 0) [line 51]\n _fun_Person_~Person(&person:Person&) virtual [line 51]\n " shape="box"] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_8" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_2" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_9" [label="9: Return Stmt \n *&return:int=0 [line 53]\n _fun_Person_~Person(&person:Person&) virtual [line 53]\n " shape="box"] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_9" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_2" ; +"person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_10" [label="10: DeclStmt \n _fun_Person_Person(&person:Person*) [line 49]\n " shape="box"] + + + "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_10" -> "person_ptr_typeid#_Z17person_ptr_typeidP6Person.d9adfc6b86c71441019a0fdc03c35fa6_5" ; +"template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_1" [label="1: Start template_typeid\nFormals: value:Person const &\nLocals: result:Person 0$?%__sil_tmpSIL_materialize_temp__n$3:Person \n DECLARE_LOCALS(&return,&result,&0$?%__sil_tmpSIL_materialize_temp__n$3); [line 57]\n " color=yellow style=filled] + + + "template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_1" -> "template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_4" ; +"template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_2" [label="2: Exit template_typeid \n " color=yellow style=filled] + + +"template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_3" [label="3: Return Stmt \n n$0=_fun___cxx_typeid(sizeof(std::type_info const ):void,n$0.__type_name:void) [line 59]\n _=*n$0:std::type_info const [line 59]\n n$2=_fun_std::type_info_name(n$0:std::type_info const &) [line 59]\n *&return:char const *=n$2 [line 59]\n _fun_Person_~Person(&result:Person&) virtual [line 59]\n " shape="box"] + + + "template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_3" -> "template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_2" ; +"template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_4" [label="4: DeclStmt \n n$4=*&value:Person const & [line 58]\n _fun_Person_Person(&0$?%__sil_tmpSIL_materialize_temp__n$3:Person const *,n$4:Person const &) [line 58]\n _fun_Person_Person(&result:Person*,&0$?%__sil_tmpSIL_materialize_temp__n$3:Person&) [line 58]\n " shape="box"] + + + "template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_4" -> "template_typeid#_Z15template_typeidI6PersonEPKcRKT_.a1cb4d870e3df2f09bf7a22e0fc6e5c6_3" ; +"Employee#Employee#{_ZN8EmployeeC1Ev|constexpr}.16759caee496fa04cbb5c95e71252949_1" [label="1: Start Employee_Employee\nFormals: this:Employee*\nLocals: \n DECLARE_LOCALS(&return); [line 17]\n " color=yellow style=filled] + + + "Employee#Employee#{_ZN8EmployeeC1Ev|constexpr}.16759caee496fa04cbb5c95e71252949_1" -> "Employee#Employee#{_ZN8EmployeeC1Ev|constexpr}.16759caee496fa04cbb5c95e71252949_3" ; +"Employee#Employee#{_ZN8EmployeeC1Ev|constexpr}.16759caee496fa04cbb5c95e71252949_2" [label="2: Exit Employee_Employee \n " color=yellow style=filled] + + +"Employee#Employee#{_ZN8EmployeeC1Ev|constexpr}.16759caee496fa04cbb5c95e71252949_3" [label="3: Constructor Init \n n$0=*&this:Employee* [line 17]\n _fun_Person_Person(n$0:Employee*) [line 17]\n " shape="box"] + + + "Employee#Employee#{_ZN8EmployeeC1Ev|constexpr}.16759caee496fa04cbb5c95e71252949_3" -> "Employee#Employee#{_ZN8EmployeeC1Ev|constexpr}.16759caee496fa04cbb5c95e71252949_2" ; +"~Employee#Employee#(_ZN6PersonD0Ev).b246750215fd295f2276d9dd33772816_1" [label="1: Start Employee_~Employee\nFormals: this:Employee*\nLocals: \n DECLARE_LOCALS(&return); [line 17]\n " color=yellow style=filled] + + + "~Employee#Employee#(_ZN6PersonD0Ev).b246750215fd295f2276d9dd33772816_1" -> "~Employee#Employee#(_ZN6PersonD0Ev).b246750215fd295f2276d9dd33772816_2" ; +"~Employee#Employee#(_ZN6PersonD0Ev).b246750215fd295f2276d9dd33772816_2" [label="2: Exit Employee_~Employee \n " color=yellow style=filled] + + +"Person#Person#{_ZN6PersonC1Ev|constexpr}.d3aa73a16cf65083c030acbc97a9ff15_1" [label="1: Start Person_Person\nFormals: this:Person*\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] + + + "Person#Person#{_ZN6PersonC1Ev|constexpr}.d3aa73a16cf65083c030acbc97a9ff15_1" -> "Person#Person#{_ZN6PersonC1Ev|constexpr}.d3aa73a16cf65083c030acbc97a9ff15_2" ; +"Person#Person#{_ZN6PersonC1Ev|constexpr}.d3aa73a16cf65083c030acbc97a9ff15_2" [label="2: Exit Person_Person \n " color=yellow style=filled] + + +"~Person#Person#(_ZN6PersonD0Ev).6c309af5fed23bf91f2ee6ecd26bcc41_1" [label="1: Start Person_~Person\nFormals: this:Person*\nLocals: \n DECLARE_LOCALS(&return); [line 14]\n " color=yellow style=filled] + + + "~Person#Person#(_ZN6PersonD0Ev).6c309af5fed23bf91f2ee6ecd26bcc41_1" -> "~Person#Person#(_ZN6PersonD0Ev).6c309af5fed23bf91f2ee6ecd26bcc41_2" ; +"~Person#Person#(_ZN6PersonD0Ev).6c309af5fed23bf91f2ee6ecd26bcc41_2" [label="2: Exit Person_~Person \n " color=yellow style=filled] + + +"Person#Person#{_ZN6PersonC1ERKS_|constexpr}.723fccb56b807554fd33d1118dcb83e1_1" [label="1: Start Person_Person\nFormals: this:Person* __param_0:Person const &\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] + + + "Person#Person#{_ZN6PersonC1ERKS_|constexpr}.723fccb56b807554fd33d1118dcb83e1_1" -> "Person#Person#{_ZN6PersonC1ERKS_|constexpr}.723fccb56b807554fd33d1118dcb83e1_2" ; +"Person#Person#{_ZN6PersonC1ERKS_|constexpr}.723fccb56b807554fd33d1118dcb83e1_2" [label="2: Exit Person_Person \n " color=yellow style=filled] + + +"bad_exception#bad_exception#std#{_ZNSt13bad_exceptionC1Ev}.9b3ad9f8b08e34cb77dd347cfc0925a2_1" [label="1: Start std::bad_exception_bad_exception\nFormals: this:std::bad_exception*\nLocals: \n " color=yellow style=filled] + + +"bad_exception#bad_exception#std#{_ZNSt13bad_exceptionC1Ev}.9b3ad9f8b08e34cb77dd347cfc0925a2_2" [label="2: Exit std::bad_exception_bad_exception \n " color=yellow style=filled] + + +"exception#exception#std#{_ZNSt9exceptionC1Ev}.5226a0e6cc026fc29eb750a66d588910_1" [label="1: Start std::exception_exception\nFormals: this:std::exception*\nLocals: \n " color=yellow style=filled] + + +"exception#exception#std#{_ZNSt9exceptionC1Ev}.5226a0e6cc026fc29eb750a66d588910_2" [label="2: Exit std::exception_exception \n " color=yellow style=filled] + + +"exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1Ev}.0c4f2ef0c0bd9280100ecba5b0fba8bd_1" [label="1: Start std::exception_ptr_exception_ptr\nFormals: this:std::exception_ptr*\nLocals: \n DECLARE_LOCALS(&return); [line 130]\n " color=yellow style=filled] + + + "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1Ev}.0c4f2ef0c0bd9280100ecba5b0fba8bd_1" -> "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1Ev}.0c4f2ef0c0bd9280100ecba5b0fba8bd_3" ; +"exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1Ev}.0c4f2ef0c0bd9280100ecba5b0fba8bd_2" [label="2: Exit std::exception_ptr_exception_ptr \n " color=yellow style=filled] + + +"exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1Ev}.0c4f2ef0c0bd9280100ecba5b0fba8bd_3" [label="3: Constructor Init \n n$0=*&this:std::exception_ptr* [line 130]\n *n$0.__ptr_:void*=null [line 130]\n " shape="box"] + + + "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1Ev}.0c4f2ef0c0bd9280100ecba5b0fba8bd_3" -> "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1Ev}.0c4f2ef0c0bd9280100ecba5b0fba8bd_2" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_1" [label="1: Start std::exception_ptr_operator_bool\nFormals: this:std::exception_ptr*\nLocals: 0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool \n DECLARE_LOCALS(&return,&0$?%__sil_tmpSIL_temp_conditional___n$0); [line 136]\n " color=yellow style=filled] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_1" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_4" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_2" [label="2: Exit std::exception_ptr_operator_bool \n " color=yellow style=filled] + + +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_3" [label="3: + \n " ] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_3" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_9" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_4" [label="4: BinaryOperatorStmt: NE \n n$1=*&this:std::exception_ptr const * [line 138]\n n$2=*n$1.__ptr_:void* [line 138]\n " shape="box"] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_4" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_5" ; + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_4" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_6" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_5" [label="5: Prune (true branch) \n PRUNE(((n$2 != null) != 0), true); [line 138]\n " shape="invhouse"] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_5" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_7" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_6" [label="6: Prune (false branch) \n PRUNE(((n$2 != null) == 0), false); [line 138]\n " shape="invhouse"] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_6" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_8" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_7" [label="7: ConditinalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool=1 [line 138]\n " shape="box"] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_7" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_3" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_8" [label="8: ConditinalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool=0 [line 138]\n " shape="box"] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_8" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_3" ; +"operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_9" [label="9: Return Stmt \n n$3=*&0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool [line 138]\n *&return:_Bool=n$3 [line 138]\n " shape="box"] + + + "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_9" -> "operator_bool#exception_ptr#std#(_ZNKSt13exception_ptrcvbEv).6fac2b4e27029bcd0295f179efc6cf0f_2" ; +"exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1EDn}.b23bb2147c8a8ba771e2f40d3542abc9_1" [label="1: Start std::exception_ptr_exception_ptr\nFormals: this:std::exception_ptr* __param_0:int\nLocals: \n DECLARE_LOCALS(&return); [line 131]\n " color=yellow style=filled] + + + "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1EDn}.b23bb2147c8a8ba771e2f40d3542abc9_1" -> "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1EDn}.b23bb2147c8a8ba771e2f40d3542abc9_3" ; +"exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1EDn}.b23bb2147c8a8ba771e2f40d3542abc9_2" [label="2: Exit std::exception_ptr_exception_ptr \n " color=yellow style=filled] + + +"exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1EDn}.b23bb2147c8a8ba771e2f40d3542abc9_3" [label="3: Constructor Init \n n$0=*&this:std::exception_ptr* [line 131]\n *n$0.__ptr_:void*=null [line 131]\n " shape="box"] + + + "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1EDn}.b23bb2147c8a8ba771e2f40d3542abc9_3" -> "exception_ptr#exception_ptr#std#{_ZNSt13exception_ptrC1EDn}.b23bb2147c8a8ba771e2f40d3542abc9_2" ; +"nested_ptr#nested_exception#std#(_ZNKSt16nested_exception10nested_ptrEv).753e0357077fd8ac8ab8130b900014ef_1" [label="1: Start std::nested_exception_nested_ptr\nFormals: this:std::nested_exception* __return_param:std::exception_ptr*\nLocals: \n DECLARE_LOCALS(&return); [line 180]\n " color=yellow style=filled] + + + "nested_ptr#nested_exception#std#(_ZNKSt16nested_exception10nested_ptrEv).753e0357077fd8ac8ab8130b900014ef_1" -> "nested_ptr#nested_exception#std#(_ZNKSt16nested_exception10nested_ptrEv).753e0357077fd8ac8ab8130b900014ef_3" ; +"nested_ptr#nested_exception#std#(_ZNKSt16nested_exception10nested_ptrEv).753e0357077fd8ac8ab8130b900014ef_2" [label="2: Exit std::nested_exception_nested_ptr \n " color=yellow style=filled] + + +"nested_ptr#nested_exception#std#(_ZNKSt16nested_exception10nested_ptrEv).753e0357077fd8ac8ab8130b900014ef_3" [label="3: Return Stmt \n n$0=*&__return_param:std::exception_ptr* [line 180]\n n$1=*&this:std::nested_exception const * [line 180]\n _fun_std::exception_ptr_exception_ptr(n$0:std::exception_ptr*,n$1.__ptr_:std::exception_ptr&) [line 180]\n " shape="box"] + + + "nested_ptr#nested_exception#std#(_ZNKSt16nested_exception10nested_ptrEv).753e0357077fd8ac8ab8130b900014ef_3" -> "nested_ptr#nested_exception#std#(_ZNKSt16nested_exception10nested_ptrEv).753e0357077fd8ac8ab8130b900014ef_2" ; +"name#type_info#std#(_ZNKSt9type_info4nameEv).8c41a474dda80a419c854969d1ab23e8_1" [label="1: Start std::type_info_name\nFormals: this:std::type_info*\nLocals: \n " color=yellow style=filled] + + +"name#type_info#std#(_ZNKSt9type_info4nameEv).8c41a474dda80a419c854969d1ab23e8_2" [label="2: Exit std::type_info_name \n " color=yellow style=filled] + + +"hash_code#type_info#std#(_ZNKSt9type_info9hash_codeEv).01675cb218ac7b3cd979914210b13e49_1" [label="1: Start std::type_info_hash_code\nFormals: this:std::type_info*\nLocals: \n DECLARE_LOCALS(&return); [line 113]\n " color=yellow style=filled] + + + "hash_code#type_info#std#(_ZNKSt9type_info9hash_codeEv).01675cb218ac7b3cd979914210b13e49_1" -> "hash_code#type_info#std#(_ZNKSt9type_info9hash_codeEv).01675cb218ac7b3cd979914210b13e49_3" ; +"hash_code#type_info#std#(_ZNKSt9type_info9hash_codeEv).01675cb218ac7b3cd979914210b13e49_2" [label="2: Exit std::type_info_hash_code \n " color=yellow style=filled] + + +"hash_code#type_info#std#(_ZNKSt9type_info9hash_codeEv).01675cb218ac7b3cd979914210b13e49_3" [label="3: Return Stmt \n n$0=*&this:std::type_info const * [line 116]\n n$1=*n$0.__type_name:unsigned long [line 116]\n *&return:unsigned long=n$1 [line 116]\n " shape="box"] + + + "hash_code#type_info#std#(_ZNKSt9type_info9hash_codeEv).01675cb218ac7b3cd979914210b13e49_3" -> "hash_code#type_info#std#(_ZNKSt9type_info9hash_codeEv).01675cb218ac7b3cd979914210b13e49_2" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_1" [label="1: Start std::type_info_before\nFormals: this:std::type_info* __arg:std::type_info const &\nLocals: 0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool \n DECLARE_LOCALS(&return,&0$?%__sil_tmpSIL_temp_conditional___n$0); [line 103]\n " color=yellow style=filled] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_1" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_4" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_2" [label="2: Exit std::type_info_before \n " color=yellow style=filled] + + +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_3" [label="3: + \n " ] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_3" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_9" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_4" [label="4: BinaryOperatorStmt: LT \n n$1=*&this:std::type_info const * [line 106]\n n$2=*n$1.__type_name:char const * [line 106]\n n$3=*&__arg:std::type_info const & [line 106]\n n$4=*n$3.__type_name:char const * [line 106]\n " shape="box"] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_4" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_5" ; + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_4" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_6" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_5" [label="5: Prune (true branch) \n PRUNE(((n$2 < n$4) != 0), true); [line 106]\n " shape="invhouse"] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_5" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_7" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_6" [label="6: Prune (false branch) \n PRUNE(((n$2 < n$4) == 0), false); [line 106]\n " shape="invhouse"] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_6" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_8" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_7" [label="7: ConditinalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool=1 [line 106]\n " shape="box"] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_7" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_3" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_8" [label="8: ConditinalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool=0 [line 106]\n " shape="box"] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_8" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_3" ; +"before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_9" [label="9: Return Stmt \n n$5=*&0$?%__sil_tmpSIL_temp_conditional___n$0:_Bool [line 106]\n *&return:_Bool=n$5 [line 106]\n " shape="box"] + + + "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_9" -> "before#type_info#std#(_ZNKSt9type_info6beforeERKS_).d0ee91d1b591c9ae21397c3dface7eb7_2" ; +"operator==#type_info#std#(_ZNKSt9type_infoeqERKS_).bba3803f824984bb290007319588edac_1" [label="1: Start std::type_info_operator==\nFormals: this:std::type_info* __arg:std::type_info const &\nLocals: \n " color=yellow style=filled] + + +"operator==#type_info#std#(_ZNKSt9type_infoeqERKS_).bba3803f824984bb290007319588edac_2" [label="2: Exit std::type_info_operator== \n " color=yellow style=filled] + + +"operator!=#type_info#std#(_ZNKSt9type_infoneERKS_).b69fd72b9eb174c6136ece21a7473e28_1" [label="1: Start std::type_info_operator!=\nFormals: this:std::type_info* __arg:std::type_info const &\nLocals: \n " color=yellow style=filled] + + +"operator!=#type_info#std#(_ZNKSt9type_infoneERKS_).b69fd72b9eb174c6136ece21a7473e28_2" [label="2: Exit std::type_info_operator!= \n " color=yellow style=filled] + + +"type_info#type_info#std#{_ZNSt9type_infoC1EPKc}.95293c2b692be68318d378f77a5be8af_1" [label="1: Start std::type_info_type_info\nFormals: this:std::type_info* __n:char const *\nLocals: \n " color=yellow style=filled] + + +"type_info#type_info#std#{_ZNSt9type_infoC1EPKc}.95293c2b692be68318d378f77a5be8af_2" [label="2: Exit std::type_info_type_info \n " color=yellow style=filled] + + +}