Skip to content

Commit 2cedce5

Browse files
committed
CHT:updates for changes in global variables
1 parent 51d1547 commit 2cedce5

File tree

5 files changed

+195
-109
lines changed

5 files changed

+195
-109
lines changed

CodeHawk/CHT/CHB_tests/bchlib_tests/tbchlib/tCHBchlibAssertion.ml

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ let equal_doubleword =
7171
A.make_equal (fun dw1 dw2 -> dw1#equal dw2) (fun dw -> dw#to_hex_string)
7272

7373

74+
let equal_numerical
75+
?(msg="")
76+
~(expected: numerical_t)
77+
~(received: numerical_t)
78+
() =
79+
A.make_equal
80+
(fun num1 num2 -> num1#equal num2)
81+
(fun num -> num#toString)
82+
~msg
83+
expected
84+
received
85+
86+
7487
let equal_doubleword_result
7588
?(msg="") (dw: doubleword_int) (dwr: doubleword_result) =
7689
if Result.is_error dwr then
@@ -125,10 +138,10 @@ let equal_string_imm_result_string
125138

126139
let equal_array_index_offset
127140
?(msg="")
128-
~(expected: (xpr_t * numerical_t) option)
129-
~(received: (xpr_t * numerical_t) option)
141+
~(expected: (xpr_t * xpr_t) option)
142+
~(received: (xpr_t * xpr_t) option)
130143
() =
131-
let pri (x, n) = "(" ^ (x2s x) ^ ", " ^ n#toString ^ ")" in
144+
let pri (x, r) = "(" ^ (x2s x) ^ ", " ^ (x2s r) ^ ")" in
132145
match (expected, received) with
133146
| (None, None) -> ()
134147
| (Some x, None) ->
@@ -137,8 +150,9 @@ let equal_array_index_offset
137150
A.fail_msg ("Expected None, but received Some " ^ (pri x))
138151
| (Some x1, Some x2) ->
139152
A.make_equal
140-
(fun (x1, n1) (x2, n2) -> ((x2s x1) = (x2s x2)) && n1#equal n2)
141-
(fun (x, n) -> "(" ^ (x2s x) ^ ", " ^ n#toString ^ ")")
153+
(fun (x1, r1) (x2, r2) ->
154+
((x2s x1) = (x2s x2)) && Xprt.syntactically_equal r1 r2)
155+
(fun (x, r) -> "(" ^ (x2s x) ^ ", " ^ (x2s r) ^ ")")
142156
~msg
143157
x1
144158
x2
@@ -190,6 +204,22 @@ let equal_opt_meminfo
190204
x2
191205

192206

207+
let equal_opt_variable
208+
?(msg="")
209+
~(expected:(variable_t) option)
210+
~(received:(variable_t) option)
211+
() =
212+
let pri v = "(" ^ (p2s v#toPretty) ^ ")" in
213+
match expected, received with
214+
| None, None -> ()
215+
| Some v, None ->
216+
A.fail_msg ("Expected Some " ^ (pri v) ^ ", but received None")
217+
| None, Some v ->
218+
A.fail_msg ("Expected None, but received Some " ^ (pri v))
219+
| Some v1, Some v2 ->
220+
A.make_equal (fun v1 v2 -> v1#equal v2) pri ~msg v1 v2
221+
222+
193223
let equal_assignments
194224
?(msg="")
195225
(finfo: function_info_int)

CodeHawk/CHT/CHB_tests/bchlib_tests/tbchlib/tCHBchlibAssertion.mli

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ val e32: int
5454

5555
val equal_doubleword: ?msg:string -> doubleword_int -> doubleword_int -> unit
5656

57+
val equal_numerical:
58+
?msg:string
59+
-> expected:numerical_t
60+
-> received:numerical_t
61+
-> unit
62+
-> unit
5763

5864
val equal_doubleword_result:
5965
?msg:string -> doubleword_int -> doubleword_result -> unit
@@ -79,8 +85,8 @@ val equal_string_imm_result_string:
7985

8086
val equal_array_index_offset:
8187
?msg:string
82-
-> expected:(xpr_t * numerical_t) option
83-
-> received:(xpr_t * numerical_t) option
88+
-> expected:(xpr_t * xpr_t) option
89+
-> received:(xpr_t * xpr_t) option
8490
-> unit
8591
-> unit
8692

@@ -101,6 +107,14 @@ val equal_opt_meminfo:
101107
-> unit
102108

103109

110+
val equal_opt_variable:
111+
?msg:string
112+
-> expected:(variable_t) option
113+
-> received:(variable_t) option
114+
-> unit
115+
-> unit
116+
117+
104118
val equal_assignments:
105119
?msg:string
106120
-> function_info_int

CodeHawk/CHT/CHB_tests/bchlib_tests/txbchlib/bCHFlocTest.ml

Lines changed: 107 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,13 @@
2626
SOFTWARE.
2727
============================================================================= *)
2828

29-
(* chlib *)
30-
open CHNumerical
31-
3229
(* xprlib *)
3330
open Xprt
3431
open XprTypes
3532

3633
(* bchlib *)
3734
open BCHBCFiles
3835
open BCHBCTypes
39-
open BCHConstantDefinitions
4036
open BCHDoubleword
4137
open BCHFloc
4238
open BCHFunctionData
@@ -46,136 +42,155 @@ open BCHLibTypes
4642
(* bchcil *)
4743
open BCHParseCilFile
4844

45+
module A = TCHAssertion
4946
module TR = CHTraceResult
5047
module TS = TCHTestSuite
5148
module XBA = TCHBchlibAssertion
5249

50+
let mmap = BCHGlobalMemoryMap.global_memory_map
51+
5352

5453
let testname = "bCHFlocTest"
5554
let 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 ~removeUnused: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

202222
let () =
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

Comments
 (0)