[infer] Translate more casts (unsigned int)

Reviewed By: mbouaziz

Differential Revision: D13167384

fbshipit-source-id: 666a52617
master
Sungkeun Cho 6 years ago committed by Facebook Github Bot
parent 3b9bccf126
commit 5f925869b6

@ -318,3 +318,8 @@ let zero_of_type typ =
let zero_of_type_exn typ = Option.value_exn (zero_of_type typ)
let rec ignore_cast e = match e with Cast (_, e) -> ignore_cast e | _ -> e
let rec ignore_integer_cast e =
match e with Cast (t, e) when Typ.is_int t -> ignore_integer_cast e | _ -> e

@ -139,3 +139,7 @@ val zero_of_type : Typ.t -> t option
(** Returns the zero value of a type, for int, float and ptr types *)
val zero_of_type_exn : Typ.t -> t
val ignore_cast : t -> t
val ignore_integer_cast : t -> t

@ -548,6 +548,10 @@ let is_pointer_to_void typ = match typ.desc with Tptr ({desc= Tvoid}, _) -> true
let is_pointer_to_int typ = match typ.desc with Tptr ({desc= Tint _}, _) -> true | _ -> false
let is_int typ = match typ.desc with Tint _ -> true | _ -> false
let is_unsigned_int typ = match typ.desc with Tint ikind -> ikind_is_unsigned ikind | _ -> false
let has_block_prefix s =
match Str.split_delim (Str.regexp_string Config.anonymous_block_prefix) s with
| _ :: _ :: _ ->

@ -293,6 +293,10 @@ val is_reference : t -> bool
val is_struct : t -> bool
val is_int : t -> bool
val is_unsigned_int : t -> bool
val has_block_prefix : string -> bool
val unsome : string -> t option -> t

@ -428,6 +428,8 @@ module Prune = struct
let rec prune_binop_left : Typ.IntegerWidths.t -> Exp.t -> t -> t =
fun integer_type_widths e ({mem} as astate) ->
match e with
| Exp.BinOp (comp, Exp.Cast (_, e1), e2) ->
prune_binop_left integer_type_widths (Exp.BinOp (comp, e1, e2)) astate
| Exp.BinOp ((Binop.Lt as comp), Exp.Var x, e')
| Exp.BinOp ((Binop.Gt as comp), Exp.Var x, e')
| Exp.BinOp ((Binop.Le as comp), Exp.Var x, e')
@ -513,11 +515,18 @@ module Prune = struct
|> prune_binop_left integer_type_widths e
|> prune_binop_right integer_type_widths e
in
let is_const_zero x =
match Exp.ignore_integer_cast x with
| Exp.Const (Const.Cint i) ->
IntLit.iszero i
| _ ->
false
in
match e with
| Exp.BinOp (Binop.Ne, e, Exp.Const (Const.Cint i)) when IntLit.iszero i ->
prune_helper integer_type_widths e astate
| Exp.BinOp (Binop.Eq, e, Exp.Const (Const.Cint i)) when IntLit.iszero i ->
prune_helper integer_type_widths (Exp.UnOp (Unop.LNot, e, None)) astate
| Exp.BinOp (Binop.Ne, e1, e2) when is_const_zero e2 ->
prune_helper integer_type_widths e1 astate
| Exp.BinOp (Binop.Eq, e1, e2) when is_const_zero e2 ->
prune_helper integer_type_widths (Exp.UnOp (Unop.LNot, e1, None)) astate
| Exp.UnOp (Unop.Neg, Exp.Var x, _) ->
prune_helper integer_type_widths (Exp.Var x) astate
| Exp.BinOp (Binop.LAnd, e1, e2) ->

@ -34,13 +34,14 @@ module TransferFunctions (CFG : ProcCfg.S) = struct
let add_live_actuals actuals call_exp live_acc =
let add_live_actuals_ exps acc =
List.fold exps ~f:(fun acc_ (exp, _) -> exp_add_live exp acc_) ~init:acc
List.fold exps ~f:(fun acc_ exp -> exp_add_live exp acc_) ~init:acc
in
match call_exp with
let actuals = List.map actuals ~f:(fun (e, _) -> Exp.ignore_cast e) in
match Exp.ignore_cast call_exp with
| Exp.Const (Cfun (Typ.Procname.ObjC_Cpp _ as pname)) when Typ.Procname.is_constructor pname -> (
(* first actual passed to a C++ constructor is actually written, not read *)
match actuals with
| (Exp.Lvar pvar, _) :: exps ->
| Exp.Lvar pvar :: exps ->
Domain.remove (Var.of_pvar pvar) live_acc |> add_live_actuals_ exps
| exps ->
add_live_actuals_ exps live_acc )
@ -103,7 +104,7 @@ module CapturedByRefTransferFunctions (CFG : ProcCfg.S) = struct
~f:(fun acc exp ->
Exp.fold_captured exp
~f:(fun acc exp ->
match exp with
match Exp.ignore_cast exp with
| Exp.Lvar pvar ->
(* captured by reference, add *)
Domain.add (Var.of_pvar pvar) acc
@ -133,7 +134,9 @@ let checker {Callbacks.tenv; summary; proc_desc} : Summary.t =
(* we don't want to report in harmless cases like int i = 0; if (...) { i = ... } else { i = ... }
that create an intentional dead store as an attempt to imitate default value semantics.
use dead stores to a "sentinel" value as a heuristic for ignoring this case *)
let is_sentinel_exp = function
let rec is_sentinel_exp = function
| Exp.Cast (_, e) ->
is_sentinel_exp e
| Exp.Const (Cint i) ->
IntLit.iszero i || IntLit.isnull i
| Exp.Const (Cfloat 0.0) ->
@ -180,11 +183,14 @@ let checker {Callbacks.tenv; summary; proc_desc} : Summary.t =
when should_report pvar typ live_vars captured_by_ref_vars && not (is_sentinel_exp rhs_exp)
->
log_report pvar typ loc
| Sil.Call
(_, Exp.Const (Cfun (Typ.Procname.ObjC_Cpp _ as pname)), (Exp.Lvar pvar, typ) :: _, loc, _)
| Sil.Call (_, e_fun, (arg, typ) :: _, loc, _) -> (
match (Exp.ignore_cast e_fun, Exp.ignore_cast arg) with
| Exp.Const (Cfun (Typ.Procname.ObjC_Cpp _ as pname)), Exp.Lvar pvar
when Typ.Procname.is_constructor pname
&& should_report pvar typ live_vars captured_by_ref_vars ->
log_report pvar typ loc
| _, _ ->
() )
| _ ->
()
in

@ -483,6 +483,8 @@ let cast_operation cast_kind ((exp, typ) as exp_typ) cast_typ sil_loc =
([], exp_typ)
| `BitCast when Typ.is_pointer_to_int cast_typ ->
([], (Exp.Cast (cast_typ, exp), cast_typ))
| `IntegralCast when Typ.is_unsigned_int cast_typ ->
([], (Exp.Cast (cast_typ, exp), cast_typ))
| `BitCast | `IntegralCast | `IntegralToBoolean ->
(* This is treated as a nop by returning the same expressions exps*)
([], (exp, cast_typ))

@ -15,11 +15,11 @@ digraph cfg {
"main.fad58de7366495db4650cfefac2fcd61_4" -> "main.fad58de7366495db4650cfefac2fcd61_3" ;
"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: BinaryOperatorStmt: Assign \n *&today:int=(2 + 1) [line 23, column 3]\n NULLIFY(&today); [line 23, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: BinaryOperatorStmt: Assign \n *&today:int=((unsigned int)2 + (unsigned int)1) [line 23, column 3]\n NULLIFY(&today); [line 23, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_5" -> "main.fad58de7366495db4650cfefac2fcd61_4" ;
"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: BinaryOperatorStmt: Assign \n n$1=*&today:int [line 22, column 11]\n *&today:int=(n$1 + 4) [line 22, column 3]\n REMOVE_TEMPS(n$1); [line 22, column 3]\n NULLIFY(&today); [line 22, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: BinaryOperatorStmt: Assign \n n$1=*&today:int [line 22, column 11]\n *&today:int=((unsigned int)n$1 + (unsigned int)4) [line 22, column 3]\n REMOVE_TEMPS(n$1); [line 22, column 3]\n NULLIFY(&today); [line 22, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_6" -> "main.fad58de7366495db4650cfefac2fcd61_5" ;

@ -55,15 +55,15 @@ digraph cfg {
"other_enum_test.100f3583adf0259001be6c944828c44a_5" -> "other_enum_test.100f3583adf0259001be6c944828c44a_6" ;
"other_enum_test.100f3583adf0259001be6c944828c44a_5" -> "other_enum_test.100f3583adf0259001be6c944828c44a_7" ;
"other_enum_test.100f3583adf0259001be6c944828c44a_6" [label="6: Prune (true branch, if) \n PRUNE((n$0 == 12), true); [line 23, column 7]\n REMOVE_TEMPS(n$0); [line 23, column 7]\n " shape="invhouse"]
"other_enum_test.100f3583adf0259001be6c944828c44a_6" [label="6: Prune (true branch, if) \n PRUNE(((unsigned int)n$0 == (unsigned int)12), true); [line 23, column 7]\n REMOVE_TEMPS(n$0); [line 23, column 7]\n " shape="invhouse"]
"other_enum_test.100f3583adf0259001be6c944828c44a_6" -> "other_enum_test.100f3583adf0259001be6c944828c44a_8" ;
"other_enum_test.100f3583adf0259001be6c944828c44a_7" [label="7: Prune (false branch, if) \n PRUNE(!(n$0 == 12), false); [line 23, column 7]\n REMOVE_TEMPS(n$0); [line 23, column 7]\n NULLIFY(&foo_a); [line 23, column 7]\n NULLIFY(&foo_g); [line 23, column 7]\n " shape="invhouse"]
"other_enum_test.100f3583adf0259001be6c944828c44a_7" [label="7: Prune (false branch, if) \n PRUNE(!((unsigned int)n$0 == (unsigned int)12), false); [line 23, column 7]\n REMOVE_TEMPS(n$0); [line 23, column 7]\n NULLIFY(&foo_a); [line 23, column 7]\n NULLIFY(&foo_g); [line 23, column 7]\n " shape="invhouse"]
"other_enum_test.100f3583adf0259001be6c944828c44a_7" -> "other_enum_test.100f3583adf0259001be6c944828c44a_9" ;
"other_enum_test.100f3583adf0259001be6c944828c44a_8" [label="8: Return Stmt \n n$1=*&foo_g:int [line 24, column 12]\n n$2=*&foo_a:int [line 24, column 20]\n *&return:int=(n$1 / n$2) [line 24, column 5]\n REMOVE_TEMPS(n$1,n$2); [line 24, column 5]\n NULLIFY(&foo_a); [line 24, column 5]\n NULLIFY(&foo_g); [line 24, column 5]\n APPLY_ABSTRACTION; [line 24, column 5]\n " shape="box"]
"other_enum_test.100f3583adf0259001be6c944828c44a_8" [label="8: Return Stmt \n n$1=*&foo_g:int [line 24, column 12]\n n$2=*&foo_a:int [line 24, column 20]\n *&return:int=((unsigned int)n$1 / (unsigned int)n$2) [line 24, column 5]\n REMOVE_TEMPS(n$1,n$2); [line 24, column 5]\n NULLIFY(&foo_a); [line 24, column 5]\n NULLIFY(&foo_g); [line 24, column 5]\n APPLY_ABSTRACTION; [line 24, column 5]\n " shape="box"]
"other_enum_test.100f3583adf0259001be6c944828c44a_8" -> "other_enum_test.100f3583adf0259001be6c944828c44a_2" ;

@ -232,7 +232,7 @@ codetoanalyze/cpp/shared/constructors/constructor_init.cpp, f2_div0, 2, DIVIDE_B
codetoanalyze/cpp/shared/constructors/constructor_init.cpp, f_div0, 2, DIVIDE_BY_ZERO, no_bucket, ERROR, [start of procedure f_div0(),start of procedure B,start of procedure A,return from a call to A_A,start of procedure T,return from a call to B::T_T,return from a call to B_B]
codetoanalyze/cpp/shared/constructors/constructor_init.cpp, t_div0, 2, DIVIDE_BY_ZERO, no_bucket, ERROR, [start of procedure t_div0(),start of procedure B,start of procedure A,return from a call to A_A,start of procedure T,return from a call to B::T_T,return from a call to B_B]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::array_of_class_with_not_constant_size, 2, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::array_of_class_with_not_constant_size(),start of procedure constructor_new::getValue(),return from a call to constructor_new::getValue,Condition is true,return from a call to constructor_new::array_of_class_with_not_constant_size]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::array_of_person_with_constant_size, 0, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::array_of_person_with_constant_size(),start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,return from a call to constructor_new::array_of_person_with_constant_size]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::array_of_person_with_constant_size, 0, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::array_of_person_with_constant_size(),return from a call to constructor_new::array_of_person_with_constant_size]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::constructor_1_arg_new_div0, 2, DIVIDE_BY_ZERO, no_bucket, ERROR, [start of procedure constructor_new::constructor_1_arg_new_div0(),start of procedure Person,return from a call to constructor_new::Person_Person]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::constructor_1_arg_new_div0, 3, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::constructor_1_arg_new_div0(),start of procedure Person,return from a call to constructor_new::Person_Person,return from a call to constructor_new::constructor_1_arg_new_div0]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::constructor_3_args_new_div0, 2, DIVIDE_BY_ZERO, no_bucket, ERROR, [start of procedure constructor_new::constructor_3_args_new_div0(),start of procedure Person,return from a call to constructor_new::Person_Person]
@ -255,7 +255,7 @@ codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::int_
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::int_init_nodes, 5, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::int_init_nodes(),start of procedure constructor_new::getValue(),return from a call to constructor_new::getValue,start of procedure constructor_new::getValue(),return from a call to constructor_new::getValue,Condition is false,return from a call to constructor_new::int_init_nodes]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::int_init_number, 2, DIVIDE_BY_ZERO, no_bucket, ERROR, [start of procedure constructor_new::int_init_number()]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::int_init_number, 3, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::int_init_number(),return from a call to constructor_new::int_init_number]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::matrix_of_person, 3, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::matrix_of_person(),start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,start of procedure Person,return from a call to constructor_new::Person_Person,return from a call to constructor_new::matrix_of_person]
codetoanalyze/cpp/shared/constructors/constructor_new.cpp, constructor_new::matrix_of_person, 3, MEMORY_LEAK, CPP, ERROR, [start of procedure constructor_new::matrix_of_person(),return from a call to constructor_new::matrix_of_person]
codetoanalyze/cpp/shared/constructors/constructor_with_body.cpp, constructor_with_body::test_div0, 2, DIVIDE_BY_ZERO, no_bucket, ERROR, [start of procedure constructor_with_body::test_div0(),start of procedure X,start of procedure init,return from a call to constructor_with_body::X_init,return from a call to constructor_with_body::X_X,start of procedure div]
codetoanalyze/cpp/shared/constructors/constructor_with_body.cpp, constructor_with_body::test_div0_default_constructor, 2, DIVIDE_BY_ZERO, no_bucket, ERROR, [start of procedure constructor_with_body::test_div0_default_constructor(),start of procedure X,start of procedure init,return from a call to constructor_with_body::X_init,return from a call to constructor_with_body::X_X,start of procedure div]
codetoanalyze/cpp/shared/constructors/copy_array_field.cpp, copy_array_field::npe, 4, NULL_DEREFERENCE, B1, ERROR, [start of procedure copy_array_field::npe(),start of procedure X,return from a call to copy_array_field::X_X,start of procedure X,return from a call to copy_array_field::X_X]

@ -26,11 +26,11 @@ digraph cfg {
"hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_4" -> "hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_3" ;
"hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_5" [label="5: Prune (true branch, if) \n PRUNE((_t$0 == 0), true); [line 15, column 7]\n REMOVE_TEMPS(_t$0); [line 15, column 7]\n " shape="invhouse"]
"hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_5" [label="5: Prune (true branch, if) \n PRUNE((_t$0 == (unsigned long)0), true); [line 15, column 7]\n REMOVE_TEMPS(_t$0); [line 15, column 7]\n " shape="invhouse"]
"hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_5" -> "hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_7" ;
"hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_6" [label="6: Prune (false branch, if) \n PRUNE(!(_t$0 == 0), false); [line 15, column 7]\n REMOVE_TEMPS(_t$0); [line 15, column 7]\n NULLIFY(&seed); [line 15, column 7]\n " shape="invhouse"]
"hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_6" [label="6: Prune (false branch, if) \n PRUNE(!(_t$0 == (unsigned long)0), false); [line 15, column 7]\n REMOVE_TEMPS(_t$0); [line 15, column 7]\n NULLIFY(&seed); [line 15, column 7]\n " shape="invhouse"]
"hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_6" -> "hash_combine_generic<MyHasher,_int,_int,_int>#343026119801841589.3016efe6a900b985af0e18a37325385b_4" ;

@ -40,7 +40,7 @@ digraph cfg {
"main.fad58de7366495db4650cfefac2fcd61_10" -> "main.fad58de7366495db4650cfefac2fcd61_4" ;
"main.fad58de7366495db4650cfefac2fcd61_11" [label="11: BinaryOperatorStmt: Assign \n n$9=*&germanCars:NSArray* [line 22, column 7]\n n$10=_fun_NSArray_objectAtIndexedSubscript:(n$9:NSArray*,3:unsigned long) virtual [line 22, column 7]\n *&s:NSString*=n$10 [line 22, column 3]\n REMOVE_TEMPS(n$9,n$10); [line 22, column 3]\n NULLIFY(&s); [line 22, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_11" [label="11: BinaryOperatorStmt: Assign \n n$9=*&germanCars:NSArray* [line 22, column 7]\n n$10=_fun_NSArray_objectAtIndexedSubscript:(n$9:NSArray*,(unsigned long)3:unsigned long) virtual [line 22, column 7]\n *&s:NSString*=n$10 [line 22, column 3]\n REMOVE_TEMPS(n$9,n$10); [line 22, column 3]\n NULLIFY(&s); [line 22, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_11" -> "main.fad58de7366495db4650cfefac2fcd61_10" ;

@ -99,7 +99,7 @@ digraph cfg {
"while_loop:#A(class NSArray)#instance.225f55f19f886cfaa14fc056eca2399b_4" -> "while_loop:#A(class NSArray)#instance.225f55f19f886cfaa14fc056eca2399b_5" ;
"while_loop:#A(class NSArray)#instance.225f55f19f886cfaa14fc056eca2399b_5" [label="5: BinaryOperatorStmt: Assign \n n$12=*&items:NSArray* [line 30, column 19]\n n$13=_fun_NSArray_objectAtIndex:(n$12:NSArray*,3:unsigned long) virtual [line 30, column 18]\n *&item:NSArray*=n$13 [line 30, column 11]\n n$14=*&item:NSArray* [line 30, column 11]\n REMOVE_TEMPS(n$12,n$13); [line 30, column 11]\n " shape="box"]
"while_loop:#A(class NSArray)#instance.225f55f19f886cfaa14fc056eca2399b_5" [label="5: BinaryOperatorStmt: Assign \n n$12=*&items:NSArray* [line 30, column 19]\n n$13=_fun_NSArray_objectAtIndex:(n$12:NSArray*,(unsigned long)3:unsigned long) virtual [line 30, column 18]\n *&item:NSArray*=n$13 [line 30, column 11]\n n$14=*&item:NSArray* [line 30, column 11]\n REMOVE_TEMPS(n$12,n$13); [line 30, column 11]\n " shape="box"]
"while_loop:#A(class NSArray)#instance.225f55f19f886cfaa14fc056eca2399b_5" -> "while_loop:#A(class NSArray)#instance.225f55f19f886cfaa14fc056eca2399b_6" ;

@ -86,7 +86,7 @@ digraph cfg {
"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_4" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_7" ;
"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_5" [label="5: DeclStmt \n n$12=_fun___variable_initialization(&idx:unsigned long) [line 48, column 8]\n *&idx:unsigned long=0 [line 48, column 8]\n REMOVE_TEMPS(n$12); [line 48, column 8]\n APPLY_ABSTRACTION; [line 48, column 8]\n " shape="box"]
"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_5" [label="5: DeclStmt \n n$12=_fun___variable_initialization(&idx:unsigned long) [line 48, column 8]\n *&idx:unsigned long=(unsigned long)0 [line 48, column 8]\n REMOVE_TEMPS(n$12); [line 48, column 8]\n APPLY_ABSTRACTION; [line 48, column 8]\n " shape="box"]
"array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_5" -> "array_trans#MyBlock#instance.13289a590560d0628a3ae5174e716a32_4" ;

@ -68,7 +68,7 @@ digraph cfg {
"blockReleaseNoLeak#My_manager#instance.0c48f80f024250b18a529440f1313af6_10" -> "blockReleaseNoLeak#My_manager#instance.0c48f80f024250b18a529440f1313af6_9" ;
"blockReleaseNoLeak#My_manager#instance.0c48f80f024250b18a529440f1313af6_11" [label="11: DeclStmt \n n$19=_fun___variable_initialization(&context:CGContext*) [line 21, column 3]\n n$18=_fun_CGBitmapContextCreate(null:void*,0:unsigned long,0:unsigned long,8:unsigned long,0:unsigned long,null:CGColorSpace*,0:unsigned int) [line 21, column 26]\n *&context:CGContext*=n$18 [line 21, column 3]\n REMOVE_TEMPS(n$18,n$19); [line 21, column 3]\n " shape="box"]
"blockReleaseNoLeak#My_manager#instance.0c48f80f024250b18a529440f1313af6_11" [label="11: DeclStmt \n n$19=_fun___variable_initialization(&context:CGContext*) [line 21, column 3]\n n$18=_fun_CGBitmapContextCreate(null:void*,(unsigned long)0:unsigned long,(unsigned long)0:unsigned long,(unsigned long)8:unsigned long,(unsigned long)0:unsigned long,null:CGColorSpace*,(unsigned int)0:unsigned int) [line 21, column 26]\n *&context:CGContext*=n$18 [line 21, column 3]\n REMOVE_TEMPS(n$18,n$19); [line 21, column 3]\n " shape="box"]
"blockReleaseNoLeak#My_manager#instance.0c48f80f024250b18a529440f1313af6_11" -> "blockReleaseNoLeak#My_manager#instance.0c48f80f024250b18a529440f1313af6_10" ;

@ -101,7 +101,7 @@ digraph cfg {
"dispatch_after_example#DispatchEx#class.1d25856bd99eb1ef683c8f65ff46d05d_3" -> "dispatch_after_example#DispatchEx#class.1d25856bd99eb1ef683c8f65ff46d05d_2" ;
"dispatch_after_example#DispatchEx#class.1d25856bd99eb1ef683c8f65ff46d05d_4" [label="4: Call _fun_dispatch_after \n n$18=_fun_dispatch_time(0:unsigned long long,(2 * 1000000000):long long) [line 46, column 18]\n n$19=_fun_dispatch_get_main_queue() [line 47, column 18]\n n$23=_fun_dispatch_after(n$18:unsigned long long,n$19:NSObject*,(_fun_objc_blockDispatchEx_dispatch_after_example_3):_fn_(*)) block_params [line 46, column 3]\n REMOVE_TEMPS(n$18,n$19,n$23); [line 46, column 3]\n " shape="box"]
"dispatch_after_example#DispatchEx#class.1d25856bd99eb1ef683c8f65ff46d05d_4" [label="4: Call _fun_dispatch_after \n n$18=_fun_dispatch_time(0:unsigned long long,((unsigned long long)2 * 1000000000):long long) [line 46, column 18]\n n$19=_fun_dispatch_get_main_queue() [line 47, column 18]\n n$23=_fun_dispatch_after(n$18:unsigned long long,n$19:NSObject*,(_fun_objc_blockDispatchEx_dispatch_after_example_3):_fn_(*)) block_params [line 46, column 3]\n REMOVE_TEMPS(n$18,n$19,n$23); [line 46, column 3]\n " shape="box"]
"dispatch_after_example#DispatchEx#class.1d25856bd99eb1ef683c8f65ff46d05d_4" -> "dispatch_after_example#DispatchEx#class.1d25856bd99eb1ef683c8f65ff46d05d_3" ;
@ -120,7 +120,7 @@ digraph cfg {
"dispatch_async_example#DispatchEx#class.5c5d7347be2a9654ad7e32514189fe54_3" -> "dispatch_async_example#DispatchEx#class.5c5d7347be2a9654ad7e32514189fe54_2" ;
"dispatch_async_example#DispatchEx#class.5c5d7347be2a9654ad7e32514189fe54_4" [label="4: Call _fun_dispatch_async \n n$10=_fun_dispatch_get_global_queue(0:long,0:unsigned long) [line 36, column 18]\n n$14=_fun_dispatch_async(n$10:NSObject*,(_fun_objc_blockDispatchEx_dispatch_async_example_2):_fn_(*)) block_params [line 36, column 3]\n REMOVE_TEMPS(n$10,n$14); [line 36, column 3]\n " shape="box"]
"dispatch_async_example#DispatchEx#class.5c5d7347be2a9654ad7e32514189fe54_4" [label="4: Call _fun_dispatch_async \n n$10=_fun_dispatch_get_global_queue(0:long,(unsigned long)0:unsigned long) [line 36, column 18]\n n$14=_fun_dispatch_async(n$10:NSObject*,(_fun_objc_blockDispatchEx_dispatch_async_example_2):_fn_(*)) block_params [line 36, column 3]\n REMOVE_TEMPS(n$10,n$14); [line 36, column 3]\n " shape="box"]
"dispatch_async_example#DispatchEx#class.5c5d7347be2a9654ad7e32514189fe54_4" -> "dispatch_async_example#DispatchEx#class.5c5d7347be2a9654ad7e32514189fe54_3" ;

Loading…
Cancel
Save