2626 SOFTWARE.
2727 ============================================================================= *)
2828
29- (* chlib *)
30- open CHNumerical
31-
3229(* xprlib *)
3330open Xprt
3431open XprTypes
3532
3633(* bchlib *)
3734open BCHBCFiles
3835open BCHBCTypes
39- open BCHConstantDefinitions
4036open BCHDoubleword
4137open BCHFloc
4238open BCHFunctionData
@@ -46,136 +42,155 @@ open BCHLibTypes
4642(* bchcil *)
4743open BCHParseCilFile
4844
45+ module A = TCHAssertion
4946module TR = CHTraceResult
5047module TS = TCHTestSuite
5148module XBA = TCHBchlibAssertion
5249
50+ let mmap = BCHGlobalMemoryMap. global_memory_map
51+
5352
5453let testname = " bCHFlocTest"
5554let lastupdated = " 2024-08-20"
5655
5756
58- let decompose_memvar_address_test () =
57+ let get_var_at_address_test () =
58+ let secaddr = TR. tget_ok (string_to_doubleword " 0x500000" ) in
59+ let secsize = TR. tget_ok (string_to_doubleword " 0x100000" ) in
60+ let _ = mmap#set_section ~readonly: false ~initialized: false " .bss" secaddr secsize in
5961 let faddr = " 0x1d6bfc" in
6062 let iaddr = " 0x1d6cbc" in
6163 let gvaddr = " 0x5e1e1c" in
6264 let dwfaddr = TR. tget_ok (string_to_doubleword faddr) in
6365 let dwiaddr = TR. tget_ok (string_to_doubleword iaddr) in
6466 let dwgvaddr = TR. tget_ok (string_to_doubleword gvaddr) in
65- let gvname = " x44_array " in
67+ let dwgvxpr = num_constant_expr dwgvaddr#to_numerical in
6668 begin
6769 TS. new_testsuite
68- (testname ^ " _decompose_memvar_address_test " ) lastupdated;
70+ (testname ^ " _get_var_at_address_test " ) lastupdated;
6971
7072 parse_cil_file ~remove Unused:false " decompose_array_address.i" ;
7173 ignore (functions_data#add_function dwfaddr);
72-
73- let arraysym = {
74- xconst_name = gvname;
75- xconst_value = dwgvaddr;
76- xconst_type =
77- if bcfiles#has_varinfo gvname then
78- let vinfo = bcfiles#get_varinfo gvname in
79- vinfo.bvtype
80- else
81- raise
82- (Invalid_argument " Error in arraysym" );
83- xconst_desc = " decompose_memvar_address" ;
84- xconst_is_addr = true
85- } in
86- let _ = add_address arraysym in
8774 let compinfo = bcfiles#get_compinfo_by_name " x44_struct_t" in
88-
8975 let finfo = get_function_info dwfaddr in
9076 let floc = get_floc_by_address dwfaddr dwiaddr in
91- let ty = get_symbolic_address_type_by_name gvname in
92- let basevar =
93- finfo#env#mk_global_memory_address
94- ~optname: (Some gvname) ~opttype: (Some ty) dwgvaddr#to_numerical in
95- let memref = TR. tget_ok (floc#f#env#mk_base_variable_reference basevar) in
77+ let gvar = TR. tget_ok (finfo#env#mk_global_variable dwgvaddr#to_numerical) in
9678 let indexvar = finfo#env#mk_initial_register_value (ARMRegister AR0 ) in
9779 let indexxpr1 = XOp (XMinus , [XVar indexvar; int_constant_expr 1 ]) in
9880
9981 TS. add_simple_test
10082 ~title: " constant-68"
10183 (fun () ->
102- let xpr = XOp (XPlus , [XVar basevar; int_constant_expr 68 ]) in
103- let xpsuboffset = FieldOffset ((" field0" , compinfo.bckey), NoOffset ) in
104- let xpmemoffset = ArrayIndexOffset (int_constant_expr 1 , xpsuboffset) in
105- let optmeminfo = floc#decompose_memvar_address xpr in
106- XBA. equal_opt_meminfo
107- ~expected: (Some (memref, xpmemoffset))
108- ~received: optmeminfo
109- () );
84+ let xpr = XOp (XPlus , [dwgvxpr; int_constant_expr 68 ]) in
85+ let xpr = Xsimplify. simplify_xpr xpr in
86+ let xprvar = floc#get_var_at_address ~btype: BCHBCTypeUtil. t_int xpr in
87+ let xpoffset = FieldOffset ((" field0" , compinfo.bckey), NoOffset ) in
88+ let xpoffset = ArrayIndexOffset (int_constant_expr 1 , xpoffset) in
89+ let expected_r = finfo#env#add_memory_offset gvar xpoffset in
90+ let expected = TR. to_option expected_r in
91+ match xprvar with
92+ Ok received ->
93+ XBA. equal_opt_variable
94+ ~expected
95+ ~received: (Some received)
96+ ()
97+ | Error e -> A. fail_msg (" Error: " ^ (String. concat " ; " e)));
11098
11199 TS. add_simple_test
112100 ~title: " constant-72"
113101 (fun () ->
114- let xpr = XOp (XPlus , [XVar basevar; int_constant_expr 72 ]) in
115- let xpsuboffset = FieldOffset ((" field4" , compinfo.bckey), NoOffset ) in
116- let xpmemoffset = ArrayIndexOffset (int_constant_expr 1 , xpsuboffset) in
117- let optmeminfo = floc#decompose_memvar_address xpr in
118- XBA. equal_opt_meminfo
119- ~expected: (Some (memref, xpmemoffset))
120- ~received: optmeminfo
121- () );
102+ let xpr = XOp (XPlus , [dwgvxpr; int_constant_expr 72 ]) in
103+ let xpr = Xsimplify. simplify_xpr xpr in
104+ let xprvar = floc#get_var_at_address ~btype: BCHBCTypeUtil. t_int xpr in
105+ let xpoffset = FieldOffset ((" field4" , compinfo.bckey), NoOffset ) in
106+ let xpoffset = ArrayIndexOffset (int_constant_expr 1 , xpoffset) in
107+ let expected_r = finfo#env#add_memory_offset gvar xpoffset in
108+ let expected = TR. to_option expected_r in
109+ match xprvar with
110+ Ok received ->
111+ XBA. equal_opt_variable
112+ ~expected
113+ ~received: (Some received)
114+ ()
115+ | Error e -> A. fail_msg (" Error: " ^ (String. concat " ; " e)));
122116
123117 TS. add_simple_test
124118 ~title: " var-68"
125119 (fun () ->
126120 let xpr =
127- XOp (XPlus , [XVar basevar ;
121+ XOp (XPlus , [dwgvxpr ;
128122 XOp (XMult , [int_constant_expr 68 ; XVar indexvar])]) in
129- let xpsuboffset = FieldOffset ((" field0" , compinfo.bckey), NoOffset ) in
130- let xpmemoffset = ArrayIndexOffset (XVar indexvar, xpsuboffset) in
131- let optmeminfo = floc#decompose_memvar_address xpr in
132- XBA. equal_opt_meminfo
133- ~expected: (Some (memref, xpmemoffset))
134- ~received: optmeminfo
135- () );
123+ let xprvar = floc#get_var_at_address ~btype: BCHBCTypeUtil. t_int xpr in
124+ let xpoffset = FieldOffset ((" field0" , compinfo.bckey), NoOffset ) in
125+ let xpoffset = ArrayIndexOffset (XVar indexvar, xpoffset) in
126+ let expected_r = finfo#env#add_memory_offset gvar xpoffset in
127+ let expected = TR. to_option expected_r in
128+ match xprvar with
129+ | Ok received ->
130+ XBA. equal_opt_variable
131+ ~expected
132+ ~received: (Some received)
133+ ()
134+ | Error e -> A. fail_msg (" Error: " ^ (String. concat " ; " e)));
135+
136136
137137 TS. add_simple_test
138138 ~title: " varm1-68"
139139 (fun () ->
140140 let subxpr = XOp (XMult , [int_constant_expr 68 ; XVar indexvar]) in
141141 let subxpr = XOp (XMinus , [subxpr; int_constant_expr 68 ]) in
142- let xpr = XOp (XPlus , [XVar basevar; subxpr]) in
143- let xpsuboffset = FieldOffset ((" field0" , compinfo.bckey), NoOffset ) in
144- let xpmemoffset = ArrayIndexOffset (indexxpr1, xpsuboffset) in
145- let optmeminfo = floc#decompose_memvar_address xpr in
146- XBA. equal_opt_meminfo
147- ~expected: (Some (memref, xpmemoffset))
148- ~received: optmeminfo
149- () );
142+ let xpr = XOp (XPlus , [dwgvxpr; subxpr]) in
143+ let xprvar = floc#get_var_at_address ~btype: BCHBCTypeUtil. t_int xpr in
144+ let xpoffset = FieldOffset ((" field0" , compinfo.bckey), NoOffset ) in
145+ let xpoffset = ArrayIndexOffset (indexxpr1, xpoffset) in
146+ let expected_r = finfo#env#add_memory_offset gvar xpoffset in
147+ let expected = TR. to_option expected_r in
148+ match xprvar with
149+ | Ok received ->
150+ XBA. equal_opt_variable
151+ ~expected
152+ ~received: (Some received)
153+ ()
154+ | Error e -> A. fail_msg (" Error: " ^ (String. concat " ; " e)));
150155
151156 TS. add_simple_test
152157 ~title: " varm1-64"
153158 (fun () ->
154159 let subxpr = XOp (XMult , [int_constant_expr 68 ; XVar indexvar]) in
155160 let subxpr = XOp (XMinus , [subxpr; int_constant_expr 64 ]) in
156- let xpr = XOp (XPlus , [XVar basevar; subxpr]) in
157- let xpsuboffset = FieldOffset ((" field4" , compinfo.bckey), NoOffset ) in
158- let xpmemoffset = ArrayIndexOffset (indexxpr1, xpsuboffset) in
159- let optmeminfo = floc#decompose_memvar_address xpr in
160- XBA. equal_opt_meminfo
161- ~expected: (Some (memref, xpmemoffset))
162- ~received: optmeminfo
163- () );
161+ let xpr = XOp (XPlus , [dwgvxpr; subxpr]) in
162+ let xprvar = floc#get_var_at_address ~btype: BCHBCTypeUtil. t_int xpr in
163+ let xpoffset = FieldOffset ((" field4" , compinfo.bckey), NoOffset ) in
164+ let xpoffset = ArrayIndexOffset (indexxpr1, xpoffset) in
165+ let expected_r = finfo#env#add_memory_offset gvar xpoffset in
166+ let expected = TR. to_option expected_r in
167+ match xprvar with
168+ | Ok received ->
169+ XBA. equal_opt_variable
170+ ~expected
171+ ~received: (Some received)
172+ ()
173+ | Error e -> A. fail_msg (" Error: " ^ (String. concat " ; " e)));
164174
165175 TS. add_simple_test
166176 ~title: " varm1-60"
167177 (fun () ->
168178 let subxpr = XOp (XMult , [int_constant_expr 68 ; XVar indexvar]) in
169179 let subxpr = XOp (XMinus , [subxpr; int_constant_expr 60 ]) in
170- let xpr = XOp (XPlus , [XVar basevar; subxpr]) in
171- let xpsuboffset = ConstantOffset (numerical_zero, NoOffset ) in
172- let xpsuboffset = FieldOffset ((" buffer" , compinfo.bckey), xpsuboffset) in
173- let xpmemoffset = ArrayIndexOffset (indexxpr1, xpsuboffset) in
174- let optmeminfo = floc#decompose_memvar_address xpr in
175- XBA. equal_opt_meminfo
176- ~expected: (Some (memref, xpmemoffset))
177- ~received: optmeminfo
178- () );
180+ let xpr = XOp (XPlus , [dwgvxpr; subxpr]) in
181+ let xprvar = floc#get_var_at_address ~btype: BCHBCTypeUtil. t_char xpr in
182+ let xpoffset = ArrayIndexOffset (int_constant_expr 0 , NoOffset ) in
183+ let xpoffset = FieldOffset ((" buffer" , compinfo.bckey), xpoffset) in
184+ let xpoffset = ArrayIndexOffset (indexxpr1, xpoffset) in
185+ let expected_r = finfo#env#add_memory_offset gvar xpoffset in
186+ let expected = TR. to_option expected_r in
187+ match xprvar with
188+ | Ok received ->
189+ XBA. equal_opt_variable
190+ ~expected
191+ ~received: (Some received)
192+ ()
193+ | Error e -> A. fail_msg (" Error: " ^ (String. concat " ; " e)));
179194
180195 (* (((g_data_array + (0x4 * R0_in[4]_in)) + (0x40 * R0_in[4]_in)) - 0x40)) *)
181196
@@ -184,24 +199,29 @@ let decompose_memvar_address_test () =
184199 (fun () ->
185200 let subxpr1 = XOp (XMult , [int_constant_expr 4 ; XVar indexvar]) in
186201 let subxpr2 = XOp (XMult , [int_constant_expr 64 ; XVar indexvar]) in
187- let xpr = XOp (XPlus , [XVar basevar ; subxpr1]) in
202+ let xpr = XOp (XPlus , [dwgvxpr ; subxpr1]) in
188203 let xpr = XOp (XPlus , [xpr; subxpr2]) in
189204 let xpr = XOp (XMinus , [xpr; int_constant_expr 64 ]) in
190- let xpsuboffset = FieldOffset ((" field4" , compinfo.bckey), NoOffset ) in
191- let xpmemoffset = ArrayIndexOffset (indexxpr1, xpsuboffset) in
192- let optmeminfo = floc#decompose_memvar_address xpr in
193- XBA. equal_opt_meminfo
194- ~expected: (Some (memref, xpmemoffset))
195- ~received: optmeminfo
196- () );
197-
205+ let xprvar = floc#get_var_at_address xpr in
206+ let xpoffset = FieldOffset ((" field4" , compinfo.bckey), NoOffset ) in
207+ let xpoffset = ArrayIndexOffset (indexxpr1, xpoffset) in
208+ let expected_r = finfo#env#add_memory_offset gvar xpoffset in
209+ let expected = TR. to_option expected_r in
210+ match xprvar with
211+ | Ok received ->
212+ XBA. equal_opt_variable
213+ ~expected
214+ ~received: (Some received)
215+ ()
216+ | Error e -> A. fail_msg (" Error: " ^ (String. concat " ; " e)));
217+
198218 TS. launch_tests ()
199219 end
200220
201221
202222let () =
203223 begin
204224 TS. new_testfile testname lastupdated;
205- decompose_memvar_address_test () ;
225+ get_var_at_address_test () ;
206226 TS. exit_file ()
207227 end
0 commit comments