Skip to content

Commit 71e8a9e

Browse files
committed
CHB: add error handling
1 parent 3c834eb commit 71e8a9e

File tree

10 files changed

+228
-215
lines changed

10 files changed

+228
-215
lines changed

CodeHawk/CH/chutil/cHLogger.ml

Lines changed: 14 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 Henny B. Sipma
9-
Copyright (c) 2021-2024 Aarno Labs LLC
9+
Copyright (c) 2021-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
@@ -239,3 +239,16 @@ let log_error_result
239239
ch_error_log#add
240240
(tag ^ filename ^ ":" ^ (string_of_int linenumber))
241241
(LBLOCK [STR msg; STR (String.concat "; " error)])
242+
243+
244+
let log_result
245+
?(msg="")
246+
?(tag="")
247+
(filename: string)
248+
(linenumber: int)
249+
(error: string list) =
250+
let tag = if tag = "" then tag else tag ^ ":" in
251+
let msg = if msg = "" then msg else msg ^ ":" in
252+
chlog#add
253+
(tag ^ filename ^ ":" ^ (string_of_int linenumber))
254+
(LBLOCK [STR msg; STR (String.concat "; " error)])

CodeHawk/CH/chutil/cHLogger.mli

Lines changed: 9 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 B. Sipma
9-
Copyright (c) 2022-2024 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
@@ -120,3 +120,11 @@ val log_tfold_default:
120120
making up [error].*)
121121
val log_error_result:
122122
?msg:string -> ?tag:string -> string -> int -> string list -> unit
123+
124+
125+
(** [log_result msg tag filename linenumber error] writes an entry to
126+
[chlog] with a tag that combines [tag], [filename], and [linenumber].
127+
The entry is the concatenation of [msg] and the list of error messages
128+
making up [error].*)
129+
val log_result:
130+
?msg:string -> ?tag:string -> string -> int -> string list -> unit

CodeHawk/CHB/bchlib/bCHFloc.ml

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
Copyright (c) 2005-2020 Kestrel Technology LLC
88
Copyright (c) 2020 Henny Sipma
9-
Copyright (c) 2021-2024 Aarno Labs LLC
9+
Copyright (c) 2021-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
@@ -1261,13 +1261,17 @@ object (self)
12611261
Ok (IndexOffset (v, n#toInt, NoOffset))
12621262
| _ ->
12631263
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1264-
^ "Offset not recognized: " ^ (x2s offset)]) in
1264+
^ "Offset from base "
1265+
^ (x2s (XVar base))
1266+
^ " not recognized: " ^ (x2s offset)]) in
12651267
(memref_r, memoff_r)
12661268

12671269
(* no known pointers, have to find a base *)
12681270
| [] ->
12691271
let maxC = largest_constant_term x in
1270-
if maxC#gt system_info#get_image_base#to_numerical then
1272+
let maxCdw = TR.tvalue (numerical_to_doubleword maxC) ~default:wordzero in
1273+
(* if maxC#gt system_info#get_image_base#to_numerical then *)
1274+
if system_info#is_code_address maxCdw then
12711275
(* global base *)
12721276
let memref_r = Ok self#env#mk_global_memory_reference in
12731277
let offset = simplify_xpr (XOp (XMinus, [x; num_constant_expr maxC])) in
@@ -1282,7 +1286,10 @@ object (self)
12821286
Ok (IndexOffset (v, n#toInt, NoOffset))
12831287
| _ ->
12841288
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1285-
^ "Offset not recognized: " ^ (x2s offset)] in
1289+
^ (p2s self#l#toPretty) ^ ": "
1290+
^ "Offset from global base "
1291+
^ maxC#toString
1292+
^ " not recognized: " ^ (x2s offset)] in
12861293
let memoff_r =
12871294
tmap
12881295
(fun gmemoff -> ConstantOffset (maxC, gmemoff))
@@ -1304,7 +1311,10 @@ object (self)
13041311
Ok (IndexOffset (v, n#toInt, NoOffset))
13051312
| _ ->
13061313
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1307-
^ "Offset not recognized: " ^ (x2s offset)] in
1314+
^ (p2s self#l#toPretty) ^ ": "
1315+
^ "Offset from base "
1316+
^ (x2s (XVar base))
1317+
^ " not recognized: " ^ (x2s offset)] in
13081318
(memref_r, memoff_r)
13091319

13101320
| [base] when (self#env#is_stack_parameter_variable base)
@@ -1330,13 +1340,17 @@ object (self)
13301340
Ok (IndexOffset (v, n#toInt, NoOffset))
13311341
| _ ->
13321342
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1333-
^ "Offset not recognized: " ^ (x2s offset)])
1343+
^ (p2s self#l#toPretty) ^ ": "
1344+
^ "Offset from base "
1345+
^ (x2s (XVar base))
1346+
^ " not recognized: " ^ (x2s offset)])
13341347
base_r in
13351348
(memref_r, memoff_r)
13361349

13371350
| [v] ->
13381351
let memref_r =
13391352
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1353+
^ (p2s self#l#toPretty) ^ ": "
13401354
^ "No candidate base pointers. Only variable found: "
13411355
^ (p2s v#toPretty)] in
13421356
let memoff_r =
@@ -1346,6 +1360,7 @@ object (self)
13461360
| [] ->
13471361
let memref_r =
13481362
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1363+
^ (p2s self#l#toPretty) ^ ": "
13491364
^ "No candidate pointers. Left with maxC: "
13501365
^ maxC#toString] in
13511366
let memoff_r =
@@ -1356,6 +1371,7 @@ object (self)
13561371
| _ ->
13571372
let memref_r =
13581373
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1374+
^ (p2s self#l#toPretty) ^ ": "
13591375
^ "Multiple variables: "
13601376
^ (String.concat "; "
13611377
(List.map (fun v -> p2s v#toPretty) vars))] in
@@ -1367,6 +1383,7 @@ object (self)
13671383
| _ ->
13681384
let memref_r =
13691385
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
1386+
^ (p2s self#l#toPretty) ^ ": "
13701387
^ "Multiple known pointers: "
13711388
^ (String.concat "; "
13721389
(List.map (fun v -> p2s v#toPretty) knownpointers))] in

CodeHawk/CHB/bchlib/bCHFunctionInfo.ml

Lines changed: 38 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
Copyright (c) 2005-2020 Kestrel Technology LLC
88
Copyright (c) 2020 Henny Sipma
9-
Copyright (c) 2021-2024 Aarno Labs LLC
9+
Copyright (c) 2021-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
@@ -82,6 +82,7 @@ module TR = CHTraceResult
8282

8383
let x2p = xpr_formatter#pr_expr
8484
let p2s = CHPrettyUtil.pretty_to_string
85+
let x2s x = p2s (x2p x)
8586

8687

8788
let log_error (tag: string) (msg: string): tracelogspec_t =
@@ -1761,38 +1762,32 @@ object (self)
17611762
method save_register
17621763
(vmem: variable_t) (iaddr:ctxt_iaddress_t) (reg:register_t) =
17631764
if self#env#is_stack_variable vmem then
1764-
log_tfold
1765-
(log_error "save_register" "invalid offset")
1765+
TR.tfold
17661766
~ok:(fun offset ->
17671767
match offset with
17681768
| ConstantOffset (n, NoOffset) ->
17691769
self#stackframe#add_register_spill ~offset:n#toInt reg iaddr
17701770
| _ ->
1771-
ch_error_log#add
1772-
"save_register:no offset"
1773-
(LBLOCK [
1774-
self#get_address#toPretty;
1775-
STR " ";
1776-
STR iaddr;
1777-
STR ": ";
1778-
vmem#toPretty;
1779-
STR " (";
1780-
STR (register_to_string reg);
1781-
STR ")"]))
1782-
~error:(fun _ -> ())
1771+
log_error_result
1772+
~msg:"save_register:not a constant offset"
1773+
__FILE__ __LINE__
1774+
["(" ^ (p2s self#get_address#toPretty) ^ "," ^ iaddr ^ "): ";
1775+
(p2s vmem#toPretty) ^ " with " ^ (register_to_string reg)
1776+
^ " and offset " ^ (memory_offset_to_string offset)])
1777+
~error:(fun e ->
1778+
log_error_result
1779+
~msg:"save_register"
1780+
__FILE__ __LINE__
1781+
(["(" ^ (p2s self#get_address#toPretty) ^ "," ^ iaddr ^ "): ";
1782+
(p2s vmem#toPretty) ^ " with " ^ (register_to_string reg)] @ e))
17831783
(self#env#get_memvar_offset vmem)
17841784
else
1785-
ch_error_log#add
1786-
"save_register:not a stack variable"
1787-
(LBLOCK [
1788-
self#get_address#toPretty;
1789-
STR " ";
1790-
STR iaddr;
1791-
STR ": ";
1792-
vmem#toPretty;
1793-
STR " (";
1794-
STR (register_to_string reg);
1795-
STR ")"])
1785+
log_error_result
1786+
~msg:"save register:not a stack variable"
1787+
__FILE__ __LINE__
1788+
["(" ^ (p2s self#get_address#toPretty) ^ "," ^ iaddr ^ "): ";
1789+
"not a stack variable: "
1790+
^ (p2s vmem#toPretty) ^ " with " ^ (register_to_string reg)]
17961791

17971792
method restore_register
17981793
(memaddr: xpr_t) (iaddr:ctxt_iaddress_t) (reg:register_t) =
@@ -1803,54 +1798,30 @@ object (self)
18031798
| XConst (IntConst n) ->
18041799
self#stackframe#add_register_restore ~offset:n#neg#toInt reg iaddr
18051800
| _ ->
1806-
ch_error_log#add
1807-
"restore_register:no offset"
1808-
(LBLOCK [
1809-
self#get_address#toPretty;
1810-
STR " ";
1811-
STR iaddr;
1812-
STR ": ";
1813-
x2p memaddr;
1814-
STR " (";
1815-
STR (register_to_string reg);
1816-
STR ")"])
1801+
log_error_result
1802+
~msg:"restore register:not a constant offset"
1803+
__FILE__ __LINE__
1804+
["(" ^ (p2s self#get_address#toPretty) ^ "," ^ iaddr ^ ")";
1805+
(x2s memaddr)]
18171806
else
1818-
ch_error_log#add
1819-
"restore_register:not an initial value"
1820-
(LBLOCK [
1821-
self#get_address#toPretty;
1822-
STR " ";
1823-
STR iaddr;
1824-
STR ": ";
1825-
x2p memaddr;
1826-
STR " (";
1827-
STR (register_to_string reg);
1828-
STR ")"])
1807+
()
18291808
| _ ->
1830-
ch_error_log#add
1831-
"restore_register:not a stack address"
1832-
(LBLOCK [
1833-
self#get_address#toPretty;
1834-
STR " ";
1835-
STR iaddr;
1836-
STR ": ";
1837-
x2p memaddr;
1838-
STR " (";
1839-
STR (register_to_string reg);
1840-
STR ")"])
1809+
()
18411810

18421811
method saved_registers_to_pretty =
18431812
let p = ref [] in
18441813
let _ =
1845-
H.iter (fun _ s -> p := (LBLOCK [ s#toPretty ; NL ]) :: !p) saved_registers in
1814+
H.iter (fun _ s -> p := (LBLOCK [s#toPretty; NL]) :: !p) saved_registers in
18461815
match !p with
18471816
[] ->
1848-
LBLOCK [ STR (string_repeat "~" 80) ; NL ; STR "No saved registers" ; NL ;
1849-
STR (string_repeat "~" 80) ; NL ]
1817+
LBLOCK [
1818+
STR (string_repeat "~" 80); NL; STR "No saved registers"; NL;
1819+
STR (string_repeat "~" 80); NL]
18501820
| l ->
1851-
LBLOCK [ STR "Saved Registers" ; NL ; STR (string_repeat "~" 80) ; NL ;
1852-
LBLOCK l ; NL ;
1853-
STR (string_repeat "~" 80) ; NL]
1821+
LBLOCK [
1822+
STR "Saved Registers"; NL; STR (string_repeat "~" 80); NL;
1823+
LBLOCK l; NL;
1824+
STR (string_repeat "~" 80); NL]
18541825

18551826
method set_nonreturning =
18561827
if nonreturning then () else
@@ -1877,7 +1848,8 @@ object (self)
18771848
(LBLOCK [
18781849
function_interface_to_pretty fs#get_function_interface;
18791850
STR " with function signature ";
1880-
STR (btype_to_string fs#get_function_interface.fintf_type_signature.fts_returntype)])
1851+
STR (btype_to_string
1852+
fs#get_function_interface.fintf_type_signature.fts_returntype)])
18811853
end
18821854

18831855
method read_xml_user_summary (node:xml_element_int) =

CodeHawk/CHB/bchlib/bCHMemoryRecorder.ml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ module TR = CHTraceResult
5151

5252
let x2p = xpr_formatter#pr_expr
5353
let p2s = CHPrettyUtil.pretty_to_string
54+
let x2s x = p2s (x2p x)
5455

5556
let mmap = BCHGlobalMemoryMap.global_memory_map
5657

@@ -263,9 +264,15 @@ object (self)
263264
when mmap#is_global_data_address
264265
(numerical_mod_to_doubleword n) ->
265266
mmap#add_gload self#faddr iaddr addr size signed
267+
| XConst (IntConst n) ->
268+
log_result __FILE__ __LINE__
269+
["memrecorder:literal load not recorded";
270+
p2s self#loc#toPretty;
271+
p2s (numerical_mod_to_doubleword n)#toPretty]
266272
| _ ->
267-
log_error_result __FILE__ __LINE__
268-
["memrecorder:global"; p2s self#loc#toPretty])
273+
log_result __FILE__ __LINE__
274+
["memrecorder:load not recorded";
275+
p2s self#loc#toPretty; (x2s addr)])
269276
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
270277
addr_r)
271278
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
@@ -367,7 +374,8 @@ object (self)
367374
mmap#add_gstore self#faddr iaddr addr size optvalue
368375
| _ ->
369376
log_error_result __FILE__ __LINE__
370-
["memrecorder:global"; p2s self#loc#toPretty])
377+
["memrecorder: store not recorded";
378+
p2s self#loc#toPretty; (x2s addr)])
371379
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
372380
addr_r)
373381
~error:(fun e -> log_error_result __FILE__ __LINE__ e)

0 commit comments

Comments
 (0)