Add extra dereference to the variable of the method call to find null dereferences when a method called with null.

Reviewed By: akotulski

Differential Revision: D2954284

fb-gh-sync-id: d9079db
shipit-source-id: d9079db
master
Dulma Rodriguez 9 years ago committed by facebook-github-bot-7
parent ba4dbef2d9
commit 06f40efab8

@ -485,9 +485,10 @@ struct
let ids = pre_trans_result.ids @ deref_ids in
{ pre_trans_result with ids; instrs; exps = [(exp, field_typ)] }
let method_deref_trans trans_state pre_trans_result decl_ref =
let method_deref_trans trans_state pre_trans_result decl_ref stmt_info decl_kind =
let open CContext in
let context = trans_state.context in
let sil_loc = CLocation.get_sil_location stmt_info context in
let name_info, decl_ptr, type_ptr = get_info_from_decl_ref decl_ref in
let method_name = Ast_utils.get_unqualified_name name_info in
let class_name = Ast_utils.get_class_name_from_member name_info in
@ -500,21 +501,27 @@ struct
let is_cpp_virtual = match ms_opt with
| Some ms -> CMethod_signature.ms_is_cpp_virtual ms
| _ -> false in
let extra_exps = if is_instance_method then (
let extra_exps, extra_ids, extra_instrs = if is_instance_method then (
(* pre_trans_result.exps may contain expr for 'this' parameter:*)
(* if it comes from CXXMemberCallExpr it will be there *)
(* if it comes from CXXOperatorCallExpr it won't be there and will be added later *)
(* In case of CXXMemberCallExpr it's possible that type of 'this' parameter *)
(* won't have a pointer - if that happens add a pointer to type of the object *)
match pre_trans_result.exps with
| [] -> []
| [(_, Sil.Tptr _ )] -> pre_trans_result.exps
| [(sil, typ)] -> [(sil, Sil.Tptr (typ, Sil.Pk_reference))]
| [] -> [], [], []
(* We need to add a dereference before a method call to find null dereferences when *)
(* calling a method with null *)
| [(exp, Sil.Tptr (typ, _) )] when decl_kind <> `CXXConstructor ->
let typ = CTypes.expand_structured_type context.tenv typ in
let extra_ids, extra_instrs, _ = CTrans_utils.dereference_var_sil (exp, typ) sil_loc in
pre_trans_result.exps, extra_ids, extra_instrs
| [(_, Sil.Tptr _ )] -> pre_trans_result.exps, [], []
| [(sil, typ)] -> [(sil, Sil.Tptr (typ, Sil.Pk_reference))], [], []
| _ -> assert false
)
else
(* don't add 'this' expression for static methods *)
[] in
[], [], [] in
(* consider using context.CContext.is_callee_expression to deal with pointers to methods? *)
(* unlike field access, for method calls there is no need to expand class type *)
let pname = CMethod_trans.create_procdesc_with_pointer context decl_ptr (Some class_name)
@ -522,9 +529,12 @@ struct
let method_exp = (Sil.Const (Sil.Cfun pname), method_typ) in
Cfg.set_procname_priority context.CContext.cfg pname;
{ pre_trans_result with
exps = [method_exp] @ extra_exps; is_cpp_call_virtual = is_cpp_virtual }
is_cpp_call_virtual = is_cpp_virtual;
exps = [method_exp] @ extra_exps;
instrs = pre_trans_result.instrs @ extra_instrs;
ids = pre_trans_result.ids @ extra_ids }
let destructor_deref_trans trans_state pvar_trans_result class_type_ptr =
let destructor_deref_trans trans_state pvar_trans_result class_type_ptr si =
let open Clang_ast_t in
let destruct_decl_ref_opt = match Ast_utils.get_decl_from_typ_ptr class_type_ptr with
| Some CXXRecordDecl (_, _, _ , _, _, _, _, cxx_record_info)
@ -532,7 +542,7 @@ struct
cxx_record_info.xrdi_destructor
| _ -> None in
match destruct_decl_ref_opt with
| Some decl_ref -> method_deref_trans trans_state pvar_trans_result decl_ref
| Some decl_ref -> method_deref_trans trans_state pvar_trans_result decl_ref si `CXXDestructor
| None -> empty_res_trans
let this_expr_trans trans_state sil_loc class_type_ptr =
@ -571,8 +581,8 @@ struct
| `Function -> function_deref_trans trans_state decl_ref
| `Var | `ImplicitParam | `ParmVar -> var_deref_trans trans_state stmt_info decl_ref
| `Field | `ObjCIvar -> field_deref_trans trans_state stmt_info pre_trans_result decl_ref
| `CXXMethod | `CXXConstructor | `CXXConversion ->
method_deref_trans trans_state pre_trans_result decl_ref
| `CXXMethod | `CXXConversion | `CXXConstructor ->
method_deref_trans trans_state pre_trans_result decl_ref stmt_info decl_kind
| _ ->
let print_error decl_kind =
Printing.log_stats
@ -902,7 +912,7 @@ struct
and cxx_destructor_call_trans trans_state si this_res_trans class_type_ptr =
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in
let res_trans_callee = destructor_deref_trans trans_state this_res_trans class_type_ptr in
let res_trans_callee = destructor_deref_trans trans_state this_res_trans class_type_ptr si in
let is_cpp_call_virtual = res_trans_callee.is_cpp_call_virtual in
if res_trans_callee.exps <> [] then
cxx_method_construct_call_trans trans_state_pri res_trans_callee [] si Sil.Tvoid

@ -109,6 +109,8 @@ val cast_trans :
CContext.t -> (Sil.exp * Sil.typ) list -> Location.t -> Procname.t option -> Sil.typ ->
(Ident.t * Sil.instr * Sil.exp) option
val dereference_var_sil : Sil.exp * Sil.typ -> Location.t -> Ident.t list * Sil.instr list * Sil.exp
(** Module for creating cfg nodes and other utility functions related to them. *)
module Nodes :
sig

@ -0,0 +1,39 @@
/*
* Copyright (c) 2016 - 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.
*/
struct X {
int f;
int call() { return 1; }
};
int npe_call() {
X* x = nullptr;
return x->call();
}
X* getX() { return nullptr; }
void npe_call_after_call() { getX()->call(); }
struct XForward;
struct Y {
XForward* x;
};
struct XForward {
int call() { return 0; }
int f;
};
void call_with_forward_declaration(XForward* x) { x->call(); }
void npe_call_with_forward_declaration() {
call_with_forward_declaration(nullptr);
}

@ -0,0 +1,83 @@
digraph iCFG {
22 [label="22: Call _fun_call_with_forward_declaration \n _fun_call_with_forward_declaration(null:class XForward *) [line 38]\n APPLY_ABSTRACTION; [line 38]\n " shape="box"]
22 -> 21 ;
21 [label="21: Exit npe_call_with_forward_declaration \n " color=yellow style=filled]
20 [label="20: Start npe_call_with_forward_declaration\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 37]\n " color=yellow style=filled]
20 -> 22 ;
19 [label="19: Call _fun_XForward_call \n n$0=*&x:class XForward * [line 35]\n n$1=*n$0:class XForward [line 35]\n n$2=_fun_XForward_call(n$0:class XForward *) [line 35]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 35]\n NULLIFY(&x,false); [line 35]\n APPLY_ABSTRACTION; [line 35]\n " shape="box"]
19 -> 18 ;
18 [label="18: Exit call_with_forward_declaration \n " color=yellow style=filled]
17 [label="17: Start call_with_forward_declaration\nFormals: x:class XForward *\nLocals: \n DECLARE_LOCALS(&return); [line 35]\n " color=yellow style=filled]
17 -> 19 ;
16 [label="16: Return Stmt \n *&return:int =0 [line 31]\n APPLY_ABSTRACTION; [line 31]\n " shape="box"]
16 -> 15 ;
15 [label="15: Exit XForward_call \n " color=yellow style=filled]
14 [label="14: Start XForward_call\nFormals: this:class XForward *\nLocals: \n DECLARE_LOCALS(&return); [line 31]\n NULLIFY(&this,false); [line 31]\n " color=yellow style=filled]
14 -> 16 ;
13 [label="13: Call _fun_X_call \n n$0=_fun_getX() [line 22]\n n$1=*n$0:class X [line 22]\n n$2=_fun_X_call(n$0:class X *) [line 22]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 22]\n APPLY_ABSTRACTION; [line 22]\n " shape="box"]
13 -> 12 ;
12 [label="12: Exit npe_call_after_call \n " color=yellow style=filled]
11 [label="11: Start npe_call_after_call\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 22]\n " color=yellow style=filled]
11 -> 13 ;
10 [label="10: Return Stmt \n *&return:class X *=null [line 20]\n APPLY_ABSTRACTION; [line 20]\n " shape="box"]
10 -> 9 ;
9 [label="9: Exit getX \n " color=yellow style=filled]
8 [label="8: Start getX\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 20]\n " color=yellow style=filled]
8 -> 10 ;
7 [label="7: DeclStmt \n *&x:class X *=null [line 16]\n " shape="box"]
7 -> 6 ;
6 [label="6: Return Stmt \n n$0=*&x:class X * [line 17]\n n$1=*n$0:class X [line 17]\n n$2=_fun_X_call(n$0:class X *) [line 17]\n *&return:int =n$2 [line 17]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 17]\n NULLIFY(&x,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
6 -> 5 ;
5 [label="5: Exit npe_call \n " color=yellow style=filled]
4 [label="4: Start npe_call\nFormals: \nLocals: x:class X * \n DECLARE_LOCALS(&return,&x); [line 15]\n NULLIFY(&x,false); [line 15]\n " color=yellow style=filled]
4 -> 7 ;
3 [label="3: Return Stmt \n *&return:int =1 [line 12]\n APPLY_ABSTRACTION; [line 12]\n " shape="box"]
3 -> 2 ;
2 [label="2: Exit X_call \n " color=yellow style=filled]
1 [label="1: Start X_call\nFormals: this:class X *\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n NULLIFY(&this,false); [line 12]\n " color=yellow style=filled]
1 -> 3 ;
}

@ -3,7 +3,7 @@ digraph iCFG {
26 -> 25 ;
25 [label="25: Call _fun_X_div \n n$0=_fun_X_div(&x:class X &) [line 40]\n REMOVE_TEMPS(n$0); [line 40]\n NULLIFY(&x,false); [line 40]\n APPLY_ABSTRACTION; [line 40]\n " shape="box"]
25 [label="25: Call _fun_X_div \n n$0=*&x:class X [line 40]\n n$1=_fun_X_div(&x:class X &) [line 40]\n REMOVE_TEMPS(n$0,n$1); [line 40]\n NULLIFY(&x,false); [line 40]\n APPLY_ABSTRACTION; [line 40]\n " shape="box"]
25 -> 24 ;
@ -18,7 +18,7 @@ digraph iCFG {
22 -> 21 ;
21 [label="21: Call _fun_X_div \n n$0=_fun_X_div(&x:class X &) [line 35]\n REMOVE_TEMPS(n$0); [line 35]\n NULLIFY(&x,false); [line 35]\n APPLY_ABSTRACTION; [line 35]\n " shape="box"]
21 [label="21: Call _fun_X_div \n n$0=*&x:class X [line 35]\n n$1=_fun_X_div(&x:class X &) [line 35]\n REMOVE_TEMPS(n$0,n$1); [line 35]\n NULLIFY(&x,false); [line 35]\n APPLY_ABSTRACTION; [line 35]\n " shape="box"]
21 -> 20 ;
@ -33,7 +33,7 @@ digraph iCFG {
18 -> 17 ;
17 [label="17: Call _fun_X_div \n n$0=_fun_X_div(&x:class X &) [line 30]\n REMOVE_TEMPS(n$0); [line 30]\n NULLIFY(&x,false); [line 30]\n APPLY_ABSTRACTION; [line 30]\n " shape="box"]
17 [label="17: Call _fun_X_div \n n$0=*&x:class X [line 30]\n n$1=_fun_X_div(&x:class X &) [line 30]\n REMOVE_TEMPS(n$0,n$1); [line 30]\n NULLIFY(&x,false); [line 30]\n APPLY_ABSTRACTION; [line 30]\n " shape="box"]
17 -> 16 ;
@ -44,11 +44,11 @@ digraph iCFG {
15 -> 18 ;
14 [label="14: DeclStmt \n n$3=*&a:int [line 23]\n n$4=*&b:int [line 23]\n *&c:int =(n$3 + n$4) [line 23]\n REMOVE_TEMPS(n$3,n$4); [line 23]\n NULLIFY(&a,false); [line 23]\n NULLIFY(&b,false); [line 23]\n " shape="box"]
14 [label="14: DeclStmt \n n$4=*&a:int [line 23]\n n$5=*&b:int [line 23]\n *&c:int =(n$4 + n$5) [line 23]\n REMOVE_TEMPS(n$4,n$5); [line 23]\n NULLIFY(&a,false); [line 23]\n NULLIFY(&b,false); [line 23]\n " shape="box"]
14 -> 13 ;
13 [label="13: Call _fun_X_init \n n$2=*&this:class X * [line 24]\n _fun_X_init(n$2:class X *) [line 24]\n REMOVE_TEMPS(n$2); [line 24]\n " shape="box"]
13 [label="13: Call _fun_X_init \n n$2=*&this:class X * [line 24]\n n$3=*n$2:class X [line 24]\n _fun_X_init(n$2:class X *) [line 24]\n REMOVE_TEMPS(n$2,n$3); [line 24]\n " shape="box"]
13 -> 12 ;
@ -74,7 +74,7 @@ digraph iCFG {
7 -> 9 ;
6 [label="6: Call _fun_X_init \n n$0=*&this:class X * [line 15]\n _fun_X_init(n$0:class X *) [line 15]\n REMOVE_TEMPS(n$0); [line 15]\n NULLIFY(&this,false); [line 15]\n APPLY_ABSTRACTION; [line 15]\n " shape="box"]
6 [label="6: Call _fun_X_init \n n$0=*&this:class X * [line 15]\n n$1=*n$0:class X [line 15]\n _fun_X_init(n$0:class X *) [line 15]\n REMOVE_TEMPS(n$0,n$1); [line 15]\n NULLIFY(&this,false); [line 15]\n APPLY_ABSTRACTION; [line 15]\n " shape="box"]
6 -> 5 ;

@ -76,18 +76,18 @@ digraph iCFG {
23 -> 25 ;
22 [label="22: DeclStmt \n _fun_X_X(&SIL_materialize_temp__n$1:class X *,0:int ,1:int ) [line 27]\n _fun_X_X(&x:class X *,&SIL_materialize_temp__n$1:class X &) [line 27]\n " shape="box"]
22 [label="22: DeclStmt \n _fun_X_X(&SIL_materialize_temp__n$2:class X *,0:int ,1:int ) [line 27]\n _fun_X_X(&x:class X *,&SIL_materialize_temp__n$2:class X &) [line 27]\n " shape="box"]
22 -> 21 ;
21 [label="21: Return Stmt \n n$0=_fun_X_div(&x:class X &) [line 28]\n *&return:int =n$0 [line 28]\n REMOVE_TEMPS(n$0); [line 28]\n NULLIFY(&SIL_materialize_temp__n$1,false); [line 28]\n NULLIFY(&x,false); [line 28]\n APPLY_ABSTRACTION; [line 28]\n " shape="box"]
21 [label="21: Return Stmt \n n$0=*&x:class X [line 28]\n n$1=_fun_X_div(&x:class X &) [line 28]\n *&return:int =n$1 [line 28]\n REMOVE_TEMPS(n$0,n$1); [line 28]\n NULLIFY(&SIL_materialize_temp__n$2,false); [line 28]\n NULLIFY(&x,false); [line 28]\n APPLY_ABSTRACTION; [line 28]\n " shape="box"]
21 -> 20 ;
20 [label="20: Exit assign_temp_div0 \n " color=yellow style=filled]
19 [label="19: Start assign_temp_div0\nFormals: \nLocals: x:class X SIL_materialize_temp__n$1:class X \n DECLARE_LOCALS(&return,&x,&SIL_materialize_temp__n$1); [line 26]\n " color=yellow style=filled]
19 [label="19: Start assign_temp_div0\nFormals: \nLocals: x:class X SIL_materialize_temp__n$2:class X \n DECLARE_LOCALS(&return,&x,&SIL_materialize_temp__n$2); [line 26]\n " color=yellow style=filled]
19 -> 22 ;

@ -10,7 +10,7 @@ digraph iCFG {
6 -> 8 ;
5 [label="5: Call delete \n n$0=*&x:class X * [line 14]\n _fun_X_~X(n$0:class X *) [line 14]\n _fun___delete(n$0:class X *) [line 14]\n REMOVE_TEMPS(n$0); [line 14]\n NULLIFY(&x,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"]
5 [label="5: Call delete \n n$0=*&x:class X * [line 14]\n n$1=*n$0:class X [line 14]\n _fun_X_~X(n$0:class X *) [line 14]\n _fun___delete(n$0:class X *) [line 14]\n REMOVE_TEMPS(n$0,n$1); [line 14]\n NULLIFY(&x,false); [line 14]\n APPLY_ABSTRACTION; [line 14]\n " shape="box"]
5 -> 4 ;

@ -25,7 +25,7 @@ digraph iCFG {
30 -> 29 ;
29 [label="29: Call _fun_B<A>_div0 \n n$0=_fun_B<A>_div0(&b:class B<A> &) [line 20]\n REMOVE_TEMPS(n$0); [line 20]\n NULLIFY(&b,false); [line 20]\n APPLY_ABSTRACTION; [line 20]\n " shape="box"]
29 [label="29: Call _fun_B<A>_div0 \n n$0=*&b:class B<A> [line 20]\n n$1=_fun_B<A>_div0(&b:class B<A> &) [line 20]\n REMOVE_TEMPS(n$0,n$1); [line 20]\n NULLIFY(&b,false); [line 20]\n APPLY_ABSTRACTION; [line 20]\n " shape="box"]
29 -> 28 ;
@ -40,7 +40,7 @@ digraph iCFG {
26 -> 25 ;
25 [label="25: Call _fun_B<int>_div0 \n n$0=_fun_B<int>_div0(&b:class B<int> &) [line 15]\n REMOVE_TEMPS(n$0); [line 15]\n NULLIFY(&b,false); [line 15]\n APPLY_ABSTRACTION; [line 15]\n " shape="box"]
25 [label="25: Call _fun_B<int>_div0 \n n$0=*&b:class B<int> [line 15]\n n$1=_fun_B<int>_div0(&b:class B<int> &) [line 15]\n REMOVE_TEMPS(n$0,n$1); [line 15]\n NULLIFY(&b,false); [line 15]\n APPLY_ABSTRACTION; [line 15]\n " shape="box"]
25 -> 24 ;

@ -1,5 +1,5 @@
digraph iCFG {
9 [label="9: Return Stmt \n n$0=*&a:class A * [line 17]\n n$1=_fun_A_meth_with_self(n$0:class A *,1:int ,2:int ) [line 17]\n n$2=_fun_fun_with_self(10:int ) [line 17]\n *&return:int =(n$1 + n$2) [line 17]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 17]\n NULLIFY(&a,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
9 [label="9: Return Stmt \n n$0=*&a:class A * [line 17]\n n$1=*n$0:class A [line 17]\n n$2=_fun_A_meth_with_self(n$0:class A *,1:int ,2:int ) [line 17]\n n$3=_fun_fun_with_self(10:int ) [line 17]\n *&return:int =(n$2 + n$3) [line 17]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 17]\n NULLIFY(&a,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
9 -> 8 ;

@ -7,36 +7,36 @@ digraph iCFG {
42 -> 35 ;
41 [label="41: DeclStmt \n n$13=_fun_iterator_operator*(&__begin:class iterator &) [line 37]\n *&value:int =n$13 [line 37]\n REMOVE_TEMPS(n$13); [line 37]\n " shape="box"]
41 [label="41: DeclStmt \n n$15=_fun_iterator_operator*(&__begin:class iterator &) [line 37]\n *&value:int =n$15 [line 37]\n REMOVE_TEMPS(n$15); [line 37]\n " shape="box"]
41 -> 40 ;
40 [label="40: DeclStmt \n n$11=*&value:int [line 38]\n n$12=*&value:int [line 38]\n *&temp:int =((n$11 * n$12) + 10) [line 38]\n REMOVE_TEMPS(n$11,n$12); [line 38]\n NULLIFY(&temp,false); [line 38]\n NULLIFY(&value,false); [line 38]\n " shape="box"]
40 [label="40: DeclStmt \n n$13=*&value:int [line 38]\n n$14=*&value:int [line 38]\n *&temp:int =((n$13 * n$14) + 10) [line 38]\n REMOVE_TEMPS(n$13,n$14); [line 38]\n NULLIFY(&temp,false); [line 38]\n NULLIFY(&value,false); [line 38]\n " shape="box"]
40 -> 36 ;
39 [label="39: Prune (false branch) \n PRUNE((n$10 == 0), false); [line 37]\n REMOVE_TEMPS(n$10); [line 37]\n NULLIFY(&SIL_materialize_temp__n$0,false); [line 37]\n NULLIFY(&SIL_materialize_temp__n$3,false); [line 37]\n NULLIFY(&__begin,false); [line 37]\n NULLIFY(&__end,false); [line 37]\n NULLIFY(&__temp_construct_n$8,false); [line 37]\n NULLIFY(&__temp_construct_n$9,false); [line 37]\n NULLIFY(&__temp_return_n$7,false); [line 37]\n NULLIFY(&vector,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="invhouse"]
39 [label="39: Prune (false branch) \n PRUNE((n$12 == 0), false); [line 37]\n REMOVE_TEMPS(n$12); [line 37]\n NULLIFY(&SIL_materialize_temp__n$0,false); [line 37]\n NULLIFY(&SIL_materialize_temp__n$4,false); [line 37]\n NULLIFY(&__begin,false); [line 37]\n NULLIFY(&__end,false); [line 37]\n NULLIFY(&__temp_construct_n$10,false); [line 37]\n NULLIFY(&__temp_construct_n$11,false); [line 37]\n NULLIFY(&__temp_return_n$9,false); [line 37]\n NULLIFY(&vector,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="invhouse"]
39 -> 32 ;
38 [label="38: Prune (true branch) \n PRUNE((n$10 != 0), true); [line 37]\n REMOVE_TEMPS(n$10); [line 37]\n " shape="invhouse"]
38 [label="38: Prune (true branch) \n PRUNE((n$12 != 0), true); [line 37]\n REMOVE_TEMPS(n$12); [line 37]\n " shape="invhouse"]
38 -> 41 ;
37 [label="37: Call _fun_operator!= \n _fun_iterator_iterator(&__temp_construct_n$8:class iterator *,&__begin:class iterator &) [line 37]\n _fun_iterator_iterator(&__temp_construct_n$9:class iterator *,&__end:class iterator &) [line 37]\n n$10=_fun_operator!=(&__temp_construct_n$8:class iterator ,&__temp_construct_n$9:class iterator ) [line 37]\n " shape="box"]
37 [label="37: Call _fun_operator!= \n _fun_iterator_iterator(&__temp_construct_n$10:class iterator *,&__begin:class iterator &) [line 37]\n _fun_iterator_iterator(&__temp_construct_n$11:class iterator *,&__end:class iterator &) [line 37]\n n$12=_fun_operator!=(&__temp_construct_n$10:class iterator ,&__temp_construct_n$11:class iterator ) [line 37]\n " shape="box"]
37 -> 38 ;
37 -> 39 ;
36 [label="36: Call _fun_iterator_operator++ \n _fun_iterator_operator++(&__begin:class iterator &,&__temp_return_n$7:class iterator *) [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"]
36 [label="36: Call _fun_iterator_operator++ \n _fun_iterator_operator++(&__begin:class iterator &,&__temp_return_n$9:class iterator *) [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"]
36 -> 33 ;
35 [label="35: DeclStmt \n n$4=*&__range:class vec & [line 37]\n _fun_vec_begin(n$4:class vec &,&SIL_materialize_temp__n$3:class iterator *) [line 37]\n _fun_iterator_iterator(&__begin:class iterator *,&SIL_materialize_temp__n$3:class iterator &) [line 37]\n REMOVE_TEMPS(n$4); [line 37]\n " shape="box"]
35 [label="35: DeclStmt \n n$5=*&__range:class vec & [line 37]\n n$6=*n$5:class vec [line 37]\n _fun_vec_begin(n$5:class vec &,&SIL_materialize_temp__n$4:class iterator *) [line 37]\n _fun_iterator_iterator(&__begin:class iterator *,&SIL_materialize_temp__n$4:class iterator &) [line 37]\n REMOVE_TEMPS(n$5,n$6); [line 37]\n " shape="box"]
35 -> 34 ;
34 [label="34: DeclStmt \n n$1=*&__range:class vec & [line 37]\n _fun_vec_end(n$1:class vec &,&SIL_materialize_temp__n$0:class iterator *) [line 37]\n _fun_iterator_iterator(&__end:class iterator *,&SIL_materialize_temp__n$0:class iterator &) [line 37]\n REMOVE_TEMPS(n$1); [line 37]\n NULLIFY(&__range,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"]
34 [label="34: DeclStmt \n n$1=*&__range:class vec & [line 37]\n n$2=*n$1:class vec [line 37]\n _fun_vec_end(n$1:class vec &,&SIL_materialize_temp__n$0:class iterator *) [line 37]\n _fun_iterator_iterator(&__end:class iterator *,&SIL_materialize_temp__n$0:class iterator &) [line 37]\n REMOVE_TEMPS(n$1,n$2); [line 37]\n NULLIFY(&__range,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"]
34 -> 33 ;
@ -47,7 +47,7 @@ digraph iCFG {
32 [label="32: Exit test \n " color=yellow style=filled]
31 [label="31: Start test\nFormals: \nLocals: __end:class iterator SIL_materialize_temp__n$0:class iterator __begin:class iterator SIL_materialize_temp__n$3:class iterator __temp_return_n$7:class iterator __temp_construct_n$8:class iterator __temp_construct_n$9:class iterator temp:int value:int __range:class vec & vector:class vec \n DECLARE_LOCALS(&return,&__end,&SIL_materialize_temp__n$0,&__begin,&SIL_materialize_temp__n$3,&__temp_return_n$7,&__temp_construct_n$8,&__temp_construct_n$9,&temp,&value,&__range,&vector); [line 35]\n NULLIFY(&__range,false); [line 35]\n NULLIFY(&temp,false); [line 35]\n NULLIFY(&value,false); [line 35]\n " color=yellow style=filled]
31 [label="31: Start test\nFormals: \nLocals: __end:class iterator SIL_materialize_temp__n$0:class iterator __begin:class iterator SIL_materialize_temp__n$4:class iterator __temp_return_n$9:class iterator __temp_construct_n$10:class iterator __temp_construct_n$11:class iterator temp:int value:int __range:class vec & vector:class vec \n DECLARE_LOCALS(&return,&__end,&SIL_materialize_temp__n$0,&__begin,&SIL_materialize_temp__n$4,&__temp_return_n$9,&__temp_construct_n$10,&__temp_construct_n$11,&temp,&value,&__range,&vector); [line 35]\n NULLIFY(&__range,false); [line 35]\n NULLIFY(&temp,false); [line 35]\n NULLIFY(&value,false); [line 35]\n " color=yellow style=filled]
31 -> 43 ;

@ -3,23 +3,23 @@ digraph iCFG {
61 -> 56 ;
60 [label="60: DeclStmt \n n$3=_fun_X_operator int(&x:class X &) [line 64]\n *&v:int =n$3 [line 64]\n REMOVE_TEMPS(n$3); [line 64]\n " shape="box"]
60 [label="60: DeclStmt \n n$5=*&x:class X [line 64]\n n$6=_fun_X_operator int(&x:class X &) [line 64]\n *&v:int =n$6 [line 64]\n REMOVE_TEMPS(n$5,n$6); [line 64]\n " shape="box"]
60 -> 59 ;
59 [label="59: Return Stmt \n n$2=*&v:int [line 65]\n *&return:int =(1 / n$2) [line 65]\n REMOVE_TEMPS(n$2); [line 65]\n NULLIFY(&v,false); [line 65]\n NULLIFY(&x,false); [line 65]\n APPLY_ABSTRACTION; [line 65]\n " shape="box"]
59 [label="59: Return Stmt \n n$4=*&v:int [line 65]\n *&return:int =(1 / n$4) [line 65]\n REMOVE_TEMPS(n$4); [line 65]\n NULLIFY(&v,false); [line 65]\n NULLIFY(&x,false); [line 65]\n APPLY_ABSTRACTION; [line 65]\n " shape="box"]
59 -> 53 ;
58 [label="58: Prune (false branch) \n PRUNE((n$1 == 0), false); [line 63]\n REMOVE_TEMPS(n$1); [line 63]\n " shape="invhouse"]
58 [label="58: Prune (false branch) \n PRUNE((n$3 == 0), false); [line 63]\n REMOVE_TEMPS(n$2,n$3); [line 63]\n " shape="invhouse"]
58 -> 55 ;
57 [label="57: Prune (true branch) \n PRUNE((n$1 != 0), true); [line 63]\n REMOVE_TEMPS(n$1); [line 63]\n " shape="invhouse"]
57 [label="57: Prune (true branch) \n PRUNE((n$3 != 0), true); [line 63]\n REMOVE_TEMPS(n$2,n$3); [line 63]\n " shape="invhouse"]
57 -> 60 ;
56 [label="56: Call _fun_X_operator bool \n n$1=_fun_X_operator bool(&x:class X &) [line 63]\n " shape="box"]
56 [label="56: Call _fun_X_operator bool \n n$2=*&x:class X [line 63]\n n$3=_fun_X_operator bool(&x:class X &) [line 63]\n " shape="box"]
56 -> 57 ;
@ -28,7 +28,7 @@ digraph iCFG {
55 -> 54 ;
54 [label="54: Return Stmt \n n$0=_fun_X_operator int(&x:class X &) [line 67]\n *&return:int =n$0 [line 67]\n REMOVE_TEMPS(n$0); [line 67]\n NULLIFY(&x,false); [line 67]\n APPLY_ABSTRACTION; [line 67]\n " shape="box"]
54 [label="54: Return Stmt \n n$0=*&x:class X [line 67]\n n$1=_fun_X_operator int(&x:class X &) [line 67]\n *&return:int =n$1 [line 67]\n REMOVE_TEMPS(n$0,n$1); [line 67]\n NULLIFY(&x,false); [line 67]\n APPLY_ABSTRACTION; [line 67]\n " shape="box"]
54 -> 53 ;
@ -43,23 +43,23 @@ digraph iCFG {
51 -> 46 ;
50 [label="50: DeclStmt \n n$3=_fun_X_operator int(&x:class X &) [line 55]\n *&v:int =n$3 [line 55]\n REMOVE_TEMPS(n$3); [line 55]\n " shape="box"]
50 [label="50: DeclStmt \n n$5=*&x:class X [line 55]\n n$6=_fun_X_operator int(&x:class X &) [line 55]\n *&v:int =n$6 [line 55]\n REMOVE_TEMPS(n$5,n$6); [line 55]\n " shape="box"]
50 -> 49 ;
49 [label="49: Return Stmt \n n$2=*&v:int [line 56]\n *&return:int =(1 / n$2) [line 56]\n REMOVE_TEMPS(n$2); [line 56]\n NULLIFY(&v,false); [line 56]\n NULLIFY(&x,false); [line 56]\n APPLY_ABSTRACTION; [line 56]\n " shape="box"]
49 [label="49: Return Stmt \n n$4=*&v:int [line 56]\n *&return:int =(1 / n$4) [line 56]\n REMOVE_TEMPS(n$4); [line 56]\n NULLIFY(&v,false); [line 56]\n NULLIFY(&x,false); [line 56]\n APPLY_ABSTRACTION; [line 56]\n " shape="box"]
49 -> 43 ;
48 [label="48: Prune (false branch) \n PRUNE((n$1 == 0), false); [line 54]\n REMOVE_TEMPS(n$1); [line 54]\n " shape="invhouse"]
48 [label="48: Prune (false branch) \n PRUNE((n$3 == 0), false); [line 54]\n REMOVE_TEMPS(n$2,n$3); [line 54]\n " shape="invhouse"]
48 -> 45 ;
47 [label="47: Prune (true branch) \n PRUNE((n$1 != 0), true); [line 54]\n REMOVE_TEMPS(n$1); [line 54]\n " shape="invhouse"]
47 [label="47: Prune (true branch) \n PRUNE((n$3 != 0), true); [line 54]\n REMOVE_TEMPS(n$2,n$3); [line 54]\n " shape="invhouse"]
47 -> 50 ;
46 [label="46: Call _fun_X_operator bool \n n$1=_fun_X_operator bool(&x:class X &) [line 54]\n " shape="box"]
46 [label="46: Call _fun_X_operator bool \n n$2=*&x:class X [line 54]\n n$3=_fun_X_operator bool(&x:class X &) [line 54]\n " shape="box"]
46 -> 47 ;
@ -68,7 +68,7 @@ digraph iCFG {
45 -> 44 ;
44 [label="44: Return Stmt \n n$0=_fun_X_operator int(&x:class X &) [line 58]\n *&return:int =n$0 [line 58]\n REMOVE_TEMPS(n$0); [line 58]\n NULLIFY(&x,false); [line 58]\n APPLY_ABSTRACTION; [line 58]\n " shape="box"]
44 [label="44: Return Stmt \n n$0=*&x:class X [line 58]\n n$1=_fun_X_operator int(&x:class X &) [line 58]\n *&return:int =n$1 [line 58]\n REMOVE_TEMPS(n$0,n$1); [line 58]\n NULLIFY(&x,false); [line 58]\n APPLY_ABSTRACTION; [line 58]\n " shape="box"]
44 -> 43 ;
@ -91,23 +91,23 @@ digraph iCFG {
39 -> 34 ;
38 [label="38: DeclStmt \n _fun_Y_operator X(&y:class Y &,&SIL_materialize_temp__n$10:class X *) [line 46]\n _fun_X_X(&__temp_construct_n$9:class X *,&SIL_materialize_temp__n$10:class X &) [line 46]\n n$12=_fun_X_operator int(&__temp_construct_n$9:class X &) [line 46]\n *&v:int =n$12 [line 46]\n REMOVE_TEMPS(n$12); [line 46]\n " shape="box"]
38 [label="38: DeclStmt \n n$13=*&y:class Y [line 46]\n _fun_Y_operator X(&y:class Y &,&SIL_materialize_temp__n$12:class X *) [line 46]\n _fun_X_X(&__temp_construct_n$11:class X *,&SIL_materialize_temp__n$12:class X &) [line 46]\n n$15=_fun_X_operator int(&__temp_construct_n$11:class X &) [line 46]\n *&v:int =n$15 [line 46]\n REMOVE_TEMPS(n$13,n$15); [line 46]\n " shape="box"]
38 -> 37 ;
37 [label="37: Return Stmt \n n$8=*&v:int [line 47]\n *&return:int =(1 / n$8) [line 47]\n REMOVE_TEMPS(n$8); [line 47]\n NULLIFY(&v,false); [line 47]\n NULLIFY(&SIL_materialize_temp__n$1,false); [line 47]\n NULLIFY(&SIL_materialize_temp__n$10,false); [line 47]\n NULLIFY(&SIL_materialize_temp__n$5,false); [line 47]\n NULLIFY(&__temp_construct_n$0,false); [line 47]\n NULLIFY(&__temp_construct_n$4,false); [line 47]\n NULLIFY(&__temp_construct_n$9,false); [line 47]\n NULLIFY(&y,false); [line 47]\n APPLY_ABSTRACTION; [line 47]\n " shape="box"]
37 [label="37: Return Stmt \n n$10=*&v:int [line 47]\n *&return:int =(1 / n$10) [line 47]\n REMOVE_TEMPS(n$10); [line 47]\n NULLIFY(&v,false); [line 47]\n NULLIFY(&SIL_materialize_temp__n$1,false); [line 47]\n NULLIFY(&SIL_materialize_temp__n$12,false); [line 47]\n NULLIFY(&SIL_materialize_temp__n$6,false); [line 47]\n NULLIFY(&__temp_construct_n$0,false); [line 47]\n NULLIFY(&__temp_construct_n$11,false); [line 47]\n NULLIFY(&__temp_construct_n$5,false); [line 47]\n NULLIFY(&y,false); [line 47]\n APPLY_ABSTRACTION; [line 47]\n " shape="box"]
37 -> 31 ;
36 [label="36: Prune (false branch) \n PRUNE((n$7 == 0), false); [line 45]\n REMOVE_TEMPS(n$7); [line 45]\n " shape="invhouse"]
36 [label="36: Prune (false branch) \n PRUNE((n$9 == 0), false); [line 45]\n REMOVE_TEMPS(n$7,n$9); [line 45]\n " shape="invhouse"]
36 -> 33 ;
35 [label="35: Prune (true branch) \n PRUNE((n$7 != 0), true); [line 45]\n REMOVE_TEMPS(n$7); [line 45]\n " shape="invhouse"]
35 [label="35: Prune (true branch) \n PRUNE((n$9 != 0), true); [line 45]\n REMOVE_TEMPS(n$7,n$9); [line 45]\n " shape="invhouse"]
35 -> 38 ;
34 [label="34: Call _fun_X_operator bool \n _fun_Y_operator X(&y:class Y &,&SIL_materialize_temp__n$5:class X *) [line 45]\n _fun_X_X(&__temp_construct_n$4:class X *,&SIL_materialize_temp__n$5:class X &) [line 45]\n n$7=_fun_X_operator bool(&__temp_construct_n$4:class X &) [line 45]\n " shape="box"]
34 [label="34: Call _fun_X_operator bool \n n$7=*&y:class Y [line 45]\n _fun_Y_operator X(&y:class Y &,&SIL_materialize_temp__n$6:class X *) [line 45]\n _fun_X_X(&__temp_construct_n$5:class X *,&SIL_materialize_temp__n$6:class X &) [line 45]\n n$9=_fun_X_operator bool(&__temp_construct_n$5:class X &) [line 45]\n " shape="box"]
34 -> 35 ;
@ -116,14 +116,14 @@ digraph iCFG {
33 -> 32 ;
32 [label="32: Return Stmt \n _fun_Y_operator X(&y:class Y &,&SIL_materialize_temp__n$1:class X *) [line 49]\n _fun_X_X(&__temp_construct_n$0:class X *,&SIL_materialize_temp__n$1:class X &) [line 49]\n n$3=_fun_X_operator int(&__temp_construct_n$0:class X &) [line 49]\n *&return:int =n$3 [line 49]\n REMOVE_TEMPS(n$3); [line 49]\n NULLIFY(&SIL_materialize_temp__n$1,false); [line 49]\n NULLIFY(&SIL_materialize_temp__n$10,false); [line 49]\n NULLIFY(&SIL_materialize_temp__n$5,false); [line 49]\n NULLIFY(&__temp_construct_n$0,false); [line 49]\n NULLIFY(&__temp_construct_n$4,false); [line 49]\n NULLIFY(&__temp_construct_n$9,false); [line 49]\n NULLIFY(&y,false); [line 49]\n APPLY_ABSTRACTION; [line 49]\n " shape="box"]
32 [label="32: Return Stmt \n n$2=*&y:class Y [line 49]\n _fun_Y_operator X(&y:class Y &,&SIL_materialize_temp__n$1:class X *) [line 49]\n _fun_X_X(&__temp_construct_n$0:class X *,&SIL_materialize_temp__n$1:class X &) [line 49]\n n$4=_fun_X_operator int(&__temp_construct_n$0:class X &) [line 49]\n *&return:int =n$4 [line 49]\n REMOVE_TEMPS(n$2,n$4); [line 49]\n NULLIFY(&SIL_materialize_temp__n$1,false); [line 49]\n NULLIFY(&SIL_materialize_temp__n$12,false); [line 49]\n NULLIFY(&SIL_materialize_temp__n$6,false); [line 49]\n NULLIFY(&__temp_construct_n$0,false); [line 49]\n NULLIFY(&__temp_construct_n$11,false); [line 49]\n NULLIFY(&__temp_construct_n$5,false); [line 49]\n NULLIFY(&y,false); [line 49]\n APPLY_ABSTRACTION; [line 49]\n " shape="box"]
32 -> 31 ;
31 [label="31: Exit y_branch_div0 \n " color=yellow style=filled]
30 [label="30: Start y_branch_div0\nFormals: \nLocals: __temp_construct_n$0:class X SIL_materialize_temp__n$1:class X __temp_construct_n$4:class X SIL_materialize_temp__n$5:class X v:int __temp_construct_n$9:class X SIL_materialize_temp__n$10:class X y:class Y \n DECLARE_LOCALS(&return,&__temp_construct_n$0,&SIL_materialize_temp__n$1,&__temp_construct_n$4,&SIL_materialize_temp__n$5,&v,&__temp_construct_n$9,&SIL_materialize_temp__n$10,&y); [line 41]\n NULLIFY(&v,false); [line 41]\n " color=yellow style=filled]
30 [label="30: Start y_branch_div0\nFormals: \nLocals: __temp_construct_n$0:class X SIL_materialize_temp__n$1:class X __temp_construct_n$5:class X SIL_materialize_temp__n$6:class X v:int __temp_construct_n$11:class X SIL_materialize_temp__n$12:class X y:class Y \n DECLARE_LOCALS(&return,&__temp_construct_n$0,&SIL_materialize_temp__n$1,&__temp_construct_n$5,&SIL_materialize_temp__n$6,&v,&__temp_construct_n$11,&SIL_materialize_temp__n$12,&y); [line 41]\n NULLIFY(&v,false); [line 41]\n " color=yellow style=filled]
30 -> 41 ;
@ -131,23 +131,23 @@ digraph iCFG {
29 -> 24 ;
28 [label="28: DeclStmt \n n$3=_fun_X_operator int(&x:class X &) [line 35]\n *&v:int =n$3 [line 35]\n REMOVE_TEMPS(n$3); [line 35]\n " shape="box"]
28 [label="28: DeclStmt \n n$5=*&x:class X [line 35]\n n$6=_fun_X_operator int(&x:class X &) [line 35]\n *&v:int =n$6 [line 35]\n REMOVE_TEMPS(n$5,n$6); [line 35]\n " shape="box"]
28 -> 27 ;
27 [label="27: Return Stmt \n n$2=*&v:int [line 36]\n *&return:int =(1 / n$2) [line 36]\n REMOVE_TEMPS(n$2); [line 36]\n NULLIFY(&v,false); [line 36]\n NULLIFY(&x,false); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
27 [label="27: Return Stmt \n n$4=*&v:int [line 36]\n *&return:int =(1 / n$4) [line 36]\n REMOVE_TEMPS(n$4); [line 36]\n NULLIFY(&v,false); [line 36]\n NULLIFY(&x,false); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
27 -> 21 ;
26 [label="26: Prune (false branch) \n PRUNE((n$1 == 0), false); [line 34]\n REMOVE_TEMPS(n$1); [line 34]\n " shape="invhouse"]
26 [label="26: Prune (false branch) \n PRUNE((n$3 == 0), false); [line 34]\n REMOVE_TEMPS(n$2,n$3); [line 34]\n " shape="invhouse"]
26 -> 23 ;
25 [label="25: Prune (true branch) \n PRUNE((n$1 != 0), true); [line 34]\n REMOVE_TEMPS(n$1); [line 34]\n " shape="invhouse"]
25 [label="25: Prune (true branch) \n PRUNE((n$3 != 0), true); [line 34]\n REMOVE_TEMPS(n$2,n$3); [line 34]\n " shape="invhouse"]
25 -> 28 ;
24 [label="24: Call _fun_X_operator bool \n n$1=_fun_X_operator bool(&x:class X &) [line 34]\n " shape="box"]
24 [label="24: Call _fun_X_operator bool \n n$2=*&x:class X [line 34]\n n$3=_fun_X_operator bool(&x:class X &) [line 34]\n " shape="box"]
24 -> 25 ;
@ -156,7 +156,7 @@ digraph iCFG {
23 -> 22 ;
22 [label="22: Return Stmt \n n$0=_fun_X_operator int(&x:class X &) [line 38]\n *&return:int =n$0 [line 38]\n REMOVE_TEMPS(n$0); [line 38]\n NULLIFY(&x,false); [line 38]\n APPLY_ABSTRACTION; [line 38]\n " shape="box"]
22 [label="22: Return Stmt \n n$0=*&x:class X [line 38]\n n$1=_fun_X_operator int(&x:class X &) [line 38]\n *&return:int =n$1 [line 38]\n REMOVE_TEMPS(n$0,n$1); [line 38]\n NULLIFY(&x,false); [line 38]\n APPLY_ABSTRACTION; [line 38]\n " shape="box"]
22 -> 21 ;

@ -1,13 +1,13 @@
digraph iCFG {
8 [label="8: Call _fun_A_fun_default \n n$4=*&a_ptr:class A * [line 18]\n n$5=_fun_A_fun_default(n$4:class A *,1:int ,2:int ,3:int ) [line 18]\n REMOVE_TEMPS(n$4,n$5); [line 18]\n " shape="box"]
8 [label="8: Call _fun_A_fun_default \n n$6=*&a_ptr:class A * [line 18]\n n$7=*n$6:class A [line 18]\n n$8=_fun_A_fun_default(n$6:class A *,1:int ,2:int ,3:int ) [line 18]\n REMOVE_TEMPS(n$6,n$7,n$8); [line 18]\n " shape="box"]
8 -> 7 ;
7 [label="7: Call _fun_A_fun_default \n n$2=*&a_ptr:class A * [line 19]\n n$3=_fun_A_fun_default(n$2:class A *,1:int ,2:int ,20:int ) [line 19]\n REMOVE_TEMPS(n$2,n$3); [line 19]\n " shape="box"]
7 [label="7: Call _fun_A_fun_default \n n$3=*&a_ptr:class A * [line 19]\n n$4=*n$3:class A [line 19]\n n$5=_fun_A_fun_default(n$3:class A *,1:int ,2:int ,20:int ) [line 19]\n REMOVE_TEMPS(n$3,n$4,n$5); [line 19]\n " shape="box"]
7 -> 6 ;
6 [label="6: Call _fun_A_fun_default \n n$0=*&a_ptr:class A * [line 20]\n n$1=_fun_A_fun_default(n$0:class A *,1:int ,10:int ,20:int ) [line 20]\n REMOVE_TEMPS(n$0,n$1); [line 20]\n NULLIFY(&a_ptr,false); [line 20]\n APPLY_ABSTRACTION; [line 20]\n " shape="box"]
6 [label="6: Call _fun_A_fun_default \n n$0=*&a_ptr:class A * [line 20]\n n$1=*n$0:class A [line 20]\n n$2=_fun_A_fun_default(n$0:class A *,1:int ,10:int ,20:int ) [line 20]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 20]\n NULLIFY(&a_ptr,false); [line 20]\n APPLY_ABSTRACTION; [line 20]\n " shape="box"]
6 -> 5 ;

@ -1,5 +1,5 @@
digraph iCFG {
10 [label="10: Call _fun_A_method \n n$0=*&a_ptr:class A * [line 25]\n n$1=_fun_A_method(n$0:class A *) [line 25]\n REMOVE_TEMPS(n$0,n$1); [line 25]\n NULLIFY(&a_ptr,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
10 [label="10: Call _fun_A_method \n n$0=*&a_ptr:class A * [line 25]\n n$1=*n$0:class A [line 25]\n n$2=_fun_A_method(n$0:class A *) [line 25]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 25]\n NULLIFY(&a_ptr,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
10 -> 9 ;
@ -10,7 +10,7 @@ digraph iCFG {
8 -> 10 ;
7 [label="7: Call _fun_A_init \n n$2=*&this:class A * [line 19]\n _fun_A_init(n$2:class A *,10:int ) [line 19]\n REMOVE_TEMPS(n$2); [line 19]\n " shape="box"]
7 [label="7: Call _fun_A_init \n n$2=*&this:class A * [line 19]\n n$3=*n$2:class A [line 19]\n _fun_A_init(n$2:class A *,10:int ) [line 19]\n REMOVE_TEMPS(n$2,n$3); [line 19]\n " shape="box"]
7 -> 6 ;

@ -1,9 +1,9 @@
digraph iCFG {
11 [label="11: Call _fun_A_fun \n n$3=*&a_ptr:class A * [line 24]\n n$4=_fun_A_fun(n$3:class A *) [line 24]\n REMOVE_TEMPS(n$3,n$4); [line 24]\n " shape="box"]
11 [label="11: Call _fun_A_fun \n n$4=*&a_ptr:class A * [line 24]\n n$5=*n$4:class A [line 24]\n n$6=_fun_A_fun(n$4:class A *) [line 24]\n REMOVE_TEMPS(n$4,n$5,n$6); [line 24]\n " shape="box"]
11 -> 10 ;
10 [label="10: Call _fun_A::AIn_fun \n n$0=*&a_ptr:class A * [line 25]\n n$1=*n$0.in:class A::AIn * [line 25]\n n$2=_fun_A::AIn_fun(n$1:class A::AIn *) [line 25]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 25]\n NULLIFY(&a_ptr,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
10 [label="10: Call _fun_A::AIn_fun \n n$0=*&a_ptr:class A * [line 25]\n n$1=*n$0.in:class A::AIn * [line 25]\n n$2=*n$1:class A::AIn [line 25]\n n$3=_fun_A::AIn_fun(n$1:class A::AIn *) [line 25]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 25]\n NULLIFY(&a_ptr,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
10 -> 9 ;

@ -1,9 +1,9 @@
digraph iCFG {
10 [label="10: Call _fun_A_fun \n n$2=*&a_ptr:class A * [line 22]\n n$3=_fun_A_fun(n$2:class A *,1:int ,2:int ) [line 22]\n REMOVE_TEMPS(n$2,n$3); [line 22]\n " shape="box"]
10 [label="10: Call _fun_A_fun \n n$3=*&a_ptr:class A * [line 22]\n n$4=*n$3:class A [line 22]\n n$5=_fun_A_fun(n$3:class A *,1:int ,2:int ) [line 22]\n REMOVE_TEMPS(n$3,n$4,n$5); [line 22]\n " shape="box"]
10 -> 9 ;
9 [label="9: Call _fun_A_fun \n n$0=*&a_ptr:class A * [line 23]\n n$1=_fun_A_fun(n$0:class A *,1:int ,2:int ,3:int ) [line 23]\n REMOVE_TEMPS(n$0,n$1); [line 23]\n NULLIFY(&a_ptr,false); [line 23]\n APPLY_ABSTRACTION; [line 23]\n " shape="box"]
9 [label="9: Call _fun_A_fun \n n$0=*&a_ptr:class A * [line 23]\n n$1=*n$0:class A [line 23]\n n$2=_fun_A_fun(n$0:class A *,1:int ,2:int ,3:int ) [line 23]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 23]\n NULLIFY(&a_ptr,false); [line 23]\n APPLY_ABSTRACTION; [line 23]\n " shape="box"]
9 -> 8 ;

@ -1,5 +1,5 @@
digraph iCFG {
13 [label="13: DeclStmt \n n$2=*&a:class A * [line 22]\n _fun_A_get(n$2:class A *,1:int ,&SIL_materialize_temp__n$1:class X *) [line 22]\n _fun_X_X(&x:class X *,&SIL_materialize_temp__n$1:class X &) [line 22]\n REMOVE_TEMPS(n$2); [line 22]\n NULLIFY(&a,false); [line 22]\n " shape="box"]
13 [label="13: DeclStmt \n n$2=*&a:class A * [line 22]\n n$3=*n$2:class A [line 22]\n _fun_A_get(n$2:class A *,1:int ,&SIL_materialize_temp__n$1:class X *) [line 22]\n _fun_X_X(&x:class X *,&SIL_materialize_temp__n$1:class X &) [line 22]\n REMOVE_TEMPS(n$2,n$3); [line 22]\n NULLIFY(&a,false); [line 22]\n " shape="box"]
13 -> 12 ;

@ -1,9 +1,9 @@
digraph iCFG {
53 [label="53: DeclStmt \n n$1=_fun___new(sizeof(class Triangle ):unsigned long ) [line 71]\n *&trgl:class Triangle *=n$1 [line 71]\n REMOVE_TEMPS(n$1); [line 71]\n " shape="box"]
53 [label="53: DeclStmt \n n$2=_fun___new(sizeof(class Triangle ):unsigned long ) [line 71]\n *&trgl:class Triangle *=n$2 [line 71]\n REMOVE_TEMPS(n$2); [line 71]\n " shape="box"]
53 -> 52 ;
52 [label="52: Call delete \n n$0=*&trgl:class Polygon * [line 72]\n _fun_Polygon_~Polygon(n$0:class Polygon *) virtual [line 72]\n _fun___delete(n$0:class Polygon *) [line 72]\n REMOVE_TEMPS(n$0); [line 72]\n NULLIFY(&trgl,false); [line 72]\n APPLY_ABSTRACTION; [line 72]\n " shape="box"]
52 [label="52: Call delete \n n$0=*&trgl:class Polygon * [line 72]\n n$1=*n$0:class Polygon [line 72]\n _fun_Polygon_~Polygon(n$0:class Polygon *) virtual [line 72]\n _fun___delete(n$0:class Polygon *) [line 72]\n REMOVE_TEMPS(n$0,n$1); [line 72]\n NULLIFY(&trgl,false); [line 72]\n APPLY_ABSTRACTION; [line 72]\n " shape="box"]
52 -> 51 ;
@ -26,11 +26,11 @@ digraph iCFG {
47 -> 46 ;
46 [label="46: Call _fun_Polygon_set_values \n n$2=*&ppoly2:class Polygon * [line 63]\n _fun_Polygon_set_values(n$2:class Polygon *,4:int ,5:int ) [line 63]\n REMOVE_TEMPS(n$2); [line 63]\n " shape="box"]
46 [label="46: Call _fun_Polygon_set_values \n n$3=*&ppoly2:class Polygon * [line 63]\n n$4=*n$3:class Polygon [line 63]\n _fun_Polygon_set_values(n$3:class Polygon *,4:int ,5:int ) [line 63]\n REMOVE_TEMPS(n$3,n$4); [line 63]\n " shape="box"]
46 -> 45 ;
45 [label="45: Return Stmt \n n$0=*&ppoly2:class Polygon * [line 64]\n n$1=_fun_Polygon_area(n$0:class Polygon *) [line 64]\n *&return:int =(1 / n$1) [line 64]\n REMOVE_TEMPS(n$0,n$1); [line 64]\n NULLIFY(&ppoly2,false); [line 64]\n NULLIFY(&poly,false); [line 64]\n NULLIFY(&trgl,false); [line 64]\n APPLY_ABSTRACTION; [line 64]\n " shape="box"]
45 [label="45: Return Stmt \n n$0=*&ppoly2:class Polygon * [line 64]\n n$1=*n$0:class Polygon [line 64]\n n$2=_fun_Polygon_area(n$0:class Polygon *) [line 64]\n *&return:int =(1 / n$2) [line 64]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 64]\n NULLIFY(&ppoly2,false); [line 64]\n NULLIFY(&poly,false); [line 64]\n NULLIFY(&trgl,false); [line 64]\n APPLY_ABSTRACTION; [line 64]\n " shape="box"]
45 -> 44 ;
@ -49,7 +49,7 @@ digraph iCFG {
41 -> 40 ;
40 [label="40: Return Stmt \n n$0=*&ppoly3:class Polygon * [line 56]\n n$1=_fun_Polygon_area(n$0:class Polygon *) virtual [line 56]\n *&return:int =(1 / n$1) [line 56]\n REMOVE_TEMPS(n$0,n$1); [line 56]\n NULLIFY(&ppoly3,false); [line 56]\n NULLIFY(&poly,false); [line 56]\n APPLY_ABSTRACTION; [line 56]\n " shape="box"]
40 [label="40: Return Stmt \n n$0=*&ppoly3:class Polygon * [line 56]\n n$1=*n$0:class Polygon [line 56]\n n$2=_fun_Polygon_area(n$0:class Polygon *) virtual [line 56]\n *&return:int =(1 / n$2) [line 56]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 56]\n NULLIFY(&ppoly3,false); [line 56]\n NULLIFY(&poly,false); [line 56]\n APPLY_ABSTRACTION; [line 56]\n " shape="box"]
40 -> 39 ;
@ -72,11 +72,11 @@ digraph iCFG {
35 -> 34 ;
34 [label="34: Call _fun_Polygon_set_values \n n$2=*&ppoly2:class Polygon * [line 49]\n _fun_Polygon_set_values(n$2:class Polygon *,4:int ,5:int ) [line 49]\n REMOVE_TEMPS(n$2); [line 49]\n " shape="box"]
34 [label="34: Call _fun_Polygon_set_values \n n$3=*&ppoly2:class Polygon * [line 49]\n n$4=*n$3:class Polygon [line 49]\n _fun_Polygon_set_values(n$3:class Polygon *,4:int ,5:int ) [line 49]\n REMOVE_TEMPS(n$3,n$4); [line 49]\n " shape="box"]
34 -> 33 ;
33 [label="33: Return Stmt \n n$0=*&ppoly2:class Polygon * [line 50]\n n$1=_fun_Polygon_area(n$0:class Polygon *) virtual [line 50]\n *&return:int =(1 / (n$1 - 10)) [line 50]\n REMOVE_TEMPS(n$0,n$1); [line 50]\n NULLIFY(&ppoly2,false); [line 50]\n NULLIFY(&poly,false); [line 50]\n NULLIFY(&trgl,false); [line 50]\n APPLY_ABSTRACTION; [line 50]\n " shape="box"]
33 [label="33: Return Stmt \n n$0=*&ppoly2:class Polygon * [line 50]\n n$1=*n$0:class Polygon [line 50]\n n$2=_fun_Polygon_area(n$0:class Polygon *) virtual [line 50]\n *&return:int =(1 / (n$2 - 10)) [line 50]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 50]\n NULLIFY(&ppoly2,false); [line 50]\n NULLIFY(&poly,false); [line 50]\n NULLIFY(&trgl,false); [line 50]\n APPLY_ABSTRACTION; [line 50]\n " shape="box"]
33 -> 32 ;
@ -95,11 +95,11 @@ digraph iCFG {
29 -> 28 ;
28 [label="28: Call _fun_Polygon_set_values \n n$2=*&ppoly1:class Polygon * [line 41]\n _fun_Polygon_set_values(n$2:class Polygon *,4:int ,5:int ) [line 41]\n REMOVE_TEMPS(n$2); [line 41]\n " shape="box"]
28 [label="28: Call _fun_Polygon_set_values \n n$3=*&ppoly1:class Polygon * [line 41]\n n$4=*n$3:class Polygon [line 41]\n _fun_Polygon_set_values(n$3:class Polygon *,4:int ,5:int ) [line 41]\n REMOVE_TEMPS(n$3,n$4); [line 41]\n " shape="box"]
28 -> 27 ;
27 [label="27: Return Stmt \n n$0=*&ppoly1:class Polygon * [line 42]\n n$1=_fun_Polygon_area(n$0:class Polygon *) virtual [line 42]\n *&return:int =(1 / (n$1 - 20)) [line 42]\n REMOVE_TEMPS(n$0,n$1); [line 42]\n NULLIFY(&ppoly1,false); [line 42]\n NULLIFY(&rect,false); [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"]
27 [label="27: Return Stmt \n n$0=*&ppoly1:class Polygon * [line 42]\n n$1=*n$0:class Polygon [line 42]\n n$2=_fun_Polygon_area(n$0:class Polygon *) virtual [line 42]\n *&return:int =(1 / (n$2 - 20)) [line 42]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 42]\n NULLIFY(&ppoly1,false); [line 42]\n NULLIFY(&rect,false); [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"]
27 -> 26 ;

@ -7,7 +7,7 @@ digraph iCFG {
23 -> 22 ;
22 [label="22: Call _fun_bar::Rectangle_set_values \n _fun_bar::Rectangle_set_values(&rect1:class bar::Rectangle &,3:int ,4:int ) [line 49]\n " shape="box"]
22 [label="22: Call _fun_bar::Rectangle_set_values \n n$4=*&rect1:class bar::Rectangle [line 49]\n _fun_bar::Rectangle_set_values(&rect1:class bar::Rectangle &,3:int ,4:int ) [line 49]\n REMOVE_TEMPS(n$4); [line 49]\n " shape="box"]
22 -> 21 ;
@ -15,7 +15,7 @@ digraph iCFG {
21 -> 20 ;
20 [label="20: Call _fun_foo::Rectangle_set_values \n _fun_foo::Rectangle_set_values(&rect2:class foo::Rectangle &,7:int ,10:int ) [line 52]\n " shape="box"]
20 [label="20: Call _fun_foo::Rectangle_set_values \n n$3=*&rect2:class foo::Rectangle [line 52]\n _fun_foo::Rectangle_set_values(&rect2:class foo::Rectangle &,7:int ,10:int ) [line 52]\n REMOVE_TEMPS(n$3); [line 52]\n " shape="box"]
20 -> 19 ;

@ -1,9 +1,9 @@
digraph iCFG {
11 [label="11: DeclStmt \n n$2=*&x:class X * [line 21]\n n$3=*n$2.f:int [line 21]\n *&f:int =n$3 [line 21]\n REMOVE_TEMPS(n$2,n$3); [line 21]\n NULLIFY(&f,false); [line 21]\n " shape="box"]
11 [label="11: DeclStmt \n n$3=*&x:class X * [line 21]\n n$4=*n$3.f:int [line 21]\n *&f:int =n$4 [line 21]\n REMOVE_TEMPS(n$3,n$4); [line 21]\n NULLIFY(&f,false); [line 21]\n " shape="box"]
11 -> 10 ;
10 [label="10: DeclStmt \n n$0=*&x:class X * [line 22]\n n$1=_fun_X_call(n$0:class X *) [line 22]\n *&c:int =n$1 [line 22]\n REMOVE_TEMPS(n$0,n$1); [line 22]\n NULLIFY(&c,false); [line 22]\n NULLIFY(&x,false); [line 22]\n APPLY_ABSTRACTION; [line 22]\n " shape="box"]
10 [label="10: DeclStmt \n n$0=*&x:class X * [line 22]\n n$1=*n$0:class X [line 22]\n n$2=_fun_X_call(n$0:class X *) [line 22]\n *&c:int =n$2 [line 22]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 22]\n NULLIFY(&c,false); [line 22]\n NULLIFY(&x,false); [line 22]\n APPLY_ABSTRACTION; [line 22]\n " shape="box"]
10 -> 9 ;
@ -14,11 +14,11 @@ digraph iCFG {
8 -> 11 ;
7 [label="7: DeclStmt \n n$2=*&x:class X & [line 16]\n n$3=*n$2.f:int [line 16]\n *&f:int =n$3 [line 16]\n REMOVE_TEMPS(n$2,n$3); [line 16]\n NULLIFY(&f,false); [line 16]\n " shape="box"]
7 [label="7: DeclStmt \n n$3=*&x:class X & [line 16]\n n$4=*n$3.f:int [line 16]\n *&f:int =n$4 [line 16]\n REMOVE_TEMPS(n$3,n$4); [line 16]\n NULLIFY(&f,false); [line 16]\n " shape="box"]
7 -> 6 ;
6 [label="6: DeclStmt \n n$0=*&x:class X & [line 17]\n n$1=_fun_X_call(n$0:class X &) [line 17]\n *&c:int =n$1 [line 17]\n REMOVE_TEMPS(n$0,n$1); [line 17]\n NULLIFY(&c,false); [line 17]\n NULLIFY(&x,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
6 [label="6: DeclStmt \n n$0=*&x:class X & [line 17]\n n$1=*n$0:class X [line 17]\n n$2=_fun_X_call(n$0:class X &) [line 17]\n *&c:int =n$2 [line 17]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 17]\n NULLIFY(&c,false); [line 17]\n NULLIFY(&x,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
6 -> 5 ;

@ -1,9 +1,9 @@
digraph iCFG {
19 [label="19: DeclStmt \n n$2=_fun_get_ptr() [line 25]\n n$3=*n$2.f:int [line 25]\n *&f:int =n$3 [line 25]\n REMOVE_TEMPS(n$2,n$3); [line 25]\n NULLIFY(&f,false); [line 25]\n " shape="box"]
19 [label="19: DeclStmt \n n$3=_fun_get_ptr() [line 25]\n n$4=*n$3.f:int [line 25]\n *&f:int =n$4 [line 25]\n REMOVE_TEMPS(n$3,n$4); [line 25]\n NULLIFY(&f,false); [line 25]\n " shape="box"]
19 -> 18 ;
18 [label="18: DeclStmt \n n$0=_fun_get_ptr() [line 26]\n n$1=_fun_X_call(n$0:class X *) [line 26]\n *&c:int =n$1 [line 26]\n REMOVE_TEMPS(n$0,n$1); [line 26]\n NULLIFY(&c,false); [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
18 [label="18: DeclStmt \n n$0=_fun_get_ptr() [line 26]\n n$1=*n$0:class X [line 26]\n n$2=_fun_X_call(n$0:class X *) [line 26]\n *&c:int =n$2 [line 26]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 26]\n NULLIFY(&c,false); [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
18 -> 17 ;
@ -14,11 +14,11 @@ digraph iCFG {
16 -> 19 ;
15 [label="15: DeclStmt \n n$2=_fun_get_ref() [line 20]\n n$3=*n$2.f:int [line 20]\n *&f:int =n$3 [line 20]\n REMOVE_TEMPS(n$2,n$3); [line 20]\n NULLIFY(&f,false); [line 20]\n " shape="box"]
15 [label="15: DeclStmt \n n$3=_fun_get_ref() [line 20]\n n$4=*n$3.f:int [line 20]\n *&f:int =n$4 [line 20]\n REMOVE_TEMPS(n$3,n$4); [line 20]\n NULLIFY(&f,false); [line 20]\n " shape="box"]
15 -> 14 ;
14 [label="14: DeclStmt \n n$0=_fun_get_ref() [line 21]\n n$1=_fun_X_call(n$0:class X &) [line 21]\n *&c:int =n$1 [line 21]\n REMOVE_TEMPS(n$0,n$1); [line 21]\n NULLIFY(&c,false); [line 21]\n APPLY_ABSTRACTION; [line 21]\n " shape="box"]
14 [label="14: DeclStmt \n n$0=_fun_get_ref() [line 21]\n n$1=*n$0:class X [line 21]\n n$2=_fun_X_call(n$0:class X &) [line 21]\n *&c:int =n$2 [line 21]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 21]\n NULLIFY(&c,false); [line 21]\n APPLY_ABSTRACTION; [line 21]\n " shape="box"]
14 -> 13 ;

@ -1,13 +1,13 @@
digraph iCFG {
119 [label="119: Call _fun_X_zero \n n$3=_fun_get_global_ref() [line 124]\n _fun_X_zero(n$3:class X &) [line 124]\n REMOVE_TEMPS(n$3); [line 124]\n " shape="box"]
119 [label="119: Call _fun_X_zero \n n$4=_fun_get_global_ref() [line 124]\n n$5=*n$4:class X [line 124]\n _fun_X_zero(n$4:class X &) [line 124]\n REMOVE_TEMPS(n$4,n$5); [line 124]\n " shape="box"]
119 -> 118 ;
118 [label="118: BinaryOperatorStmt: Assign \n n$2=_fun_get_global_ref() [line 125]\n *n$2.f:int =1 [line 125]\n REMOVE_TEMPS(n$2); [line 125]\n " shape="box"]
118 [label="118: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ref() [line 125]\n *n$3.f:int =1 [line 125]\n REMOVE_TEMPS(n$3); [line 125]\n " shape="box"]
118 -> 117 ;
117 [label="117: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 126]\n n$1=_fun_X_div(n$0:class X &) [line 126]\n REMOVE_TEMPS(n$0,n$1); [line 126]\n APPLY_ABSTRACTION; [line 126]\n " shape="box"]
117 [label="117: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 126]\n n$1=*n$0:class X [line 126]\n n$2=_fun_X_div(n$0:class X &) [line 126]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 126]\n APPLY_ABSTRACTION; [line 126]\n " shape="box"]
117 -> 116 ;
@ -18,15 +18,15 @@ digraph iCFG {
115 -> 119 ;
114 [label="114: Call _fun_X_nonzero \n n$3=_fun_get_global_ref() [line 118]\n _fun_X_nonzero(n$3:class X &) [line 118]\n REMOVE_TEMPS(n$3); [line 118]\n " shape="box"]
114 [label="114: Call _fun_X_nonzero \n n$4=_fun_get_global_ref() [line 118]\n n$5=*n$4:class X [line 118]\n _fun_X_nonzero(n$4:class X &) [line 118]\n REMOVE_TEMPS(n$4,n$5); [line 118]\n " shape="box"]
114 -> 113 ;
113 [label="113: BinaryOperatorStmt: Assign \n n$2=_fun_get_global_ref() [line 119]\n *n$2.f:int =0 [line 119]\n REMOVE_TEMPS(n$2); [line 119]\n " shape="box"]
113 [label="113: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ref() [line 119]\n *n$3.f:int =0 [line 119]\n REMOVE_TEMPS(n$3); [line 119]\n " shape="box"]
113 -> 112 ;
112 [label="112: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 120]\n n$1=_fun_X_div(n$0:class X &) [line 120]\n REMOVE_TEMPS(n$0,n$1); [line 120]\n APPLY_ABSTRACTION; [line 120]\n " shape="box"]
112 [label="112: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 120]\n n$1=*n$0:class X [line 120]\n n$2=_fun_X_div(n$0:class X &) [line 120]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 120]\n APPLY_ABSTRACTION; [line 120]\n " shape="box"]
112 -> 111 ;
@ -37,15 +37,15 @@ digraph iCFG {
110 -> 114 ;
109 [label="109: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ref() [line 112]\n *n$3.f:int =0 [line 112]\n REMOVE_TEMPS(n$3); [line 112]\n " shape="box"]
109 [label="109: BinaryOperatorStmt: Assign \n n$5=_fun_get_global_ref() [line 112]\n *n$5.f:int =0 [line 112]\n REMOVE_TEMPS(n$5); [line 112]\n " shape="box"]
109 -> 108 ;
108 [label="108: Call _fun_X_nonzero \n n$2=_fun_get_global_ref() [line 113]\n _fun_X_nonzero(n$2:class X &) [line 113]\n REMOVE_TEMPS(n$2); [line 113]\n " shape="box"]
108 [label="108: Call _fun_X_nonzero \n n$3=_fun_get_global_ref() [line 113]\n n$4=*n$3:class X [line 113]\n _fun_X_nonzero(n$3:class X &) [line 113]\n REMOVE_TEMPS(n$3,n$4); [line 113]\n " shape="box"]
108 -> 107 ;
107 [label="107: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 114]\n n$1=_fun_X_div(n$0:class X &) [line 114]\n REMOVE_TEMPS(n$0,n$1); [line 114]\n APPLY_ABSTRACTION; [line 114]\n " shape="box"]
107 [label="107: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 114]\n n$1=*n$0:class X [line 114]\n n$2=_fun_X_div(n$0:class X &) [line 114]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 114]\n APPLY_ABSTRACTION; [line 114]\n " shape="box"]
107 -> 106 ;
@ -56,15 +56,15 @@ digraph iCFG {
105 -> 109 ;
104 [label="104: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ref() [line 106]\n *n$3.f:int =1 [line 106]\n REMOVE_TEMPS(n$3); [line 106]\n " shape="box"]
104 [label="104: BinaryOperatorStmt: Assign \n n$5=_fun_get_global_ref() [line 106]\n *n$5.f:int =1 [line 106]\n REMOVE_TEMPS(n$5); [line 106]\n " shape="box"]
104 -> 103 ;
103 [label="103: Call _fun_X_zero \n n$2=_fun_get_global_ref() [line 107]\n _fun_X_zero(n$2:class X &) [line 107]\n REMOVE_TEMPS(n$2); [line 107]\n " shape="box"]
103 [label="103: Call _fun_X_zero \n n$3=_fun_get_global_ref() [line 107]\n n$4=*n$3:class X [line 107]\n _fun_X_zero(n$3:class X &) [line 107]\n REMOVE_TEMPS(n$3,n$4); [line 107]\n " shape="box"]
103 -> 102 ;
102 [label="102: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 108]\n n$1=_fun_X_div(n$0:class X &) [line 108]\n REMOVE_TEMPS(n$0,n$1); [line 108]\n APPLY_ABSTRACTION; [line 108]\n " shape="box"]
102 [label="102: Call _fun_X_div \n n$0=_fun_get_global_ref() [line 108]\n n$1=*n$0:class X [line 108]\n n$2=_fun_X_div(n$0:class X &) [line 108]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 108]\n APPLY_ABSTRACTION; [line 108]\n " shape="box"]
102 -> 101 ;
@ -75,11 +75,11 @@ digraph iCFG {
100 -> 104 ;
99 [label="99: Call _fun_set_field_ref \n n$2=*&x:class X & [line 101]\n _fun_set_field_ref(n$2:class X &,1:int ) [line 101]\n REMOVE_TEMPS(n$2); [line 101]\n " shape="box"]
99 [label="99: Call _fun_set_field_ref \n n$3=*&x:class X & [line 101]\n _fun_set_field_ref(n$3:class X &,1:int ) [line 101]\n REMOVE_TEMPS(n$3); [line 101]\n " shape="box"]
99 -> 98 ;
98 [label="98: Return Stmt \n n$0=*&x:class X & [line 102]\n n$1=_fun_X_div(n$0:class X &) [line 102]\n *&return:int =n$1 [line 102]\n REMOVE_TEMPS(n$0,n$1); [line 102]\n NULLIFY(&x,false); [line 102]\n APPLY_ABSTRACTION; [line 102]\n " shape="box"]
98 [label="98: Return Stmt \n n$0=*&x:class X & [line 102]\n n$1=*n$0:class X [line 102]\n n$2=_fun_X_div(n$0:class X &) [line 102]\n *&return:int =n$2 [line 102]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 102]\n NULLIFY(&x,false); [line 102]\n APPLY_ABSTRACTION; [line 102]\n " shape="box"]
98 -> 97 ;
@ -90,11 +90,11 @@ digraph iCFG {
96 -> 99 ;
95 [label="95: Call _fun_set_field_ref \n n$2=*&x:class X & [line 96]\n _fun_set_field_ref(n$2:class X &,0:int ) [line 96]\n REMOVE_TEMPS(n$2); [line 96]\n " shape="box"]
95 [label="95: Call _fun_set_field_ref \n n$3=*&x:class X & [line 96]\n _fun_set_field_ref(n$3:class X &,0:int ) [line 96]\n REMOVE_TEMPS(n$3); [line 96]\n " shape="box"]
95 -> 94 ;
94 [label="94: Return Stmt \n n$0=*&x:class X & [line 97]\n n$1=_fun_X_div(n$0:class X &) [line 97]\n *&return:int =n$1 [line 97]\n REMOVE_TEMPS(n$0,n$1); [line 97]\n NULLIFY(&x,false); [line 97]\n APPLY_ABSTRACTION; [line 97]\n " shape="box"]
94 [label="94: Return Stmt \n n$0=*&x:class X & [line 97]\n n$1=*n$0:class X [line 97]\n n$2=_fun_X_div(n$0:class X &) [line 97]\n *&return:int =n$2 [line 97]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 97]\n NULLIFY(&x,false); [line 97]\n APPLY_ABSTRACTION; [line 97]\n " shape="box"]
94 -> 93 ;
@ -105,11 +105,11 @@ digraph iCFG {
92 -> 95 ;
91 [label="91: Call _fun_nonzero_ref \n n$2=*&x:class X & [line 91]\n _fun_nonzero_ref(n$2:class X &) [line 91]\n REMOVE_TEMPS(n$2); [line 91]\n " shape="box"]
91 [label="91: Call _fun_nonzero_ref \n n$3=*&x:class X & [line 91]\n _fun_nonzero_ref(n$3:class X &) [line 91]\n REMOVE_TEMPS(n$3); [line 91]\n " shape="box"]
91 -> 90 ;
90 [label="90: Return Stmt \n n$0=*&x:class X & [line 92]\n n$1=_fun_X_div(n$0:class X &) [line 92]\n *&return:int =n$1 [line 92]\n REMOVE_TEMPS(n$0,n$1); [line 92]\n NULLIFY(&x,false); [line 92]\n APPLY_ABSTRACTION; [line 92]\n " shape="box"]
90 [label="90: Return Stmt \n n$0=*&x:class X & [line 92]\n n$1=*n$0:class X [line 92]\n n$2=_fun_X_div(n$0:class X &) [line 92]\n *&return:int =n$2 [line 92]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 92]\n NULLIFY(&x,false); [line 92]\n APPLY_ABSTRACTION; [line 92]\n " shape="box"]
90 -> 89 ;
@ -120,11 +120,11 @@ digraph iCFG {
88 -> 91 ;
87 [label="87: Call _fun_zero_ref \n n$2=*&x:class X & [line 86]\n _fun_zero_ref(n$2:class X &) [line 86]\n REMOVE_TEMPS(n$2); [line 86]\n " shape="box"]
87 [label="87: Call _fun_zero_ref \n n$3=*&x:class X & [line 86]\n _fun_zero_ref(n$3:class X &) [line 86]\n REMOVE_TEMPS(n$3); [line 86]\n " shape="box"]
87 -> 86 ;
86 [label="86: Return Stmt \n n$0=*&x:class X & [line 87]\n n$1=_fun_X_div(n$0:class X &) [line 87]\n *&return:int =n$1 [line 87]\n REMOVE_TEMPS(n$0,n$1); [line 87]\n NULLIFY(&x,false); [line 87]\n APPLY_ABSTRACTION; [line 87]\n " shape="box"]
86 [label="86: Return Stmt \n n$0=*&x:class X & [line 87]\n n$1=*n$0:class X [line 87]\n n$2=_fun_X_div(n$0:class X &) [line 87]\n *&return:int =n$2 [line 87]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 87]\n NULLIFY(&x,false); [line 87]\n APPLY_ABSTRACTION; [line 87]\n " shape="box"]
86 -> 85 ;
@ -135,15 +135,15 @@ digraph iCFG {
84 -> 87 ;
83 [label="83: Call _fun_X_zero \n n$3=_fun_get_global_ptr() [line 80]\n _fun_X_zero(n$3:class X *) [line 80]\n REMOVE_TEMPS(n$3); [line 80]\n " shape="box"]
83 [label="83: Call _fun_X_zero \n n$4=_fun_get_global_ptr() [line 80]\n n$5=*n$4:class X [line 80]\n _fun_X_zero(n$4:class X *) [line 80]\n REMOVE_TEMPS(n$4,n$5); [line 80]\n " shape="box"]
83 -> 82 ;
82 [label="82: BinaryOperatorStmt: Assign \n n$2=_fun_get_global_ptr() [line 81]\n *n$2.f:int =1 [line 81]\n REMOVE_TEMPS(n$2); [line 81]\n " shape="box"]
82 [label="82: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ptr() [line 81]\n *n$3.f:int =1 [line 81]\n REMOVE_TEMPS(n$3); [line 81]\n " shape="box"]
82 -> 81 ;
81 [label="81: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 82]\n n$1=_fun_X_div(n$0:class X *) [line 82]\n REMOVE_TEMPS(n$0,n$1); [line 82]\n APPLY_ABSTRACTION; [line 82]\n " shape="box"]
81 [label="81: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 82]\n n$1=*n$0:class X [line 82]\n n$2=_fun_X_div(n$0:class X *) [line 82]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 82]\n APPLY_ABSTRACTION; [line 82]\n " shape="box"]
81 -> 80 ;
@ -154,15 +154,15 @@ digraph iCFG {
79 -> 83 ;
78 [label="78: Call _fun_X_nonzero \n n$3=_fun_get_global_ptr() [line 74]\n _fun_X_nonzero(n$3:class X *) [line 74]\n REMOVE_TEMPS(n$3); [line 74]\n " shape="box"]
78 [label="78: Call _fun_X_nonzero \n n$4=_fun_get_global_ptr() [line 74]\n n$5=*n$4:class X [line 74]\n _fun_X_nonzero(n$4:class X *) [line 74]\n REMOVE_TEMPS(n$4,n$5); [line 74]\n " shape="box"]
78 -> 77 ;
77 [label="77: BinaryOperatorStmt: Assign \n n$2=_fun_get_global_ptr() [line 75]\n *n$2.f:int =0 [line 75]\n REMOVE_TEMPS(n$2); [line 75]\n " shape="box"]
77 [label="77: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ptr() [line 75]\n *n$3.f:int =0 [line 75]\n REMOVE_TEMPS(n$3); [line 75]\n " shape="box"]
77 -> 76 ;
76 [label="76: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 76]\n n$1=_fun_X_div(n$0:class X *) [line 76]\n REMOVE_TEMPS(n$0,n$1); [line 76]\n APPLY_ABSTRACTION; [line 76]\n " shape="box"]
76 [label="76: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 76]\n n$1=*n$0:class X [line 76]\n n$2=_fun_X_div(n$0:class X *) [line 76]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 76]\n APPLY_ABSTRACTION; [line 76]\n " shape="box"]
76 -> 75 ;
@ -173,15 +173,15 @@ digraph iCFG {
74 -> 78 ;
73 [label="73: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ptr() [line 68]\n *n$3.f:int =0 [line 68]\n REMOVE_TEMPS(n$3); [line 68]\n " shape="box"]
73 [label="73: BinaryOperatorStmt: Assign \n n$5=_fun_get_global_ptr() [line 68]\n *n$5.f:int =0 [line 68]\n REMOVE_TEMPS(n$5); [line 68]\n " shape="box"]
73 -> 72 ;
72 [label="72: Call _fun_X_nonzero \n n$2=_fun_get_global_ptr() [line 69]\n _fun_X_nonzero(n$2:class X *) [line 69]\n REMOVE_TEMPS(n$2); [line 69]\n " shape="box"]
72 [label="72: Call _fun_X_nonzero \n n$3=_fun_get_global_ptr() [line 69]\n n$4=*n$3:class X [line 69]\n _fun_X_nonzero(n$3:class X *) [line 69]\n REMOVE_TEMPS(n$3,n$4); [line 69]\n " shape="box"]
72 -> 71 ;
71 [label="71: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 70]\n n$1=_fun_X_div(n$0:class X *) [line 70]\n REMOVE_TEMPS(n$0,n$1); [line 70]\n APPLY_ABSTRACTION; [line 70]\n " shape="box"]
71 [label="71: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 70]\n n$1=*n$0:class X [line 70]\n n$2=_fun_X_div(n$0:class X *) [line 70]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 70]\n APPLY_ABSTRACTION; [line 70]\n " shape="box"]
71 -> 70 ;
@ -192,15 +192,15 @@ digraph iCFG {
69 -> 73 ;
68 [label="68: BinaryOperatorStmt: Assign \n n$3=_fun_get_global_ptr() [line 62]\n *n$3.f:int =1 [line 62]\n REMOVE_TEMPS(n$3); [line 62]\n " shape="box"]
68 [label="68: BinaryOperatorStmt: Assign \n n$5=_fun_get_global_ptr() [line 62]\n *n$5.f:int =1 [line 62]\n REMOVE_TEMPS(n$5); [line 62]\n " shape="box"]
68 -> 67 ;
67 [label="67: Call _fun_X_zero \n n$2=_fun_get_global_ptr() [line 63]\n _fun_X_zero(n$2:class X *) [line 63]\n REMOVE_TEMPS(n$2); [line 63]\n " shape="box"]
67 [label="67: Call _fun_X_zero \n n$3=_fun_get_global_ptr() [line 63]\n n$4=*n$3:class X [line 63]\n _fun_X_zero(n$3:class X *) [line 63]\n REMOVE_TEMPS(n$3,n$4); [line 63]\n " shape="box"]
67 -> 66 ;
66 [label="66: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 64]\n n$1=_fun_X_div(n$0:class X *) [line 64]\n REMOVE_TEMPS(n$0,n$1); [line 64]\n APPLY_ABSTRACTION; [line 64]\n " shape="box"]
66 [label="66: Call _fun_X_div \n n$0=_fun_get_global_ptr() [line 64]\n n$1=*n$0:class X [line 64]\n n$2=_fun_X_div(n$0:class X *) [line 64]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 64]\n APPLY_ABSTRACTION; [line 64]\n " shape="box"]
66 -> 65 ;
@ -211,11 +211,11 @@ digraph iCFG {
64 -> 68 ;
63 [label="63: Call _fun_set_field_ptr \n n$3=*&x:class X * [line 56]\n _fun_set_field_ptr(n$3:class X *,1:int ) [line 56]\n REMOVE_TEMPS(n$3); [line 56]\n " shape="box"]
63 [label="63: Call _fun_set_field_ptr \n n$4=*&x:class X * [line 56]\n _fun_set_field_ptr(n$4:class X *,1:int ) [line 56]\n REMOVE_TEMPS(n$4); [line 56]\n " shape="box"]
63 -> 62 ;
62 [label="62: Return Stmt \n n$1=*&x:class X * [line 57]\n n$2=_fun_X_div(n$1:class X *) [line 57]\n *&return:int =n$2 [line 57]\n REMOVE_TEMPS(n$1,n$2); [line 57]\n NULLIFY(&x,false); [line 57]\n APPLY_ABSTRACTION; [line 57]\n " shape="box"]
62 [label="62: Return Stmt \n n$1=*&x:class X * [line 57]\n n$2=*n$1:class X [line 57]\n n$3=_fun_X_div(n$1:class X *) [line 57]\n *&return:int =n$3 [line 57]\n REMOVE_TEMPS(n$1,n$2,n$3); [line 57]\n NULLIFY(&x,false); [line 57]\n APPLY_ABSTRACTION; [line 57]\n " shape="box"]
62 -> 58 ;
@ -239,11 +239,11 @@ digraph iCFG {
57 -> 60 ;
57 -> 61 ;
56 [label="56: Call _fun_set_field_ptr \n n$3=*&x:class X * [line 49]\n _fun_set_field_ptr(n$3:class X *,0:int ) [line 49]\n REMOVE_TEMPS(n$3); [line 49]\n " shape="box"]
56 [label="56: Call _fun_set_field_ptr \n n$4=*&x:class X * [line 49]\n _fun_set_field_ptr(n$4:class X *,0:int ) [line 49]\n REMOVE_TEMPS(n$4); [line 49]\n " shape="box"]
56 -> 55 ;
55 [label="55: Return Stmt \n n$1=*&x:class X * [line 50]\n n$2=_fun_X_div(n$1:class X *) [line 50]\n *&return:int =n$2 [line 50]\n REMOVE_TEMPS(n$1,n$2); [line 50]\n NULLIFY(&x,false); [line 50]\n APPLY_ABSTRACTION; [line 50]\n " shape="box"]
55 [label="55: Return Stmt \n n$1=*&x:class X * [line 50]\n n$2=*n$1:class X [line 50]\n n$3=_fun_X_div(n$1:class X *) [line 50]\n *&return:int =n$3 [line 50]\n REMOVE_TEMPS(n$1,n$2,n$3); [line 50]\n NULLIFY(&x,false); [line 50]\n APPLY_ABSTRACTION; [line 50]\n " shape="box"]
55 -> 51 ;
@ -267,11 +267,11 @@ digraph iCFG {
50 -> 53 ;
50 -> 54 ;
49 [label="49: Call _fun_nonzero_ptr \n n$3=*&x:class X * [line 42]\n _fun_nonzero_ptr(n$3:class X *) [line 42]\n REMOVE_TEMPS(n$3); [line 42]\n " shape="box"]
49 [label="49: Call _fun_nonzero_ptr \n n$4=*&x:class X * [line 42]\n _fun_nonzero_ptr(n$4:class X *) [line 42]\n REMOVE_TEMPS(n$4); [line 42]\n " shape="box"]
49 -> 48 ;
48 [label="48: Return Stmt \n n$1=*&x:class X * [line 43]\n n$2=_fun_X_div(n$1:class X *) [line 43]\n *&return:int =n$2 [line 43]\n REMOVE_TEMPS(n$1,n$2); [line 43]\n NULLIFY(&x,false); [line 43]\n APPLY_ABSTRACTION; [line 43]\n " shape="box"]
48 [label="48: Return Stmt \n n$1=*&x:class X * [line 43]\n n$2=*n$1:class X [line 43]\n n$3=_fun_X_div(n$1:class X *) [line 43]\n *&return:int =n$3 [line 43]\n REMOVE_TEMPS(n$1,n$2,n$3); [line 43]\n NULLIFY(&x,false); [line 43]\n APPLY_ABSTRACTION; [line 43]\n " shape="box"]
48 -> 44 ;
@ -295,11 +295,11 @@ digraph iCFG {
43 -> 46 ;
43 -> 47 ;
42 [label="42: Call _fun_zero_ptr \n n$3=*&x:class X * [line 35]\n _fun_zero_ptr(n$3:class X *) [line 35]\n REMOVE_TEMPS(n$3); [line 35]\n " shape="box"]
42 [label="42: Call _fun_zero_ptr \n n$4=*&x:class X * [line 35]\n _fun_zero_ptr(n$4:class X *) [line 35]\n REMOVE_TEMPS(n$4); [line 35]\n " shape="box"]
42 -> 41 ;
41 [label="41: Return Stmt \n n$1=*&x:class X * [line 36]\n n$2=_fun_X_div(n$1:class X *) [line 36]\n *&return:int =n$2 [line 36]\n REMOVE_TEMPS(n$1,n$2); [line 36]\n NULLIFY(&x,false); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
41 [label="41: Return Stmt \n n$1=*&x:class X * [line 36]\n n$2=*n$1:class X [line 36]\n n$3=_fun_X_div(n$1:class X *) [line 36]\n *&return:int =n$3 [line 36]\n REMOVE_TEMPS(n$1,n$2,n$3); [line 36]\n NULLIFY(&x,false); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
41 -> 37 ;
@ -356,7 +356,7 @@ digraph iCFG {
27 -> 29 ;
26 [label="26: Call _fun_X_nonzero \n n$0=*&x:class X & [line 25]\n _fun_X_nonzero(n$0:class X &) [line 25]\n REMOVE_TEMPS(n$0); [line 25]\n NULLIFY(&x,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
26 [label="26: Call _fun_X_nonzero \n n$0=*&x:class X & [line 25]\n n$1=*n$0:class X [line 25]\n _fun_X_nonzero(n$0:class X &) [line 25]\n REMOVE_TEMPS(n$0,n$1); [line 25]\n NULLIFY(&x,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
26 -> 25 ;
@ -367,7 +367,7 @@ digraph iCFG {
24 -> 26 ;
23 [label="23: Call _fun_X_zero \n n$0=*&x:class X & [line 23]\n _fun_X_zero(n$0:class X &) [line 23]\n REMOVE_TEMPS(n$0); [line 23]\n NULLIFY(&x,false); [line 23]\n APPLY_ABSTRACTION; [line 23]\n " shape="box"]
23 [label="23: Call _fun_X_zero \n n$0=*&x:class X & [line 23]\n n$1=*n$0:class X [line 23]\n _fun_X_zero(n$0:class X &) [line 23]\n REMOVE_TEMPS(n$0,n$1); [line 23]\n NULLIFY(&x,false); [line 23]\n APPLY_ABSTRACTION; [line 23]\n " shape="box"]
23 -> 22 ;
@ -389,7 +389,7 @@ digraph iCFG {
18 -> 20 ;
17 [label="17: Call _fun_X_nonzero \n n$0=*&x:class X * [line 19]\n _fun_X_nonzero(n$0:class X *) [line 19]\n REMOVE_TEMPS(n$0); [line 19]\n NULLIFY(&x,false); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"]
17 [label="17: Call _fun_X_nonzero \n n$0=*&x:class X * [line 19]\n n$1=*n$0:class X [line 19]\n _fun_X_nonzero(n$0:class X *) [line 19]\n REMOVE_TEMPS(n$0,n$1); [line 19]\n NULLIFY(&x,false); [line 19]\n APPLY_ABSTRACTION; [line 19]\n " shape="box"]
17 -> 16 ;
@ -400,7 +400,7 @@ digraph iCFG {
15 -> 17 ;
14 [label="14: Call _fun_X_zero \n n$0=*&x:class X * [line 17]\n _fun_X_zero(n$0:class X *) [line 17]\n REMOVE_TEMPS(n$0); [line 17]\n NULLIFY(&x,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
14 [label="14: Call _fun_X_zero \n n$0=*&x:class X * [line 17]\n n$1=*n$0:class X [line 17]\n _fun_X_zero(n$0:class X *) [line 17]\n REMOVE_TEMPS(n$0,n$1); [line 17]\n NULLIFY(&x,false); [line 17]\n APPLY_ABSTRACTION; [line 17]\n " shape="box"]
14 -> 13 ;

@ -1,5 +1,5 @@
digraph iCFG {
30 [label="30: Return Stmt \n n$0=*&s:class ExecStore<Choose2> & [line 41]\n n$1=_fun_Choose2_extra(n$0.f:class Choose2 &,1:int ) [line 41]\n *&return:int =n$1 [line 41]\n REMOVE_TEMPS(n$0,n$1); [line 41]\n NULLIFY(&s,false); [line 41]\n APPLY_ABSTRACTION; [line 41]\n " shape="box"]
30 [label="30: Return Stmt \n n$0=*&s:class ExecStore<Choose2> & [line 41]\n n$1=*n$0.f:class Choose2 [line 41]\n n$2=_fun_Choose2_extra(n$0.f:class Choose2 &,1:int ) [line 41]\n *&return:int =n$2 [line 41]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 41]\n NULLIFY(&s,false); [line 41]\n APPLY_ABSTRACTION; [line 41]\n " shape="box"]
30 -> 29 ;
@ -10,7 +10,7 @@ digraph iCFG {
28 -> 30 ;
27 [label="27: Return Stmt \n n$0=*&s:class ExecStore<Choose2> & [line 39]\n n$1=_fun_Choose2_extra(n$0.f:class Choose2 &,0:int ) [line 39]\n *&return:int =n$1 [line 39]\n REMOVE_TEMPS(n$0,n$1); [line 39]\n NULLIFY(&s,false); [line 39]\n APPLY_ABSTRACTION; [line 39]\n " shape="box"]
27 [label="27: Return Stmt \n n$0=*&s:class ExecStore<Choose2> & [line 39]\n n$1=*n$0.f:class Choose2 [line 39]\n n$2=_fun_Choose2_extra(n$0.f:class Choose2 &,0:int ) [line 39]\n *&return:int =n$2 [line 39]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 39]\n NULLIFY(&s,false); [line 39]\n APPLY_ABSTRACTION; [line 39]\n " shape="box"]
27 -> 26 ;
@ -21,7 +21,7 @@ digraph iCFG {
25 -> 27 ;
24 [label="24: Return Stmt \n n$0=*&s:class ExecStore<Choose2> & [line 36]\n n$1=_fun_ExecStore<Choose2>_call_div(n$0:class ExecStore<Choose2> &,1:int ) [line 36]\n *&return:int =n$1 [line 36]\n REMOVE_TEMPS(n$0,n$1); [line 36]\n NULLIFY(&s,false); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
24 [label="24: Return Stmt \n n$0=*&s:class ExecStore<Choose2> & [line 36]\n n$1=*n$0:class ExecStore<Choose2> [line 36]\n n$2=_fun_ExecStore<Choose2>_call_div(n$0:class ExecStore<Choose2> &,1:int ) [line 36]\n *&return:int =n$2 [line 36]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 36]\n NULLIFY(&s,false); [line 36]\n APPLY_ABSTRACTION; [line 36]\n " shape="box"]
24 -> 23 ;
@ -32,7 +32,7 @@ digraph iCFG {
22 -> 24 ;
21 [label="21: Return Stmt \n n$0=*&s:class ExecStore<Choose1> & [line 32]\n n$1=_fun_ExecStore<Choose1>_call_div(n$0:class ExecStore<Choose1> &,1:int ) [line 32]\n *&return:int =n$1 [line 32]\n REMOVE_TEMPS(n$0,n$1); [line 32]\n NULLIFY(&s,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"]
21 [label="21: Return Stmt \n n$0=*&s:class ExecStore<Choose1> & [line 32]\n n$1=*n$0:class ExecStore<Choose1> [line 32]\n n$2=_fun_ExecStore<Choose1>_call_div(n$0:class ExecStore<Choose1> &,1:int ) [line 32]\n *&return:int =n$2 [line 32]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 32]\n NULLIFY(&s,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"]
21 -> 20 ;
@ -43,7 +43,7 @@ digraph iCFG {
19 -> 21 ;
18 [label="18: Return Stmt \n n$0=*&s:class ExecStore<Choose1> & [line 30]\n n$1=_fun_ExecStore<Choose1>_call_div(n$0:class ExecStore<Choose1> &,0:int ) [line 30]\n *&return:int =n$1 [line 30]\n REMOVE_TEMPS(n$0,n$1); [line 30]\n NULLIFY(&s,false); [line 30]\n APPLY_ABSTRACTION; [line 30]\n " shape="box"]
18 [label="18: Return Stmt \n n$0=*&s:class ExecStore<Choose1> & [line 30]\n n$1=*n$0:class ExecStore<Choose1> [line 30]\n n$2=_fun_ExecStore<Choose1>_call_div(n$0:class ExecStore<Choose1> &,0:int ) [line 30]\n *&return:int =n$2 [line 30]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 30]\n NULLIFY(&s,false); [line 30]\n APPLY_ABSTRACTION; [line 30]\n " shape="box"]
18 -> 17 ;
@ -54,7 +54,7 @@ digraph iCFG {
16 -> 18 ;
15 [label="15: Return Stmt \n n$0=*&this:class ExecStore<Choose2> * [line 26]\n n$1=*&a:int [line 26]\n n$2=_fun_Choose2_div(n$0.f:class Choose2 &,n$1:int ,0:int ) [line 26]\n *&return:int =n$2 [line 26]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 26]\n NULLIFY(&a,false); [line 26]\n NULLIFY(&this,false); [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
15 [label="15: Return Stmt \n n$0=*&this:class ExecStore<Choose2> * [line 26]\n n$1=*n$0.f:class Choose2 [line 26]\n n$2=*&a:int [line 26]\n n$3=_fun_Choose2_div(n$0.f:class Choose2 &,n$2:int ,0:int ) [line 26]\n *&return:int =n$3 [line 26]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 26]\n NULLIFY(&a,false); [line 26]\n NULLIFY(&this,false); [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
15 -> 14 ;
@ -65,7 +65,7 @@ digraph iCFG {
13 -> 15 ;
12 [label="12: Return Stmt \n n$0=*&this:class ExecStore<Choose1> * [line 26]\n n$1=*&a:int [line 26]\n n$2=_fun_Choose1_div(n$0.f:class Choose1 &,n$1:int ,0:int ) [line 26]\n *&return:int =n$2 [line 26]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 26]\n NULLIFY(&a,false); [line 26]\n NULLIFY(&this,false); [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
12 [label="12: Return Stmt \n n$0=*&this:class ExecStore<Choose1> * [line 26]\n n$1=*n$0.f:class Choose1 [line 26]\n n$2=*&a:int [line 26]\n n$3=_fun_Choose1_div(n$0.f:class Choose1 &,n$2:int ,0:int ) [line 26]\n *&return:int =n$3 [line 26]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 26]\n NULLIFY(&a,false); [line 26]\n NULLIFY(&this,false); [line 26]\n APPLY_ABSTRACTION; [line 26]\n " shape="box"]
12 -> 11 ;

@ -111,7 +111,7 @@ digraph iCFG {
20 -> 23 ;
19 [label="19: Return Stmt \n n$0=*&x:class X3 & [line 30]\n n$1=_fun_X3_get(n$0:class X3 &) [line 30]\n *&return:int =n$1 [line 30]\n REMOVE_TEMPS(n$0,n$1); [line 30]\n NULLIFY(&x,false); [line 30]\n APPLY_ABSTRACTION; [line 30]\n " shape="box"]
19 [label="19: Return Stmt \n n$0=*&x:class X3 & [line 30]\n n$1=*n$0:class X3 [line 30]\n n$2=_fun_X3_get(n$0:class X3 &) [line 30]\n *&return:int =n$2 [line 30]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 30]\n NULLIFY(&x,false); [line 30]\n APPLY_ABSTRACTION; [line 30]\n " shape="box"]
19 -> 18 ;
@ -122,7 +122,7 @@ digraph iCFG {
17 -> 19 ;
16 [label="16: Return Stmt \n n$0=*&x:class X1 & [line 24]\n n$1=_fun_X1_getVal(n$0:class X1 &) [line 24]\n *&return:int =n$1 [line 24]\n REMOVE_TEMPS(n$0,n$1); [line 24]\n NULLIFY(&x,false); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"]
16 [label="16: Return Stmt \n n$0=*&x:class X1 & [line 24]\n n$1=*n$0:class X1 [line 24]\n n$2=_fun_X1_getVal(n$0:class X1 &) [line 24]\n *&return:int =n$2 [line 24]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 24]\n NULLIFY(&x,false); [line 24]\n APPLY_ABSTRACTION; [line 24]\n " shape="box"]
16 -> 15 ;

@ -54,9 +54,10 @@ int div0_getter_templ() {
}
int div0_getter_templ2() {
X2 x2;
X2 x2_1;
X2 x2_2;
GetterTempl<X2> g;
return 1 / g.get(x2, x2);
return 1 / g.get(x2_1, x2_2);
}
int div1_getter_templ() {
@ -67,7 +68,8 @@ int div1_getter_templ() {
}
int div1_getter_templ2() {
X1 x1;
X1 x1_1;
X1 x1_2;
GetterTempl<X1> g;
return 1 / g.get(x1, x1);
return 1 / g.get(x1_1, x1_2);
}

@ -1,65 +1,73 @@
digraph iCFG {
73 [label="73: DeclStmt \n _fun_X1_X1(&x1:class X1 *) [line 70]\n " shape="box"]
75 [label="75: DeclStmt \n _fun_X1_X1(&x1_1:class X1 *) [line 71]\n " shape="box"]
75 -> 74 ;
74 [label="74: DeclStmt \n _fun_X1_X1(&x1_2:class X1 *) [line 72]\n " shape="box"]
74 -> 73 ;
73 [label="73: DeclStmt \n _fun_GetterTempl<X1>_GetterTempl(&g:class GetterTempl<X1> *) [line 73]\n " shape="box"]
73 -> 72 ;
72 [label="72: DeclStmt \n _fun_GetterTempl<X1>_GetterTempl(&g:class GetterTempl<X1> *) [line 71]\n " shape="box"]
72 [label="72: Return Stmt \n n$0=*&g:class GetterTempl<X1> [line 74]\n n$1=_fun_GetterTempl<X1>_get<X1>(&g:class GetterTempl<X1> &,&x1_1:class X1 &,&x1_2:class X1 &) [line 74]\n *&return:int =(1 / n$1) [line 74]\n REMOVE_TEMPS(n$0,n$1); [line 74]\n NULLIFY(&g,false); [line 74]\n NULLIFY(&x1_1,false); [line 74]\n NULLIFY(&x1_2,false); [line 74]\n APPLY_ABSTRACTION; [line 74]\n " shape="box"]
72 -> 71 ;
71 [label="71: Return Stmt \n n$0=_fun_GetterTempl<X1>_get<X1>(&g:class GetterTempl<X1> &,&x1:class X1 &,&x1:class X1 &) [line 72]\n *&return:int =(1 / n$0) [line 72]\n REMOVE_TEMPS(n$0); [line 72]\n NULLIFY(&g,false); [line 72]\n NULLIFY(&x1,false); [line 72]\n APPLY_ABSTRACTION; [line 72]\n " shape="box"]
71 [label="71: Exit div1_getter_templ2 \n " color=yellow style=filled]
71 -> 70 ;
70 [label="70: Exit div1_getter_templ2 \n " color=yellow style=filled]
70 [label="70: Start div1_getter_templ2\nFormals: \nLocals: g:class GetterTempl<X1> x1_2:class X1 x1_1:class X1 \n DECLARE_LOCALS(&return,&g,&x1_2,&x1_1); [line 70]\n " color=yellow style=filled]
69 [label="69: Start div1_getter_templ2\nFormals: \nLocals: g:class GetterTempl<X1> x1:class X1 \n DECLARE_LOCALS(&return,&g,&x1); [line 69]\n " color=yellow style=filled]
70 -> 75 ;
69 [label="69: DeclStmt \n _fun_X1_X1(&x1:class X1 *) [line 64]\n " shape="box"]
69 -> 73 ;
68 [label="68: DeclStmt \n _fun_X1_X1(&x1:class X1 *) [line 63]\n " shape="box"]
69 -> 68 ;
68 [label="68: DeclStmt \n _fun_X2_X2(&x2:class X2 *) [line 65]\n " shape="box"]
68 -> 67 ;
67 [label="67: DeclStmt \n _fun_X2_X2(&x2:class X2 *) [line 64]\n " shape="box"]
67 [label="67: DeclStmt \n _fun_GetterTempl<X2>_GetterTempl(&g:class GetterTempl<X2> *) [line 66]\n " shape="box"]
67 -> 66 ;
66 [label="66: DeclStmt \n _fun_GetterTempl<X2>_GetterTempl(&g:class GetterTempl<X2> *) [line 65]\n " shape="box"]
66 [label="66: Return Stmt \n n$0=*&g:class GetterTempl<X2> [line 67]\n n$1=_fun_GetterTempl<X2>_get<X1>(&g:class GetterTempl<X2> &,&x2:class X2 &,&x1:class X1 &) [line 67]\n *&return:int =(1 / n$1) [line 67]\n REMOVE_TEMPS(n$0,n$1); [line 67]\n NULLIFY(&g,false); [line 67]\n NULLIFY(&x1,false); [line 67]\n NULLIFY(&x2,false); [line 67]\n APPLY_ABSTRACTION; [line 67]\n " shape="box"]
66 -> 65 ;
65 [label="65: Return Stmt \n n$0=_fun_GetterTempl<X2>_get<X1>(&g:class GetterTempl<X2> &,&x2:class X2 &,&x1:class X1 &) [line 66]\n *&return:int =(1 / n$0) [line 66]\n REMOVE_TEMPS(n$0); [line 66]\n NULLIFY(&g,false); [line 66]\n NULLIFY(&x1,false); [line 66]\n NULLIFY(&x2,false); [line 66]\n APPLY_ABSTRACTION; [line 66]\n " shape="box"]
65 [label="65: Exit div1_getter_templ \n " color=yellow style=filled]
65 -> 64 ;
64 [label="64: Exit div1_getter_templ \n " color=yellow style=filled]
64 [label="64: Start div1_getter_templ\nFormals: \nLocals: g:class GetterTempl<X2> x2:class X2 x1:class X1 \n DECLARE_LOCALS(&return,&g,&x2,&x1); [line 63]\n " color=yellow style=filled]
63 [label="63: Start div1_getter_templ\nFormals: \nLocals: g:class GetterTempl<X2> x2:class X2 x1:class X1 \n DECLARE_LOCALS(&return,&g,&x2,&x1); [line 62]\n " color=yellow style=filled]
64 -> 69 ;
63 [label="63: DeclStmt \n _fun_X2_X2(&x2_1:class X2 *) [line 57]\n " shape="box"]
63 -> 68 ;
62 [label="62: DeclStmt \n _fun_X2_X2(&x2:class X2 *) [line 57]\n " shape="box"]
63 -> 62 ;
62 [label="62: DeclStmt \n _fun_X2_X2(&x2_2:class X2 *) [line 58]\n " shape="box"]
62 -> 61 ;
61 [label="61: DeclStmt \n _fun_GetterTempl<X2>_GetterTempl(&g:class GetterTempl<X2> *) [line 58]\n " shape="box"]
61 [label="61: DeclStmt \n _fun_GetterTempl<X2>_GetterTempl(&g:class GetterTempl<X2> *) [line 59]\n " shape="box"]
61 -> 60 ;
60 [label="60: Return Stmt \n n$0=_fun_GetterTempl<X2>_get<X2>(&g:class GetterTempl<X2> &,&x2:class X2 &,&x2:class X2 &) [line 59]\n *&return:int =(1 / n$0) [line 59]\n REMOVE_TEMPS(n$0); [line 59]\n NULLIFY(&g,false); [line 59]\n NULLIFY(&x2,false); [line 59]\n APPLY_ABSTRACTION; [line 59]\n " shape="box"]
60 [label="60: Return Stmt \n n$0=*&g:class GetterTempl<X2> [line 60]\n n$1=_fun_GetterTempl<X2>_get<X2>(&g:class GetterTempl<X2> &,&x2_1:class X2 &,&x2_2:class X2 &) [line 60]\n *&return:int =(1 / n$1) [line 60]\n REMOVE_TEMPS(n$0,n$1); [line 60]\n NULLIFY(&g,false); [line 60]\n NULLIFY(&x2_1,false); [line 60]\n NULLIFY(&x2_2,false); [line 60]\n APPLY_ABSTRACTION; [line 60]\n " shape="box"]
60 -> 59 ;
59 [label="59: Exit div0_getter_templ2 \n " color=yellow style=filled]
58 [label="58: Start div0_getter_templ2\nFormals: \nLocals: g:class GetterTempl<X2> x2:class X2 \n DECLARE_LOCALS(&return,&g,&x2); [line 56]\n " color=yellow style=filled]
58 [label="58: Start div0_getter_templ2\nFormals: \nLocals: g:class GetterTempl<X2> x2_2:class X2 x2_1:class X2 \n DECLARE_LOCALS(&return,&g,&x2_2,&x2_1); [line 56]\n " color=yellow style=filled]
58 -> 62 ;
58 -> 63 ;
57 [label="57: DeclStmt \n _fun_X2_X2(&x2:class X2 *) [line 50]\n " shape="box"]
@ -72,7 +80,7 @@ digraph iCFG {
55 -> 54 ;
54 [label="54: Return Stmt \n n$0=_fun_GetterTempl<X3>_get<X2>(&g:class GetterTempl<X3> &,&x3:class X3 &,&x2:class X2 &) [line 53]\n *&return:int =(1 / n$0) [line 53]\n REMOVE_TEMPS(n$0); [line 53]\n NULLIFY(&g,false); [line 53]\n NULLIFY(&x2,false); [line 53]\n NULLIFY(&x3,false); [line 53]\n APPLY_ABSTRACTION; [line 53]\n " shape="box"]
54 [label="54: Return Stmt \n n$0=*&g:class GetterTempl<X3> [line 53]\n n$1=_fun_GetterTempl<X3>_get<X2>(&g:class GetterTempl<X3> &,&x3:class X3 &,&x2:class X2 &) [line 53]\n *&return:int =(1 / n$1) [line 53]\n REMOVE_TEMPS(n$0,n$1); [line 53]\n NULLIFY(&g,false); [line 53]\n NULLIFY(&x2,false); [line 53]\n NULLIFY(&x3,false); [line 53]\n APPLY_ABSTRACTION; [line 53]\n " shape="box"]
54 -> 53 ;
@ -91,7 +99,7 @@ digraph iCFG {
50 -> 49 ;
49 [label="49: Return Stmt \n n$0=_fun_Getter_get<X1>(&g:class Getter &,&x1:class X1 &) [line 46]\n *&return:int =(1 / n$0) [line 46]\n REMOVE_TEMPS(n$0); [line 46]\n NULLIFY(&g,false); [line 46]\n NULLIFY(&x1,false); [line 46]\n APPLY_ABSTRACTION; [line 46]\n " shape="box"]
49 [label="49: Return Stmt \n n$0=*&g:class Getter [line 46]\n n$1=_fun_Getter_get<X1>(&g:class Getter &,&x1:class X1 &) [line 46]\n *&return:int =(1 / n$1) [line 46]\n REMOVE_TEMPS(n$0,n$1); [line 46]\n NULLIFY(&g,false); [line 46]\n NULLIFY(&x1,false); [line 46]\n APPLY_ABSTRACTION; [line 46]\n " shape="box"]
49 -> 48 ;
@ -110,7 +118,7 @@ digraph iCFG {
45 -> 44 ;
44 [label="44: Return Stmt \n n$0=_fun_Getter_get<X2>(&g:class Getter &,&x2:class X2 &) [line 40]\n *&return:int =(1 / n$0) [line 40]\n REMOVE_TEMPS(n$0); [line 40]\n NULLIFY(&g,false); [line 40]\n NULLIFY(&x2,false); [line 40]\n APPLY_ABSTRACTION; [line 40]\n " shape="box"]
44 [label="44: Return Stmt \n n$0=*&g:class Getter [line 40]\n n$1=_fun_Getter_get<X2>(&g:class Getter &,&x2:class X2 &) [line 40]\n *&return:int =(1 / n$1) [line 40]\n REMOVE_TEMPS(n$0,n$1); [line 40]\n NULLIFY(&g,false); [line 40]\n NULLIFY(&x2,false); [line 40]\n APPLY_ABSTRACTION; [line 40]\n " shape="box"]
44 -> 43 ;
@ -128,7 +136,7 @@ digraph iCFG {
40 -> 41 ;
39 [label="39: Return Stmt \n n$0=*&t:class X1 & [line 33]\n n$1=_fun_X1_get(n$0:class X1 &) [line 33]\n n$2=*&s:class X1 & [line 33]\n n$3=_fun_X1_get(n$2:class X1 &) [line 33]\n *&return:int =(n$1 + n$3) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
39 [label="39: Return Stmt \n n$0=*&t:class X1 & [line 33]\n n$1=*n$0:class X1 [line 33]\n n$2=_fun_X1_get(n$0:class X1 &) [line 33]\n n$3=*&s:class X1 & [line 33]\n n$4=*n$3:class X1 [line 33]\n n$5=_fun_X1_get(n$3:class X1 &) [line 33]\n *&return:int =(n$2 + n$5) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3,n$4,n$5); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
39 -> 38 ;
@ -146,7 +154,7 @@ digraph iCFG {
35 -> 36 ;
34 [label="34: Return Stmt \n n$0=*&t:class X2 & [line 33]\n n$1=_fun_X2_get(n$0:class X2 &) [line 33]\n n$2=*&s:class X1 & [line 33]\n n$3=_fun_X1_get(n$2:class X1 &) [line 33]\n *&return:int =(n$1 + n$3) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
34 [label="34: Return Stmt \n n$0=*&t:class X2 & [line 33]\n n$1=*n$0:class X2 [line 33]\n n$2=_fun_X2_get(n$0:class X2 &) [line 33]\n n$3=*&s:class X1 & [line 33]\n n$4=*n$3:class X1 [line 33]\n n$5=_fun_X1_get(n$3:class X1 &) [line 33]\n *&return:int =(n$2 + n$5) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3,n$4,n$5); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
34 -> 33 ;
@ -157,7 +165,7 @@ digraph iCFG {
32 -> 34 ;
31 [label="31: Return Stmt \n n$0=*&t:class X2 & [line 33]\n n$1=_fun_X2_get(n$0:class X2 &) [line 33]\n n$2=*&s:class X2 & [line 33]\n n$3=_fun_X2_get(n$2:class X2 &) [line 33]\n *&return:int =(n$1 + n$3) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
31 [label="31: Return Stmt \n n$0=*&t:class X2 & [line 33]\n n$1=*n$0:class X2 [line 33]\n n$2=_fun_X2_get(n$0:class X2 &) [line 33]\n n$3=*&s:class X2 & [line 33]\n n$4=*n$3:class X2 [line 33]\n n$5=_fun_X2_get(n$3:class X2 &) [line 33]\n *&return:int =(n$2 + n$5) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3,n$4,n$5); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
31 -> 30 ;
@ -175,7 +183,7 @@ digraph iCFG {
27 -> 28 ;
26 [label="26: Return Stmt \n n$0=*&t:class X3 & [line 33]\n n$1=_fun_X3_get(n$0:class X3 &) [line 33]\n n$2=*&s:class X2 & [line 33]\n n$3=_fun_X2_get(n$2:class X2 &) [line 33]\n *&return:int =(n$1 + n$3) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
26 [label="26: Return Stmt \n n$0=*&t:class X3 & [line 33]\n n$1=*n$0:class X3 [line 33]\n n$2=_fun_X3_get(n$0:class X3 &) [line 33]\n n$3=*&s:class X2 & [line 33]\n n$4=*n$3:class X2 [line 33]\n n$5=_fun_X2_get(n$3:class X2 &) [line 33]\n *&return:int =(n$2 + n$5) [line 33]\n REMOVE_TEMPS(n$0,n$1,n$2,n$3,n$4,n$5); [line 33]\n NULLIFY(&s,false); [line 33]\n NULLIFY(&t,false); [line 33]\n APPLY_ABSTRACTION; [line 33]\n " shape="box"]
26 -> 25 ;
@ -193,7 +201,7 @@ digraph iCFG {
22 -> 23 ;
21 [label="21: Return Stmt \n n$0=*&s:class X1 & [line 25]\n n$1=_fun_X1_get(n$0:class X1 &) [line 25]\n *&return:int =n$1 [line 25]\n REMOVE_TEMPS(n$0,n$1); [line 25]\n NULLIFY(&s,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
21 [label="21: Return Stmt \n n$0=*&s:class X1 & [line 25]\n n$1=*n$0:class X1 [line 25]\n n$2=_fun_X1_get(n$0:class X1 &) [line 25]\n *&return:int =n$2 [line 25]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 25]\n NULLIFY(&s,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
21 -> 20 ;
@ -204,7 +212,7 @@ digraph iCFG {
19 -> 21 ;
18 [label="18: Return Stmt \n n$0=*&s:class X2 & [line 25]\n n$1=_fun_X2_get(n$0:class X2 &) [line 25]\n *&return:int =n$1 [line 25]\n REMOVE_TEMPS(n$0,n$1); [line 25]\n NULLIFY(&s,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
18 [label="18: Return Stmt \n n$0=*&s:class X2 & [line 25]\n n$1=*n$0:class X2 [line 25]\n n$2=_fun_X2_get(n$0:class X2 &) [line 25]\n *&return:int =n$2 [line 25]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 25]\n NULLIFY(&s,false); [line 25]\n APPLY_ABSTRACTION; [line 25]\n " shape="box"]
18 -> 17 ;

@ -1,37 +1,37 @@
digraph iCFG {
25 [label="25: DeclStmt \n n$14=_fun___new(sizeof(class Base ):unsigned long ) [line 22]\n *&b:class Base *=n$14 [line 22]\n REMOVE_TEMPS(n$14); [line 22]\n " shape="box"]
25 [label="25: DeclStmt \n n$20=_fun___new(sizeof(class Base ):unsigned long ) [line 22]\n *&b:class Base *=n$20 [line 22]\n REMOVE_TEMPS(n$20); [line 22]\n " shape="box"]
25 -> 24 ;
24 [label="24: DeclStmt \n n$13=_fun___new(sizeof(class Sub ):unsigned long ) [line 23]\n *&s1:class Sub *=n$13 [line 23]\n REMOVE_TEMPS(n$13); [line 23]\n " shape="box"]
24 [label="24: DeclStmt \n n$19=_fun___new(sizeof(class Sub ):unsigned long ) [line 23]\n *&s1:class Sub *=n$19 [line 23]\n REMOVE_TEMPS(n$19); [line 23]\n " shape="box"]
24 -> 23 ;
23 [label="23: DeclStmt \n n$12=_fun___new(sizeof(class Sub ):unsigned long ) [line 24]\n *&s2:class Sub *=n$12 [line 24]\n REMOVE_TEMPS(n$12); [line 24]\n " shape="box"]
23 [label="23: DeclStmt \n n$18=_fun___new(sizeof(class Sub ):unsigned long ) [line 24]\n *&s2:class Sub *=n$18 [line 24]\n REMOVE_TEMPS(n$18); [line 24]\n " shape="box"]
23 -> 22 ;
22 [label="22: Call _fun_Base_fun \n n$10=*&b:class Base * [line 26]\n n$11=_fun_Base_fun(n$10:class Base *) [line 26]\n REMOVE_TEMPS(n$10,n$11); [line 26]\n " shape="box"]
22 [label="22: Call _fun_Base_fun \n n$15=*&b:class Base * [line 26]\n n$16=*n$15:class Base [line 26]\n n$17=_fun_Base_fun(n$15:class Base *) [line 26]\n REMOVE_TEMPS(n$15,n$16,n$17); [line 26]\n " shape="box"]
22 -> 21 ;
21 [label="21: Call _fun_Base_fun \n n$8=*&s1:class Base * [line 27]\n n$9=_fun_Base_fun(n$8:class Base *) [line 27]\n REMOVE_TEMPS(n$8,n$9); [line 27]\n " shape="box"]
21 [label="21: Call _fun_Base_fun \n n$12=*&s1:class Base * [line 27]\n n$13=*n$12:class Base [line 27]\n n$14=_fun_Base_fun(n$12:class Base *) [line 27]\n REMOVE_TEMPS(n$12,n$13,n$14); [line 27]\n " shape="box"]
21 -> 20 ;
20 [label="20: Call _fun_Base_fun \n n$6=*&s2:class Sub * [line 28]\n n$7=_fun_Base_fun(n$6:class Sub *) [line 28]\n REMOVE_TEMPS(n$6,n$7); [line 28]\n " shape="box"]
20 [label="20: Call _fun_Base_fun \n n$9=*&s2:class Sub * [line 28]\n n$10=*n$9:class Sub [line 28]\n n$11=_fun_Base_fun(n$9:class Sub *) [line 28]\n REMOVE_TEMPS(n$9,n$10,n$11); [line 28]\n " shape="box"]
20 -> 19 ;
19 [label="19: Call _fun_Base_fun_redefine \n n$4=*&b:class Base * [line 30]\n n$5=_fun_Base_fun_redefine(n$4:class Base *) [line 30]\n REMOVE_TEMPS(n$4,n$5); [line 30]\n NULLIFY(&b,false); [line 30]\n " shape="box"]
19 [label="19: Call _fun_Base_fun_redefine \n n$6=*&b:class Base * [line 30]\n n$7=*n$6:class Base [line 30]\n n$8=_fun_Base_fun_redefine(n$6:class Base *) [line 30]\n REMOVE_TEMPS(n$6,n$7,n$8); [line 30]\n NULLIFY(&b,false); [line 30]\n " shape="box"]
19 -> 18 ;
18 [label="18: Call _fun_Base_fun_redefine \n n$2=*&s1:class Base * [line 31]\n n$3=_fun_Base_fun_redefine(n$2:class Base *) [line 31]\n REMOVE_TEMPS(n$2,n$3); [line 31]\n NULLIFY(&s1,false); [line 31]\n " shape="box"]
18 [label="18: Call _fun_Base_fun_redefine \n n$3=*&s1:class Base * [line 31]\n n$4=*n$3:class Base [line 31]\n n$5=_fun_Base_fun_redefine(n$3:class Base *) [line 31]\n REMOVE_TEMPS(n$3,n$4,n$5); [line 31]\n NULLIFY(&s1,false); [line 31]\n " shape="box"]
18 -> 17 ;
17 [label="17: Call _fun_Sub_fun_redefine \n n$0=*&s2:class Sub * [line 32]\n n$1=_fun_Sub_fun_redefine(n$0:class Sub *) [line 32]\n REMOVE_TEMPS(n$0,n$1); [line 32]\n NULLIFY(&s2,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"]
17 [label="17: Call _fun_Sub_fun_redefine \n n$0=*&s2:class Sub * [line 32]\n n$1=*n$0:class Sub [line 32]\n n$2=_fun_Sub_fun_redefine(n$0:class Sub *) [line 32]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 32]\n NULLIFY(&s2,false); [line 32]\n APPLY_ABSTRACTION; [line 32]\n " shape="box"]
17 -> 16 ;

@ -21,7 +21,7 @@ digraph iCFG {
22 -> 24 ;
21 [label="21: DeclStmt \n n$1=*&x:class X & [line 36]\n n$2=_fun_X_operator[](n$1:class X &,0:int ) [line 36]\n *&v:int =n$2 [line 36]\n REMOVE_TEMPS(n$1,n$2); [line 36]\n NULLIFY(&x,false); [line 36]\n " shape="box"]
21 [label="21: DeclStmt \n n$1=*&x:class X & [line 36]\n n$2=*n$1:class X [line 36]\n n$3=_fun_X_operator[](n$1:class X &,0:int ) [line 36]\n *&v:int =n$3 [line 36]\n REMOVE_TEMPS(n$1,n$2,n$3); [line 36]\n NULLIFY(&x,false); [line 36]\n " shape="box"]
21 -> 20 ;

@ -1,9 +1,9 @@
digraph iCFG {
41 [label="41: BinaryOperatorStmt: Assign \n n$2=*&z:class Z * [line 65]\n *n$2.f:int =0 [line 65]\n REMOVE_TEMPS(n$2); [line 65]\n " shape="box"]
41 [label="41: BinaryOperatorStmt: Assign \n n$3=*&z:class Z * [line 65]\n *n$3.f:int =0 [line 65]\n REMOVE_TEMPS(n$3); [line 65]\n " shape="box"]
41 -> 40 ;
40 [label="40: Return Stmt \n n$0=*&z:class Z * [line 66]\n n$1=_fun_Z_getF(n$0:class Z *) [line 66]\n *&return:int =(1 / n$1) [line 66]\n REMOVE_TEMPS(n$0,n$1); [line 66]\n NULLIFY(&z,false); [line 66]\n APPLY_ABSTRACTION; [line 66]\n " shape="box"]
40 [label="40: Return Stmt \n n$0=*&z:class Z * [line 66]\n n$1=*n$0:class Z [line 66]\n n$2=_fun_Z_getF(n$0:class Z *) [line 66]\n *&return:int =(1 / n$2) [line 66]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 66]\n NULLIFY(&z,false); [line 66]\n APPLY_ABSTRACTION; [line 66]\n " shape="box"]
40 -> 39 ;
@ -22,7 +22,7 @@ digraph iCFG {
36 -> 35 ;
35 [label="35: Return Stmt \n n$0=_fun_Z_getF(&z:class Z &) [line 58]\n *&return:int =(1 / n$0) [line 58]\n REMOVE_TEMPS(n$0); [line 58]\n NULLIFY(&z,false); [line 58]\n APPLY_ABSTRACTION; [line 58]\n " shape="box"]
35 [label="35: Return Stmt \n n$0=*&z:class Z [line 58]\n n$1=_fun_Z_getF(&z:class Z &) [line 58]\n *&return:int =(1 / n$1) [line 58]\n REMOVE_TEMPS(n$0,n$1); [line 58]\n NULLIFY(&z,false); [line 58]\n APPLY_ABSTRACTION; [line 58]\n " shape="box"]
35 -> 34 ;
@ -50,11 +50,11 @@ digraph iCFG {
29 -> 24 ;
28 [label="28: Prune (false branch) \n n$1=*&x.y:class Y * [line 49]\n PRUNE((n$1 == 0), false); [line 49]\n REMOVE_TEMPS(n$1); [line 49]\n " shape="invhouse"]
28 [label="28: Prune (false branch) \n n$2=*&x.y:class Y * [line 49]\n PRUNE((n$2 == 0), false); [line 49]\n REMOVE_TEMPS(n$2); [line 49]\n " shape="invhouse"]
28 -> 26 ;
27 [label="27: Prune (true branch) \n n$1=*&x.y:class Y * [line 49]\n PRUNE((n$1 != 0), true); [line 49]\n REMOVE_TEMPS(n$1); [line 49]\n " shape="invhouse"]
27 [label="27: Prune (true branch) \n n$2=*&x.y:class Y * [line 49]\n PRUNE((n$2 != 0), true); [line 49]\n REMOVE_TEMPS(n$2); [line 49]\n " shape="invhouse"]
27 -> 29 ;
@ -62,7 +62,7 @@ digraph iCFG {
26 -> 25 ;
25 [label="25: Return Stmt \n n$0=_fun_X_getF(&x:class X &) [line 52]\n *&return:int =(1 / n$0) [line 52]\n REMOVE_TEMPS(n$0); [line 52]\n NULLIFY(&x,false); [line 52]\n APPLY_ABSTRACTION; [line 52]\n " shape="box"]
25 [label="25: Return Stmt \n n$0=*&x:class X [line 52]\n n$1=_fun_X_getF(&x:class X &) [line 52]\n *&return:int =(1 / n$1) [line 52]\n REMOVE_TEMPS(n$0,n$1); [line 52]\n NULLIFY(&x,false); [line 52]\n APPLY_ABSTRACTION; [line 52]\n " shape="box"]
25 -> 24 ;
@ -73,11 +73,11 @@ digraph iCFG {
23 -> 32 ;
22 [label="22: BinaryOperatorStmt: Assign \n n$2=*&x:class X * [line 41]\n *n$2.f:int =0 [line 41]\n REMOVE_TEMPS(n$2); [line 41]\n " shape="box"]
22 [label="22: BinaryOperatorStmt: Assign \n n$3=*&x:class X * [line 41]\n *n$3.f:int =0 [line 41]\n REMOVE_TEMPS(n$3); [line 41]\n " shape="box"]
22 -> 21 ;
21 [label="21: Return Stmt \n n$0=*&x:class X * [line 42]\n n$1=_fun_X_getF(n$0:class X *) [line 42]\n *&return:int =(1 / n$1) [line 42]\n REMOVE_TEMPS(n$0,n$1); [line 42]\n NULLIFY(&x,false); [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"]
21 [label="21: Return Stmt \n n$0=*&x:class X * [line 42]\n n$1=*n$0:class X [line 42]\n n$2=_fun_X_getF(n$0:class X *) [line 42]\n *&return:int =(1 / n$2) [line 42]\n REMOVE_TEMPS(n$0,n$1,n$2); [line 42]\n NULLIFY(&x,false); [line 42]\n APPLY_ABSTRACTION; [line 42]\n " shape="box"]
21 -> 20 ;
@ -96,7 +96,7 @@ digraph iCFG {
17 -> 16 ;
16 [label="16: Return Stmt \n n$0=_fun_X_getF(&x:class X &) [line 37]\n *&return:int =(1 / n$0) [line 37]\n REMOVE_TEMPS(n$0); [line 37]\n NULLIFY(&x,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"]
16 [label="16: Return Stmt \n n$0=*&x:class X [line 37]\n n$1=_fun_X_getF(&x:class X &) [line 37]\n *&return:int =(1 / n$1) [line 37]\n REMOVE_TEMPS(n$0,n$1); [line 37]\n NULLIFY(&x,false); [line 37]\n APPLY_ABSTRACTION; [line 37]\n " shape="box"]
16 -> 15 ;

@ -0,0 +1,63 @@
/*
* Copyright (c) 2015 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package endtoend.cpp;
import static org.hamcrest.MatcherAssert.assertThat;
import static utils.matchers.ResultContainsErrorInMethod.contains;
import static utils.matchers.ResultContainsExactly.containsExactly;
import static utils.matchers.ResultContainsNoErrorInMethod.doesNotContain;
import com.google.common.collect.ImmutableList;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import java.io.IOException;
import utils.DebuggableTemporaryFolder;
import utils.InferException;
import utils.InferResults;
import utils.InferRunner;
public class NPEWhenMethodCallTest {
public static final String FILE =
"infer/tests/codetoanalyze/cpp/errors/npe/method_call.cpp";
private static ImmutableList<String> inferCmd;
public static final String NULL_DEREFERENCE = "NULL_DEREFERENCE";
@ClassRule
public static DebuggableTemporaryFolder folder =
new DebuggableTemporaryFolder();
@BeforeClass
public static void runInfer() throws InterruptedException, IOException {
inferCmd = InferRunner.createCPPInferCommand(folder, FILE);
}
@Test
public void whenInferRunsOnMethodCallThenNoNPEFound()
throws InterruptedException, IOException, InferException {
InferResults inferResults = InferRunner.runInferCPP(inferCmd);
String[] procedures = {"npe_call", "npe_call_after_call", "npe_call_with_forward_declaration"};
assertThat(
"Results should contain " + NULL_DEREFERENCE,
inferResults,
containsExactly(
NULL_DEREFERENCE,
FILE,
procedures
)
);
}
}

@ -0,0 +1,41 @@
/*
* Copyright (c) 2016 - 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.
*/
package frontend.cpp;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
import utils.ClangFrontendUtils;
import utils.DebuggableTemporaryFolder;
import utils.InferException;
public class NPETest {
String methodBasePath = "infer/tests/codetoanalyze/cpp/errors/npe/";
@Rule
public DebuggableTemporaryFolder folder = new DebuggableTemporaryFolder();
void frontendTest(String fileRelative) throws InterruptedException, IOException, InferException {
ClangFrontendUtils.createAndCompareCppDotFiles(folder, methodBasePath + fileRelative);
}
@Test
public void testInlineMethodDotFilesMatch()
throws InterruptedException, IOException, InferException {
frontendTest("method_call.cpp");
}
}
Loading…
Cancel
Save