Skip to content

Commit 32ab47a

Browse files
committed
CHB: improved handling of sideeffect values
1 parent 4878356 commit 32ab47a

File tree

9 files changed

+108
-37
lines changed

9 files changed

+108
-37
lines changed

CodeHawk/CHB/bchlib/bCHCallSemanticsRecorder.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,14 +297,15 @@ object (self)
297297
XPOBlockWrite (ty, addr, size)) ->
298298
(match self#termev#xpr_local_stack_address addr with
299299
| Some offset ->
300+
let numoffset = (CHNumerical.mkNumerical offset)#neg in
300301
let csize =
301302
match size with
302303
| XConst (IntConst n) -> Some n#toInt
303304
| _ ->
304305
TR.tfold_default (fun s -> Some s) None (size_of_btype ty) in
305306
let sevalue =
306-
self#finfo#env#mk_side_effect_value
307-
self#loc#ci (bterm_to_string taddr) in
307+
self#finfo#env#mk_stack_sideeffect_value
308+
~btype:(Some ty) self#loc#ci numoffset (bterm_to_string taddr) in
308309
self#finfo#stackframe#add_block_write
309310
~offset:(-offset)
310311
~size:csize

CodeHawk/CHB/bchlib/bCHFloc.ml

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,22 @@ object (self)
228228
end
229229

230230

231+
class default_bterm_evaluator_t
232+
(finfo: function_info_int)
233+
(_callargs: (fts_parameter_t * xpr_t) list): bterm_evaluator_int =
234+
object
235+
236+
method finfo = finfo
237+
method bterm_xpr (_t: bterm_t) = None
238+
method xpr_local_stack_address (_x: xpr_t) = None
239+
method bterm_stack_address (_t: bterm_t) = None
240+
method constant_bterm (_t: bterm_t) = None
241+
242+
end
243+
244+
let default_bterm_evaluator = new default_bterm_evaluator_t
245+
246+
231247
class arm_bterm_evaluator_t
232248
(finfo: function_info_int)
233249
(callargs: (fts_parameter_t * xpr_t) list): bterm_evaluator_int =
@@ -2725,12 +2741,14 @@ object (self)
27252741
end
27262742
| _ -> ()
27272743

2728-
method private get_sideeffect_assign (side_effect: xxpredicate_t) =
2744+
method private get_sideeffect_assign
2745+
(termev: bterm_evaluator_int) (side_effect: xxpredicate_t) =
27292746
let msg =
27302747
LBLOCK [
27312748
self#l#toPretty; STR ": "; xxpredicate_to_pretty side_effect] in
2732-
match side_effect with
2733-
| XXBlockWrite (ty, dest, size) ->
2749+
let xpo = BCHXPOPredicate.xxp_to_xpo_predicate termev self#l side_effect in
2750+
match (side_effect, xpo) with
2751+
| (XXBlockWrite (_, dest, size), XPOBlockWrite (ty, adest, _)) ->
27342752
let get_index_size k =
27352753
match get_size_of_type ty with
27362754
| Ok s -> num_constant_expr (k#mult (mkNumerical s))
@@ -2774,7 +2792,13 @@ object (self)
27742792
end)
27752793
(numerical_to_doubleword n)
27762794
| _ ->
2777-
self#env#mk_side_effect_value self#cia (bterm_to_string dest) in
2795+
(match termev#xpr_local_stack_address adest with
2796+
| Some offset ->
2797+
let numoffset = (CHNumerical.mkNumerical offset)#neg in
2798+
self#env#mk_stack_sideeffect_value
2799+
~btype:(Some ty) self#cia numoffset (bterm_to_string dest)
2800+
| _ ->
2801+
self#env#mk_side_effect_value self#cia (bterm_to_string dest)) in
27782802
let seAssign =
27792803
let _ =
27802804
chlog#add
@@ -2799,7 +2823,7 @@ object (self)
27992823
[]
28002824
end
28012825
end
2802-
| XXStartsThread (sa, _pars) ->
2826+
| (XXStartsThread (sa, _pars), _) ->
28032827
let _ =
28042828
match self#evaluate_summary_term sa self#env#mk_num_temp with
28052829
| XConst (IntConst n) ->
@@ -2825,8 +2849,9 @@ object (self)
28252849
method private record_precondition_effects (sem:function_semantics_t) =
28262850
List.iter self#record_precondition_effect sem.fsem_pre
28272851

2828-
method get_sideeffect_assigns (sem:function_semantics_t) =
2829-
List.concat (List.map self#get_sideeffect_assign sem.fsem_sideeffects)
2852+
method get_sideeffect_assigns
2853+
(termev: bterm_evaluator_int) (sem:function_semantics_t) =
2854+
List.concat (List.map (self#get_sideeffect_assign termev) sem.fsem_sideeffects)
28302855

28312856
(* Records reads of global memory *)
28322857
method private record_memory_reads (pres:xxpredicate_t list) =
@@ -2896,7 +2921,8 @@ object (self)
28962921

28972922
(* ------------------------------------------------- assign side effects *)
28982923
let sideEffectAssigns =
2899-
self#get_sideeffect_assigns self#get_call_target#get_semantics in
2924+
let termev = default_bterm_evaluator self#f [] in
2925+
self#get_sideeffect_assigns termev self#get_call_target#get_semantics in
29002926
let _ =
29012927
self#record_precondition_effects self#get_call_target#get_semantics in
29022928

@@ -3032,7 +3058,7 @@ object (self)
30323058
List.filter self#env#is_global_variable self#env#get_variables in
30333059
[ABSTRACT_VARS globals] in
30343060
let sideeffect_assigns =
3035-
self#get_sideeffect_assigns self#get_call_target#get_semantics in
3061+
self#get_sideeffect_assigns termev self#get_call_target#get_semantics in
30363062
let _ =
30373063
self#record_memory_reads self#get_call_target#get_semantics.fsem_pre in
30383064
let defClobbered = List.map (fun r -> (ARMRegister r)) arm_temporaries in

CodeHawk/CHB/bchlib/bCHFloc.mli

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
Copyright (c) 2005-2019 Kestrel Technology LLC
88
Copyright (c) 2020-2021 Henny Sipma
9-
Copyright (c) 2022-2023 Aarno Labs LLC
9+
Copyright (c) 2022-2025 Aarno Labs LLC
1010
1111
Permission is hereby granted, free of charge, to any person obtaining a copy
1212
of this software and associated documentation files (the "Software"), to deal
@@ -27,6 +27,9 @@
2727
SOFTWARE.
2828
============================================================================= *)
2929

30+
(* xprlib *)
31+
open XprTypes
32+
3033
(* bchlib *)
3134
open BCHLibTypes
3235

@@ -60,3 +63,5 @@ val get_i_floc:
6063
-> floc_int
6164

6265

66+
val default_bterm_evaluator:
67+
function_info_int -> (fts_parameter_t * xpr_t) list -> bterm_evaluator_int

CodeHawk/CHB/bchlib/bCHFunctionInfo.ml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -995,12 +995,18 @@ object (self)
995995
self#mk_variable (varmgr#make_calltarget_value tgt)
996996

997997
method mk_global_sideeffect_value
998-
(iaddr: ctxt_iaddress_t) (gaddr: doubleword_int) (arg: string) =
999-
self#mk_variable (varmgr#make_global_sideeffect_value iaddr arg gaddr)
998+
?(btype=None)
999+
(iaddr: ctxt_iaddress_t)
1000+
(gaddr: doubleword_int)
1001+
(arg: string) =
1002+
self#mk_variable (varmgr#make_global_sideeffect_value ~btype iaddr arg gaddr)
10001003

10011004
method mk_stack_sideeffect_value
1002-
(iaddr: ctxt_iaddress_t) (offset: numerical_t) (arg: string) =
1003-
self#mk_variable (varmgr#make_stack_sideeffect_value iaddr arg offset)
1005+
?(btype=None)
1006+
(iaddr: ctxt_iaddress_t)
1007+
(offset: numerical_t)
1008+
(arg: string) =
1009+
self#mk_variable (varmgr#make_stack_sideeffect_value ~btype iaddr arg offset)
10041010

10051011
method mk_side_effect_value (iaddr:ctxt_iaddress_t) (arg:string) =
10061012
self#mk_variable (varmgr#make_side_effect_value iaddr "sev" arg)

CodeHawk/CHB/bchlib/bCHLibTypes.mli

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3563,6 +3563,7 @@ and constant_value_variable_t =
35633563
| SideEffectValue of
35643564
ctxt_iaddress_t (* callsite *)
35653565
* string (* name of parameter *)
3566+
* btype_t option (* type of value *)
35663567
* sideeffect_argument_location_t (* location of argument passed *)
35673568
(** [SideEffectValue (iaddr, name, seloc] represents the value
35683569
assigned by the callee at call site [iaddr] to the parameter with
@@ -3932,9 +3933,17 @@ object
39323933
method make_function_pointer_value:
39333934
string -> string -> ctxt_iaddress_t -> assembly_variable_int
39343935
method make_global_sideeffect_value:
3935-
ctxt_iaddress_t -> string -> doubleword_int -> assembly_variable_int
3936+
?btype:btype_t option
3937+
-> ctxt_iaddress_t
3938+
-> string
3939+
-> doubleword_int
3940+
-> assembly_variable_int
39363941
method make_stack_sideeffect_value:
3937-
ctxt_iaddress_t -> string -> numerical_t -> assembly_variable_int
3942+
?btype:btype_t option
3943+
-> ctxt_iaddress_t
3944+
-> string
3945+
-> numerical_t
3946+
-> assembly_variable_int
39383947
method make_side_effect_value:
39393948
ctxt_iaddress_t -> string -> string -> assembly_variable_int
39403949
method make_field_value: string -> int -> string -> assembly_variable_int
@@ -4852,9 +4861,17 @@ class type function_environment_int =
48524861
method mk_function_pointer_value:
48534862
string -> string -> ctxt_iaddress_t -> variable_t
48544863
method mk_global_sideeffect_value:
4855-
ctxt_iaddress_t -> doubleword_int -> string -> variable_t
4864+
?btype:btype_t option
4865+
-> ctxt_iaddress_t
4866+
-> doubleword_int
4867+
-> string
4868+
-> variable_t
48564869
method mk_stack_sideeffect_value:
4857-
ctxt_iaddress_t -> numerical_t -> string -> variable_t
4870+
?btype:btype_t option
4871+
-> ctxt_iaddress_t
4872+
-> numerical_t
4873+
-> string
4874+
-> variable_t
48584875
method mk_side_effect_value: ctxt_iaddress_t -> string -> variable_t
48594876
method mk_field_value: string -> int -> string -> variable_t
48604877
method mk_symbolic_value: xpr_t -> variable_t
@@ -6266,7 +6283,8 @@ class type floc_int =
62666283
method get_conditional_assign_commands:
62676284
xpr_t -> variable_t -> xpr_t -> cmd_t list
62686285

6269-
method get_sideeffect_assigns: function_semantics_t -> cmd_t list
6286+
method get_sideeffect_assigns:
6287+
bterm_evaluator_int -> function_semantics_t -> cmd_t list
62706288

62716289
(** {2 Variable abstraction}*)
62726290

CodeHawk/CHB/bchlib/bCHVarDictionary.ml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ object (self)
9191
tables <- [
9292
memory_base_table;
9393
memory_offset_table;
94+
sideeffect_argument_location_table;
9495
assembly_variable_denotation_table;
9596
constant_value_variable_table;
9697
stack_access_table
@@ -243,9 +244,11 @@ object (self)
243244
| FunctionPointer (s1, s2, a) ->
244245
(tags @ [a], [bd#index_string s1; bd#index_string s2])
245246
| CallTargetValue t -> (tags, [id#index_call_target t])
246-
| SideEffectValue (a, name, seloc) ->
247+
| SideEffectValue (a, name, optty, seloc) ->
247248
(tags @ [a],
248-
[bd#index_string name; self#index_sideeffect_argument_location seloc])
249+
[bd#index_string name;
250+
(match optty with Some ty -> bcd#index_typ ty | _ -> (-1));
251+
self#index_sideeffect_argument_location seloc])
249252
| BridgeVariable (a,i) -> (tags @ [a], [i])
250253
| FieldValue (sname,offset,fname) ->
251254
(tags, [bd#index_string sname; offset; bd#index_string fname])
@@ -272,7 +275,10 @@ object (self)
272275
| "ct" -> CallTargetValue (id#get_call_target (a 0))
273276
| "se" ->
274277
SideEffectValue
275-
(t 1, bd#get_string (a 0), self#get_sideeffect_argument_location (a 1))
278+
(t 1,
279+
bd#get_string (a 0),
280+
(if (a 1) > 0 then Some (bcd#get_typ (a 1)) else None),
281+
self#get_sideeffect_argument_location (a 2))
276282
| "bv" -> BridgeVariable (t 1, a 0)
277283
| "fv" -> FieldValue (bd#get_string (a 0), a 1, bd#get_string (a 2))
278284
| "sv" -> SymbolicValue (xd#get_xpr (a 0))

CodeHawk/CHB/bchlib/bCHVariable.ml

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ object (self:'a)
121121
"staticstub_" ^ (function_stub_to_string fs)
122122
| AppTarget a -> "tgt_" ^ a#to_hex_string
123123
| _ -> "tgt_qq_")
124-
| SideEffectValue (address,arg,_) -> "se_" ^ address ^ "_" ^ arg
124+
| SideEffectValue (address, arg, _, _) -> "se_" ^ address ^ "_" ^ arg
125125
| FieldValue (sname,offset,fname) ->
126126
sname ^ "." ^ fname ^ "_amp_" ^ (string_of_int offset)
127127
| SymbolicValue x -> "sv__" ^ (string_of_int (vard#xd#index_xpr x)) ^ "__sv"
@@ -191,6 +191,7 @@ object (self:'a)
191191
| TypeCastValue (_, _, ty, _) -> Some ty
192192
| SyscallErrorReturnValue _ -> None
193193
| CallTargetValue _ -> None
194+
| SideEffectValue (_, _, Some ty, _) -> Some ty
194195
| SideEffectValue _ -> None
195196
| FieldValue _ -> None
196197
| SymbolicValue _ -> None
@@ -235,12 +236,12 @@ object (self:'a)
235236

236237
method is_global_sideeffect =
237238
match denotation with
238-
| AuxiliaryVariable (SideEffectValue (_, _, SEGlobal _)) -> true
239+
| AuxiliaryVariable (SideEffectValue (_, _, _, SEGlobal _)) -> true
239240
| _ -> false
240241

241242
method get_global_sideeffect_target_address: doubleword_result =
242243
match denotation with
243-
| AuxiliaryVariable (SideEffectValue (_, _, SEGlobal dw)) -> Ok dw
244+
| AuxiliaryVariable (SideEffectValue (_, _, _, SEGlobal dw)) -> Ok dw
244245
| _ ->
245246
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
246247
^ "Variable is not a global sideeffect value: "
@@ -278,15 +279,15 @@ object (self:'a)
278279
method get_call_site: ctxt_iaddress_t traceresult =
279280
match denotation with
280281
| (AuxiliaryVariable (FunctionReturnValue a))
281-
| (AuxiliaryVariable (SideEffectValue (a, _, _))) -> Ok a
282+
| (AuxiliaryVariable (SideEffectValue (a, _, _, _))) -> Ok a
282283
| _ ->
283284
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
284285
^ "Variable is not a function return value or sideeffect value: "
285286
^ self#get_name]
286287

287288
method get_se_argument_descriptor: string traceresult =
288289
match denotation with
289-
| (AuxiliaryVariable (SideEffectValue (_, name, _))) -> Ok name
290+
| (AuxiliaryVariable (SideEffectValue (_, name, _, _))) -> Ok name
290291
| _ -> Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
291292
^ "Variable is not a sideeffect value: " ^ self#get_name]
292293

@@ -641,6 +642,7 @@ object (self)
641642
| InitialRegisterValue (PowerSPRegister _, _)
642643
| InitialMemoryValue _
643644
| FunctionReturnValue _
645+
| SideEffectValue _
644646
| TypeCastValue _ ->
645647
Ok (memrefmgr#mk_basevar_reference v)
646648
| _ ->
@@ -697,17 +699,23 @@ object (self)
697699
self#mk_variable (AuxiliaryVariable (CallTargetValue tgt))
698700

699701
method make_global_sideeffect_value
700-
(iaddr: ctxt_iaddress_t) (arg: string) (gaddr: doubleword_int) =
701-
let sev = SideEffectValue (iaddr, arg, SEGlobal gaddr) in
702+
?(btype=None)
703+
(iaddr: ctxt_iaddress_t)
704+
(arg: string)
705+
(gaddr: doubleword_int) =
706+
let sev = SideEffectValue (iaddr, arg, btype, SEGlobal gaddr) in
702707
self#mk_variable (AuxiliaryVariable sev)
703708

704709
method make_stack_sideeffect_value
705-
(iaddr: ctxt_iaddress_t) (arg: string) (stackoffset: numerical_t) =
706-
let sev = SideEffectValue (iaddr, arg, SEStack stackoffset) in
710+
?(btype=None)
711+
(iaddr: ctxt_iaddress_t)
712+
(arg: string)
713+
(stackoffset: numerical_t) =
714+
let sev = SideEffectValue (iaddr, arg, btype, SEStack stackoffset) in
707715
self#mk_variable (AuxiliaryVariable sev)
708716

709717
method make_side_effect_value (iaddr:ctxt_iaddress_t) (descr: string) (arg:string) =
710-
let sev = SideEffectValue (iaddr, arg, SEDescr descr) in
718+
let sev = SideEffectValue (iaddr, arg, None, SEDescr descr) in
711719
self#mk_variable (AuxiliaryVariable sev)
712720

713721
method make_field_value (sname:string) (offset:int) (fname:string) =

CodeHawk/CHB/bchlib/bCHVersion.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ end
9595

9696

9797
let version = new version_info_t
98-
~version:"0.6.0_20250803"
99-
~date:"2025-08-03"
98+
~version:"0.6.0_20250804"
99+
~date:"2025-08-04"
100100
~licensee: None
101101
~maxfilesize: None
102102
()

CodeHawk/CHB/bchlibx86/bCHPredefinedUtil.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,8 @@ let get_esp_adjustment_assign (summary: function_summary_int) (floc: floc_int) =
514514

515515

516516
let get_side_effects summary floc =
517-
floc#get_sideeffect_assigns summary#get_function_semantics
517+
let termev = BCHFloc.default_bterm_evaluator floc#f [] in
518+
floc#get_sideeffect_assigns termev summary#get_function_semantics
518519

519520

520521
class virtual predefined_callsemantics_base_t (md5hash:string) (instrs:int) =

0 commit comments

Comments
 (0)