Skip to content

Commit 8b90183

Browse files
committed
CHB: add more support for conversion to C expressions
1 parent a053f4c commit 8b90183

File tree

6 files changed

+104
-25
lines changed

6 files changed

+104
-25
lines changed

CodeHawk/CHB/bchanalyze/bCHExtractInvariants.ml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ open BCHNumericalConstraints
5454
module H = Hashtbl
5555
module TR = CHTraceResult
5656

57+
let p2s = CHPrettyUtil.pretty_to_string
58+
5759

5860
module ConstraintCollections = CHCollections.Make
5961
(struct
@@ -442,17 +444,19 @@ let extract_valuesets
442444
H.iter (fun k v ->
443445
if H.mem v "valuesets" then
444446
let inv = H.find v "valuesets" in
445-
let flocinv = finfo#finv#get_location_invariant k in
446447
let domain = inv#getDomain "valuesets" in
447448
let varObserver = domain#observer#getNonRelationalVariableObserver in
448449
let vars = domain#observer#getObservedVariables in
449-
let knownvars = flocinv#get_known_variables in
450-
let vars =
451-
List.filter (fun v ->
452-
not (v#isTmp || List.mem v knownvars)) vars in
450+
let vars = List.filter (fun v -> not v#isTmp) vars in
453451
List.iter (fun (v:variable_t) ->
454452
let valueset = (varObserver v)#toValueSet in
455-
if valueset#isTop then () else
453+
if valueset#isTop then
454+
let _ =
455+
log_diagnostics_result
456+
~tag:"value-sets: top"
457+
__FILE__ __LINE__ [k ^ ": " ^ (p2s v#toPretty)] in
458+
()
459+
else
456460
if valueset#removeZeroOffset#isSingleBase then
457461
let (base,offset) = valueset#removeZeroOffset#getSingleBase in
458462
let canbenull:bool = valueset#includesZero in

CodeHawk/CHB/bchlib/bCHGlobalMemoryMap.ml

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,16 @@ object (self)
195195
~(tgtbtype: btype_t option)
196196
(c: bcompinfo_t)
197197
(xoffset: xpr_t): memory_offset_t traceresult =
198+
let is_void_tgtbtype =
199+
match tgtbtype with
200+
| Some (TVoid _) -> true
201+
| _ -> false in
198202
let check_tgttype_compliance (t: btype_t) (s: int) =
199203
match tgtsize, tgtbtype with
200204
| None, None -> true
201205
| Some size, None -> size = s
206+
| Some size, Some (TVoid _) -> size = s
207+
| None, Some (TVoid _) -> true
202208
| None, Some ty -> btype_equal ty t
203209
| Some size, Some ty -> size = s && btype_equal ty t in
204210
let compliance_failure (t: btype_t) (s: int) =
@@ -246,7 +252,10 @@ object (self)
246252
let offset = offset - foff in
247253
tbind
248254
(fun fldtype ->
249-
if offset = 0
255+
if offset = 0 && is_void_tgtbtype then
256+
Ok (Some (FieldOffset
257+
((finfo.bfname, finfo.bfckey), NoOffset)))
258+
else if offset = 0
250259
&& (is_scalar fldtype)
251260
&& (check_tgttype_compliance fldtype sz) then
252261
Ok (Some (FieldOffset
@@ -305,6 +314,47 @@ object (self)
305314
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ":"
306315
^ " xoffset: " ^ (x2s xoffset)
307316
^ "; btype: " ^ (btype_to_string btype)]
317+
| XOp (XPlus, [XOp (XMult, [XConst (IntConst n); XVar v]);
318+
XConst (IntConst m)]) when is_struct_type btype ->
319+
let compinfo = get_struct_type_compinfo btype in
320+
let fldoffset = XConst (IntConst m) in
321+
let memoffset_r =
322+
self#get_field_memory_offset_at
323+
~tgtsize:None ~tgtbtype:None compinfo fldoffset in
324+
TR.tbind
325+
(fun memoffset ->
326+
match memoffset with
327+
| FieldOffset ((fname, fckey), NoOffset) ->
328+
let fcinfo = get_compinfo_by_key fckey in
329+
let field = get_compinfo_field fcinfo fname in
330+
let fieldtype = field.bftype in
331+
if is_array_type fieldtype then
332+
let eltype = get_element_type fieldtype in
333+
let elsize_r = size_of_btype eltype in
334+
TR.tbind
335+
(fun elsize ->
336+
if elsize = n#toInt then
337+
let aoffset = ArrayIndexOffset (XVar v, NoOffset) in
338+
let moffset =
339+
BCHMemoryReference.add_offset memoffset aoffset in
340+
Ok moffset
341+
else
342+
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ":"
343+
^ "field: " ^ fname
344+
^ "; fieldtype: " ^ (btype_to_string fieldtype)
345+
^ "; elementsize: " ^ (string_of_int elsize)
346+
^ "; expected: " ^ n#toString])
347+
elsize_r
348+
else
349+
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
350+
^ "not an array type"]
351+
| _ ->
352+
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ":"
353+
^ "fldoffset: " ^ (x2s fldoffset)
354+
^ "; memoffset: "
355+
^ (BCHMemoryReference.memory_offset_to_string memoffset)])
356+
memoffset_r
357+
308358
| _ ->
309359
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ":"
310360
^ " xoffset: " ^ (x2s xoffset)

CodeHawk/CHB/bchlib/bCHLocationInvariant.ml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,13 @@ module H = Hashtbl
5858
module TR = CHTraceResult
5959

6060

61-
(* let x2p = XprToPretty.xpr_formatter#pr_expr *)
61+
let x2p = XprToPretty.xpr_formatter#pr_expr
6262
let tracked_locations = []
6363

64+
let p2s = CHPrettyUtil.pretty_to_string
65+
let x2s x = p2s (x2p x)
66+
67+
6468
let track_location loc p =
6569
if List.mem loc tracked_locations then
6670
chlog#add ("tracked:" ^ loc) p
@@ -1068,6 +1072,11 @@ object (self)
10681072
(self#get_location_invariant iaddr)#add_fact fact
10691073

10701074
method add_symbolic_expr_fact (iaddr:string) (v:variable_t) (x:xpr_t) =
1075+
let _ =
1076+
log_diagnostics_result
1077+
~tag:("add symbolic-expr fact for " ^ iaddr)
1078+
__FILE__ __LINE__
1079+
[(p2s v#toPretty) ^ ": " ^ (x2s x)] in
10711080
self#add iaddr (NonRelationalFact (v,FSymbolicExpr x))
10721081

10731082
method set_unreachable (iaddr:string) (domain:string) =
@@ -1091,6 +1100,13 @@ object (self)
10911100
(base:symbol_t)
10921101
(i:interval_t)
10931102
(canbenull:bool) =
1103+
let _ =
1104+
log_diagnostics_result
1105+
~tag:("add valueset fact for " ^ iaddr)
1106+
__FILE__ __LINE__
1107+
[(p2s v#toPretty) ^ ": "
1108+
^ "base: " ^ (p2s base#toPretty)
1109+
^ "; offset: " ^ (p2s i#toPretty)] in
10941110
let fact =
10951111
if i#isBottom then
10961112
Unreachable "valuesets"

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_20250401"
99-
~date:"2025-04-01"
98+
~version:"0.6.0_20250417"
99+
~date:"2025-04-17"
100100
~licensee: None
101101
~maxfilesize: None
102102
()

CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -649,9 +649,11 @@ object (self)
649649
match xx with
650650
| XVar _ -> xx
651651
| _ ->
652-
TR.tfold_default
653-
(fun v -> XOp ((Xf "addressofvar"), [(XVar v)]))
654-
xx
652+
TR.tfold
653+
~ok:(fun v -> XOp ((Xf "addressofvar"), [(XVar v)]))
654+
~error:(fun e ->
655+
let _ = log_dc_error_result __FILE__ __LINE__ e in
656+
xx)
655657
(floc#get_var_at_address ~btype:(ptr_deref ptype) xx)
656658
else
657659
xx in
@@ -770,21 +772,23 @@ object (self)
770772
let xrm_r = rm#to_expr floc in
771773
let result_r =
772774
TR.tmap2 (fun xrn xrm -> XOp (XPlus, [xrn; xrm])) xrn_r xrm_r in
775+
let xxrn_r = TR.tmap rewrite_expr xrn_r in
776+
let xxrm_r = TR.tmap rewrite_expr xrm_r in
773777
let rresult_r = TR.tmap rewrite_expr result_r in
778+
let cresult_r =
779+
TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 4)) rresult_r in
774780
let _ =
775781
TR.tfold_default
776782
(fun r -> ignore (get_string_reference floc r)) () rresult_r in
777-
let rdefs = [get_rdef_r xrn_r; get_rdef_r xrm_r] in
778-
let uses = get_def_use_r vrd_r in
779-
let useshigh = get_def_use_high_r vrd_r in
783+
let rdefs =
784+
[get_rdef_r xrn_r; get_rdef_r xrm_r] @ (get_all_rdefs_r rresult_r) in
785+
let uses = [get_def_use_r vrd_r] in
786+
let useshigh = [get_def_use_high_r vrd_r] in
787+
let vars_r = [vrd_r] in
788+
let xprs_r = [xrn_r; xrm_r; result_r; rresult_r; xxrn_r; xxrm_r] in
789+
let cxprs_r = [cresult_r] in
780790
let (tagstring, args) =
781-
mk_instrx_data_r
782-
~vars_r:[vrd_r]
783-
~xprs_r:[xrn_r; xrm_r; result_r; rresult_r]
784-
~rdefs:rdefs
785-
~uses:[uses]
786-
~useshigh:[useshigh]
787-
() in
791+
mk_instrx_data_r ~vars_r ~xprs_r ~cxprs_r ~rdefs ~uses ~useshigh () in
788792
let (tags, args) = add_optional_instr_condition tagstring args c in
789793
(tags, args)
790794

@@ -2285,6 +2289,8 @@ object (self)
22852289
let xrm_r = rm#to_expr floc in
22862290
let result_r =
22872291
TR.tmap2 (fun xrn xrm -> XOp (XMinus, [xrm; xrn])) xrn_r xrm_r in
2292+
let xxrn_r = TR.tmap rewrite_expr xrn_r in
2293+
let xxrm_r = TR.tmap rewrite_expr xrm_r in
22882294
let rresult_r = TR.tmap rewrite_expr result_r in
22892295
let cresult_r =
22902296
TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 4)) rresult_r in
@@ -2293,7 +2299,7 @@ object (self)
22932299
let uses = [get_def_use_r vrd_r] in
22942300
let useshigh = [get_def_use_high_r vrd_r] in
22952301
let vars_r = [vrd_r] in
2296-
let xprs_r = [xrn_r; xrm_r; result_r; rresult_r] in
2302+
let xprs_r = [xrn_r; xrm_r; result_r; rresult_r; xxrn_r; xxrm_r] in
22972303
let cxprs_r = [cresult_r] in
22982304
let (tagstring, args) =
22992305
mk_instrx_data_r ~vars_r ~xprs_r ~cxprs_r ~rdefs ~uses ~useshigh () in

CodeHawk/CHB/bchlibarm32/bCHTranslateARMToCHIF.ml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2345,7 +2345,10 @@ let translate_arm_instruction
23452345
if rl#includes_pc then
23462346
match rtype with
23472347
| TVoid _ -> []
2348-
| _ -> [floc#f#env#mk_arm_register_variable AR0]
2348+
| _ ->
2349+
let r0_op = arm_register_op AR0 RD in
2350+
let xr0 = r0_op#to_expr floc in
2351+
get_use_high_vars_r [xr0]
23492352
else
23502353
[] in
23512354
let popdefcmds =

0 commit comments

Comments
 (0)