From 2cf0e7a1d2ed5889c13448927154378b5458785d Mon Sep 17 00:00:00 2001 From: Dulma Churchill Date: Mon, 25 Jun 2018 06:51:55 -0700 Subject: [PATCH] [clang] Treat class method as a static self only as the first argument of an instance method call, not a class method Reviewed By: mbouaziz Differential Revision: D8574945 fbshipit-source-id: 1476729 --- infer/src/clang/cTrans.ml | 12 +- infer/src/clang/cTrans_utils.ml | 4 +- infer/src/clang/cTrans_utils.mli | 2 +- .../objc/frontend/self_static/Self.m | 15 ++ .../objc/frontend/self_static/Self.m.dot | 135 ++++++++++++------ 5 files changed, 122 insertions(+), 46 deletions(-) diff --git a/infer/src/clang/cTrans.ml b/infer/src/clang/cTrans.ml index 59c248f80..41e27cfc2 100644 --- a/infer/src/clang/cTrans.ml +++ b/infer/src/clang/cTrans.ml @@ -775,7 +775,7 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s let return = if Self.is_var_self pvar (CContext.is_objc_method context) && CType.is_class typ then let class_name = CContext.get_curr_class_typename stmt_info context in - if trans_state.is_fst_arg_objc_method_call then + if trans_state.is_fst_arg_objc_instance_method_call then raise (Self.SelfClassException {class_name; position= __POS__; source_range= stmt_info.Clang_ast_t.si_source_range}) @@ -1198,7 +1198,7 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s CMethod_trans.get_class_name_method_call_from_receiver_kind context obj_c_message_expr_info act_params in - if trans_state.is_fst_arg_objc_method_call then + if trans_state.is_fst_arg_objc_instance_method_call then raise (Self.SelfClassException {class_name; position= __POS__; source_range= si.Clang_ast_t.si_source_range}) @@ -1232,7 +1232,13 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s List.map ~f:(exec_with_glvalue_as_reference instruction trans_state_param) rest in try - let trans_state_param' = {trans_state_param with is_fst_arg_objc_method_call= true} in + let trans_state_param' = + match obj_c_message_expr_info.Clang_ast_t.omei_receiver_kind with + | `Instance | `SuperInstance -> + {trans_state_param with is_fst_arg_objc_instance_method_call= true} + | _ -> + {trans_state_param with is_fst_arg_objc_instance_method_call= false} + in let fst_res_trans = instruction trans_state_param' stmt in (obj_c_message_expr_info, fst_res_trans :: param_trans_results) with Self.SelfClassException e -> diff --git a/infer/src/clang/cTrans_utils.ml b/infer/src/clang/cTrans_utils.ml index 8b08691c0..2ac72a414 100644 --- a/infer/src/clang/cTrans_utils.ml +++ b/infer/src/clang/cTrans_utils.ml @@ -126,7 +126,7 @@ type trans_state = ; priority: priority_node ; var_exp_typ: (Exp.t * Typ.t) option ; opaque_exp: (Exp.t * Typ.t) option - ; is_fst_arg_objc_method_call: bool } + ; is_fst_arg_objc_instance_method_call: bool } let default_trans_state context = { context @@ -135,7 +135,7 @@ let default_trans_state context = ; priority= Free ; var_exp_typ= None ; opaque_exp= None - ; is_fst_arg_objc_method_call= false } + ; is_fst_arg_objc_instance_method_call= false } type control = diff --git a/infer/src/clang/cTrans_utils.mli b/infer/src/clang/cTrans_utils.mli index 4e80c7364..78afd7945 100644 --- a/infer/src/clang/cTrans_utils.mli +++ b/infer/src/clang/cTrans_utils.mli @@ -26,7 +26,7 @@ type trans_state = ; priority: priority_node ; var_exp_typ: (Exp.t * Typ.t) option ; opaque_exp: (Exp.t * Typ.t) option - ; is_fst_arg_objc_method_call: bool } + ; is_fst_arg_objc_instance_method_call: bool } val default_trans_state : CContext.t -> trans_state diff --git a/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m b/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m index 6867d1e59..afab70477 100644 --- a/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m +++ b/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m @@ -6,6 +6,7 @@ */ #import +#import @interface B : NSObject @@ -105,4 +106,18 @@ BOOL class_method_in_conditional() { } return NO; } + +- (NSBundle*)class_method_fst_arg_of_class_method { + return [NSBundle bundleForClass:[A class]]; +} + ++ (NSBundle*)class_method_fst_arg_of_class_method_inside_instance_method { + static NSBundle* bundle; + NSString* stringsBundlePath = + [[NSBundle bundleForClass:[B class]] pathForResource:@"Strings" + ofType:@"bundle"]; + bundle = [NSBundle bundleWithPath:stringsBundlePath] ?: [NSBundle mainBundle]; + return bundle; +} + @end diff --git a/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m.dot b/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m.dot index 12e123e32..2b32930f5 100644 --- a/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m.dot +++ b/infer/tests/codetoanalyze/objc/frontend/self_static/Self.m.dot @@ -1,13 +1,13 @@ /* @generated */ digraph cfg { -"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_1" [label="1: Start class_method_in_conditional\nFormals: \nLocals: c:objc_class* \n DECLARE_LOCALS(&return,&c); [line 101, column 1]\n " color=yellow style=filled] +"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_1" [label="1: Start class_method_in_conditional\nFormals: \nLocals: c:objc_class* \n DECLARE_LOCALS(&return,&c); [line 102, column 1]\n " color=yellow style=filled] "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_1" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" ; "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_2" [label="2: Exit class_method_in_conditional \n " color=yellow style=filled] -"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_3" [label="3: Return Stmt \n *&return:_Bool=0 [line 106, column 3]\n " shape="box"] +"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_3" [label="3: Return Stmt \n *&return:_Bool=0 [line 107, column 3]\n " shape="box"] "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_3" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_2" ; @@ -15,64 +15,108 @@ digraph cfg { "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_4" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_3" ; -"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_5" [label="5: Prune (true branch, if) \n PRUNE(sizeof(t=objc_class), true); [line 103, column 7]\n " shape="invhouse"] +"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_5" [label="5: Prune (true branch, if) \n PRUNE(sizeof(t=objc_class), true); [line 104, column 7]\n " shape="invhouse"] "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_5" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_7" ; -"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_6" [label="6: Prune (false branch, if) \n PRUNE(!sizeof(t=objc_class), false); [line 103, column 7]\n " shape="invhouse"] +"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_6" [label="6: Prune (false branch, if) \n PRUNE(!sizeof(t=objc_class), false); [line 104, column 7]\n " shape="invhouse"] "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_6" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_4" ; -"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_7" [label="7: Return Stmt \n *&return:_Bool=1 [line 104, column 5]\n " shape="box"] +"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_7" [label="7: Return Stmt \n *&return:_Bool=1 [line 105, column 5]\n " shape="box"] "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_7" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_2" ; -"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" [label="8: DeclStmt \n n$3=_fun_foo() [line 102, column 13]\n *&c:objc_class*=n$3 [line 102, column 3]\n " shape="box"] +"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" [label="8: DeclStmt \n n$3=_fun_foo() [line 103, column 13]\n *&c:objc_class*=n$3 [line 103, column 3]\n " shape="box"] "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_5" ; "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_6" ; -"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_1" [label="1: Start A_call_alloc_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 55, column 1]\n " color=yellow style=filled] +"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_1" [label="1: Start A_call_alloc_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 56, column 1]\n " color=yellow style=filled] "call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_1" -> "call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_3" ; "call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_2" [label="2: Exit A_call_alloc_class \n " color=yellow style=filled] -"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_3" [label="3: Call alloc \n n$5=_fun___objc_alloc_no_fail(sizeof(t=A):unsigned long) [line 56, column 3]\n " shape="box"] +"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_3" [label="3: Call alloc \n n$5=_fun___objc_alloc_no_fail(sizeof(t=A):unsigned long) [line 57, column 3]\n " shape="box"] "call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_3" -> "call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_2" ; -"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_1" [label="1: Start A_call_test_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 51, column 1]\n " color=yellow style=filled] +"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_1" [label="1: Start A_call_test_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 52, column 1]\n " color=yellow style=filled] "call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_1" -> "call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_3" ; "call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_2" [label="2: Exit A_call_test_class \n " color=yellow style=filled] -"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_3" [label="3: Message Call: test_class \n n$4=_fun_C_test_class() [line 52, column 3]\n " shape="box"] +"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_3" [label="3: Message Call: test_class \n n$4=_fun_C_test_class() [line 53, column 3]\n " shape="box"] "call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_3" -> "call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_2" ; -"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_1" [label="1: Start A_calling_super\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 80, column 1]\n " color=yellow style=filled] +"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_1" [label="1: Start A_calling_super\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 81, column 1]\n " color=yellow style=filled] "calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_1" -> "calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_3" ; "calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_2" [label="2: Exit A_calling_super \n " color=yellow style=filled] -"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_3" [label="3: Message Call: test_class \n n$18=_fun_C_test_class() [line 81, column 3]\n " shape="box"] +"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_3" [label="3: Message Call: test_class \n n$18=_fun_C_test_class() [line 82, column 3]\n " shape="box"] "calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_3" -> "calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_2" ; -"test_class#A#class.97324b18f626e66a3c32cec03286eb8d_1" [label="1: Start A_test_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 48, column 1]\n " color=yellow style=filled] +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_1" [label="1: Start A_class_method_fst_arg_of_class_method_inside_instance_method\nFormals: \nLocals: 0$?%__sil_tmpSIL_temp_conditional___n$30:NSBundle* stringsBundlePath:NSString* \n DECLARE_LOCALS(&return,&0$?%__sil_tmpSIL_temp_conditional___n$30,&stringsBundlePath); [line 114, column 1]\n " color=yellow style=filled] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_1" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_11" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_2" [label="2: Exit A_class_method_fst_arg_of_class_method_inside_instance_method \n " color=yellow style=filled] + + +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_3" [label="3: Return Stmt \n n$27=*&#GB$A_class_method_fst_arg_of_class_method_inside_instance_method.bundle:NSBundle* [line 120, column 10]\n *&return:NSBundle*=n$27 [line 120, column 3]\n " shape="box"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_3" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_2" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_4" [label="4: + \n " ] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_4" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_10" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_5" [label="5: Prune (true branch, boolean exp) \n PRUNE(n$29, true); [line 119, column 12]\n " shape="invhouse"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_5" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_7" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_6" [label="6: Prune (false branch, boolean exp) \n PRUNE(!n$29, false); [line 119, column 12]\n " shape="invhouse"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_6" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_8" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_7" [label="7: ConditionalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$30:NSBundle*=n$29 [line 119, column 12]\n " shape="box"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_7" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_4" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_8" [label="8: ConditionalStmt Branch \n n$31=_fun_NSBundle_mainBundle() [line 119, column 59]\n *&0$?%__sil_tmpSIL_temp_conditional___n$30:NSBundle*=n$31 [line 119, column 12]\n " shape="box"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_8" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_4" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_9" [label="9: BinaryConditionalStmt Init \n n$28=*&stringsBundlePath:NSString* [line 119, column 37]\n n$29=_fun_NSBundle_bundleWithPath:(n$28:NSString*) [line 119, column 12]\n " shape="box"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_9" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_5" ; + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_9" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_6" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_10" [label="10: BinaryOperatorStmt: Assign \n n$32=*&0$?%__sil_tmpSIL_temp_conditional___n$30:NSBundle* [line 119, column 12]\n *&#GB$A_class_method_fst_arg_of_class_method_inside_instance_method.bundle:NSBundle*=n$32 [line 119, column 3]\n " shape="box"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_10" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_3" ; +"class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_11" [label="11: DeclStmt \n n$35=_fun_NSBundle_bundleForClass:(sizeof(t=B):unsigned long) [line 117, column 8]\n n$33=_fun_NSString_stringWithUTF8String:(\"Strings\":char* const ) [line 117, column 60]\n n$34=_fun_NSString_stringWithUTF8String:(\"bundle\":char* const ) [line 118, column 60]\n n$36=_fun_NSBundle_pathForResource:ofType:(n$35:NSBundle*,n$33:NSString*,n$34:NSString*) virtual [line 117, column 7]\n *&stringsBundlePath:NSString*=n$36 [line 116, column 3]\n " shape="box"] + + + "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_11" -> "class_method_fst_arg_of_class_method_inside_instance_method#A#class.7bda69c598fb7e024d776cec3122e2a6_9" ; +"test_class#A#class.97324b18f626e66a3c32cec03286eb8d_1" [label="1: Start A_test_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 49, column 1]\n " color=yellow style=filled] "test_class#A#class.97324b18f626e66a3c32cec03286eb8d_1" -> "test_class#A#class.97324b18f626e66a3c32cec03286eb8d_2" ; "test_class#A#class.97324b18f626e66a3c32cec03286eb8d_2" [label="2: Exit A_test_class \n " color=yellow style=filled] -"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_1" [label="1: Start A_used_in_binary_op:\nFormals: c:objc_class*\nLocals: \n DECLARE_LOCALS(&return); [line 92, column 1]\n " color=yellow style=filled] +"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_1" [label="1: Start A_used_in_binary_op:\nFormals: c:objc_class*\nLocals: \n DECLARE_LOCALS(&return); [line 93, column 1]\n " color=yellow style=filled] "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_1" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_5" ; @@ -87,141 +131,152 @@ digraph cfg { "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_4" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_2" ; -"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_5" [label="5: BinaryOperatorStmt: NE \n n$23=*sizeof(t=A):objc_class* [line 93, column 7]\n n$24=*&c:objc_class* [line 93, column 15]\n " shape="box"] +"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_5" [label="5: BinaryOperatorStmt: NE \n n$23=*sizeof(t=A):objc_class* [line 94, column 7]\n n$24=*&c:objc_class* [line 94, column 15]\n " shape="box"] "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_5" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_6" ; "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_5" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_7" ; -"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_6" [label="6: Prune (true branch, if) \n PRUNE((n$23 != n$24), true); [line 93, column 7]\n " shape="invhouse"] +"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_6" [label="6: Prune (true branch, if) \n PRUNE((n$23 != n$24), true); [line 94, column 7]\n " shape="invhouse"] "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_6" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_8" ; -"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_7" [label="7: Prune (false branch, if) \n PRUNE(!(n$23 != n$24), false); [line 93, column 7]\n " shape="invhouse"] +"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_7" [label="7: Prune (false branch, if) \n PRUNE(!(n$23 != n$24), false); [line 94, column 7]\n " shape="invhouse"] "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_7" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_9" ; -"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_8" [label="8: Return Stmt \n *&return:int=1 [line 94, column 5]\n " shape="box"] +"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_8" [label="8: Return Stmt \n *&return:int=1 [line 95, column 5]\n " shape="box"] "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_8" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_2" ; -"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_9" [label="9: Return Stmt \n *&return:int=0 [line 96, column 5]\n " shape="box"] +"used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_9" [label="9: Return Stmt \n *&return:int=0 [line 97, column 5]\n " shape="box"] "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_9" -> "used_in_binary_op:#A(struct objc_class)#class.da9fc6494d494952f5246c6cf4478263_2" ; -"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_1" [label="1: Start A_call_alloc_instance\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 59, column 1]\n " color=yellow style=filled] +"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_1" [label="1: Start A_call_alloc_instance\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 60, column 1]\n " color=yellow style=filled] "call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_1" -> "call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_3" ; "call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_2" [label="2: Exit A_call_alloc_instance \n " color=yellow style=filled] -"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_3" [label="3: Call alloc \n n$7=_fun___objc_alloc_no_fail(sizeof(t=A):unsigned long) [line 60, column 3]\n " shape="box"] +"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_3" [label="3: Call alloc \n n$7=_fun___objc_alloc_no_fail(sizeof(t=A):unsigned long) [line 61, column 3]\n " shape="box"] "call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_3" -> "call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_2" ; -"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_1" [label="1: Start A_call_class_instance\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 63, column 1]\n " color=yellow style=filled] +"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_1" [label="1: Start A_call_class_instance\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 64, column 1]\n " color=yellow style=filled] "call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_1" -> "call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_3" ; "call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_2" [label="2: Exit A_call_class_instance \n " color=yellow style=filled] -"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_3" [label="3: Message Call: test_class \n n$9=_fun_C_test_class() [line 64, column 3]\n " shape="box"] +"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_3" [label="3: Message Call: test_class \n n$9=_fun_C_test_class() [line 65, column 3]\n " shape="box"] "call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_3" -> "call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_2" ; -"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_1" [label="1: Start A_call_class_instance_with_class_name\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 67, column 1]\n " color=yellow style=filled] +"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_1" [label="1: Start A_call_class_instance_with_class_name\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 68, column 1]\n " color=yellow style=filled] "call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_1" -> "call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_3" ; "call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_2" [label="2: Exit A_call_class_instance_with_class_name \n " color=yellow style=filled] -"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_3" [label="3: Message Call: test_class \n n$10=_fun_A_test_class() [line 68, column 3]\n " shape="box"] +"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_3" [label="3: Message Call: test_class \n n$10=_fun_A_test_class() [line 69, column 3]\n " shape="box"] "call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_3" -> "call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_2" ; -"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_1" [label="1: Start A_call_test\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 44, column 1]\n " color=yellow style=filled] +"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_1" [label="1: Start A_call_test\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 45, column 1]\n " color=yellow style=filled] "call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_1" -> "call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_3" ; "call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_2" [label="2: Exit A_call_test \n " color=yellow style=filled] -"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_3" [label="3: Message Call: test \n n$1=*&self:A* [line 45, column 4]\n n$2=_fun_A_test(n$1:A*) virtual [line 45, column 3]\n " shape="box"] +"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_3" [label="3: Message Call: test \n n$1=*&self:A* [line 46, column 4]\n n$2=_fun_A_test(n$1:A*) virtual [line 46, column 3]\n " shape="box"] "call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_3" -> "call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_2" ; -"init#A#instance.eee79aaaddd644404e17691a7e7d809a_1" [label="1: Start A_init\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 84, column 1]\n " color=yellow style=filled] +"class_method_fst_arg_of_class_method#A#instance.cf9f3087f45649c74ef1f7ca002450f2_1" [label="1: Start A_class_method_fst_arg_of_class_method\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 110, column 1]\n " color=yellow style=filled] + + + "class_method_fst_arg_of_class_method#A#instance.cf9f3087f45649c74ef1f7ca002450f2_1" -> "class_method_fst_arg_of_class_method#A#instance.cf9f3087f45649c74ef1f7ca002450f2_3" ; +"class_method_fst_arg_of_class_method#A#instance.cf9f3087f45649c74ef1f7ca002450f2_2" [label="2: Exit A_class_method_fst_arg_of_class_method \n " color=yellow style=filled] + + +"class_method_fst_arg_of_class_method#A#instance.cf9f3087f45649c74ef1f7ca002450f2_3" [label="3: Return Stmt \n n$26=_fun_NSBundle_bundleForClass:(sizeof(t=A):unsigned long) [line 111, column 10]\n *&return:NSBundle*=n$26 [line 111, column 3]\n " shape="box"] + + + "class_method_fst_arg_of_class_method#A#instance.cf9f3087f45649c74ef1f7ca002450f2_3" -> "class_method_fst_arg_of_class_method#A#instance.cf9f3087f45649c74ef1f7ca002450f2_2" ; +"init#A#instance.eee79aaaddd644404e17691a7e7d809a_1" [label="1: Start A_init\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 85, column 1]\n " color=yellow style=filled] "init#A#instance.eee79aaaddd644404e17691a7e7d809a_1" -> "init#A#instance.eee79aaaddd644404e17691a7e7d809a_3" ; "init#A#instance.eee79aaaddd644404e17691a7e7d809a_2" [label="2: Exit A_init \n " color=yellow style=filled] -"init#A#instance.eee79aaaddd644404e17691a7e7d809a_3" [label="3: Message Call: init \n n$19=*&self:A* [line 85, column 3]\n n$20=_fun_NSObject_init(n$19:A*) [line 85, column 3]\n " shape="box"] +"init#A#instance.eee79aaaddd644404e17691a7e7d809a_3" [label="3: Message Call: init \n n$19=*&self:A* [line 86, column 3]\n n$20=_fun_NSObject_init(n$19:A*) [line 86, column 3]\n " shape="box"] "init#A#instance.eee79aaaddd644404e17691a7e7d809a_3" -> "init#A#instance.eee79aaaddd644404e17691a7e7d809a_2" ; -"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_1" [label="1: Start A_loggerName\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 88, column 1]\n " color=yellow style=filled] +"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_1" [label="1: Start A_loggerName\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 89, column 1]\n " color=yellow style=filled] "loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_1" -> "loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_3" ; "loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_2" [label="2: Exit A_loggerName \n " color=yellow style=filled] -"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_3" [label="3: Return Stmt \n n$22=_fun_NSStringFromClass(sizeof(t=A):unsigned long) [line 89, column 10]\n *&return:NSString*=n$22 [line 89, column 3]\n " shape="box"] +"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_3" [label="3: Return Stmt \n n$22=_fun_NSStringFromClass(sizeof(t=A):unsigned long) [line 90, column 10]\n *&return:NSString*=n$22 [line 90, column 3]\n " shape="box"] "loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_3" -> "loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_2" ; -"t#A#instance.e31b9a7bced712626784e2860af1a31b_1" [label="1: Start A_t\nFormals: self:A*\nLocals: b:B* \n DECLARE_LOCALS(&return,&b); [line 71, column 1]\n " color=yellow style=filled] +"t#A#instance.e31b9a7bced712626784e2860af1a31b_1" [label="1: Start A_t\nFormals: self:A*\nLocals: b:B* \n DECLARE_LOCALS(&return,&b); [line 72, column 1]\n " color=yellow style=filled] "t#A#instance.e31b9a7bced712626784e2860af1a31b_1" -> "t#A#instance.e31b9a7bced712626784e2860af1a31b_4" ; "t#A#instance.e31b9a7bced712626784e2860af1a31b_2" [label="2: Exit A_t \n " color=yellow style=filled] -"t#A#instance.e31b9a7bced712626784e2860af1a31b_3" [label="3: Message Call: b_m \n n$12=_fun_B_b_m() [line 73, column 3]\n " shape="box"] +"t#A#instance.e31b9a7bced712626784e2860af1a31b_3" [label="3: Message Call: b_m \n n$12=_fun_B_b_m() [line 74, column 3]\n " shape="box"] "t#A#instance.e31b9a7bced712626784e2860af1a31b_3" -> "t#A#instance.e31b9a7bced712626784e2860af1a31b_2" ; -"t#A#instance.e31b9a7bced712626784e2860af1a31b_4" [label="4: DeclStmt \n n$13=_fun___objc_alloc_no_fail(sizeof(t=B):unsigned long) [line 72, column 10]\n n$14=_fun_NSObject_init(n$13:B*) virtual [line 72, column 10]\n *&b:B*=n$14 [line 72, column 3]\n " shape="box"] +"t#A#instance.e31b9a7bced712626784e2860af1a31b_4" [label="4: DeclStmt \n n$13=_fun___objc_alloc_no_fail(sizeof(t=B):unsigned long) [line 73, column 10]\n n$14=_fun_NSObject_init(n$13:B*) virtual [line 73, column 10]\n *&b:B*=n$14 [line 73, column 3]\n " shape="box"] "t#A#instance.e31b9a7bced712626784e2860af1a31b_4" -> "t#A#instance.e31b9a7bced712626784e2860af1a31b_3" ; -"test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_1" [label="1: Start A_test\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 41, column 1]\n " color=yellow style=filled] +"test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_1" [label="1: Start A_test\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 42, column 1]\n " color=yellow style=filled] "test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_1" -> "test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_2" ; "test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_2" [label="2: Exit A_test \n " color=yellow style=filled] -"use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_1" [label="1: Start A_use_class_in_other_ways:\nFormals: self:A* object:B*\nLocals: \n DECLARE_LOCALS(&return); [line 76, column 1]\n " color=yellow style=filled] +"use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_1" [label="1: Start A_use_class_in_other_ways:\nFormals: self:A* object:B*\nLocals: \n DECLARE_LOCALS(&return); [line 77, column 1]\n " color=yellow style=filled] "use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_1" -> "use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_3" ; "use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_2" [label="2: Exit A_use_class_in_other_ways: \n " color=yellow style=filled] -"use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_3" [label="3: Return Stmt \n n$16=*&object:B* [line 77, column 11]\n n$17=_fun_B_isC:(n$16:B*,sizeof(t=A):unsigned long) virtual [line 77, column 10]\n *&return:_Bool=n$17 [line 77, column 3]\n " shape="box"] +"use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_3" [label="3: Return Stmt \n n$16=*&object:B* [line 78, column 11]\n n$17=_fun_B_isC:(n$16:B*,sizeof(t=A):unsigned long) virtual [line 78, column 10]\n *&return:_Bool=n$17 [line 78, column 3]\n " shape="box"] "use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_3" -> "use_class_in_other_ways:#A(class B)#instance.7a96604c2c855db834d214f72f83a306_2" ; -"b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_1" [label="1: Start B_b_m\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 18, column 1]\n " color=yellow style=filled] +"b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_1" [label="1: Start B_b_m\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 19, column 1]\n " color=yellow style=filled] "b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_1" -> "b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_2" ; "b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_2" [label="2: Exit B_b_m \n " color=yellow style=filled] -"isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_1" [label="1: Start B_isC:\nFormals: self:B* aClass:objc_class*\nLocals: \n DECLARE_LOCALS(&return); [line 21, column 1]\n " color=yellow style=filled] +"isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_1" [label="1: Start B_isC:\nFormals: self:B* aClass:objc_class*\nLocals: \n DECLARE_LOCALS(&return); [line 22, column 1]\n " color=yellow style=filled] "isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_1" -> "isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_3" ; "isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_2" [label="2: Exit B_isC: \n " color=yellow style=filled] -"isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_3" [label="3: Return Stmt \n *&return:_Bool=1 [line 22, column 3]\n " shape="box"] +"isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_3" [label="3: Return Stmt \n *&return:_Bool=1 [line 23, column 3]\n " shape="box"] "isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_3" -> "isC:#B(struct objc_class)#instance.ab14fb7a19510df6032d65aa27b0f12d_2" ;