@@ -103,19 +103,30 @@ module M :
103103 Log. app (fun m -> m " %c@?" (char_of_int (Int32. to_int c)));
104104 return ()
105105
106- let rec make_str m accu i =
106+ let rec make_str_null_terminated m accu i =
107107 let open Symbolic_choice in
108108 let * p = Symbolic_memory. load_8_u m (Symbolic_i32. of_int32 i) in
109109 match Smtml.Typed. view p with
110110 | Val (Bitv bv ) when Smtml.Bitvector. numbits bv = 32 ->
111111 let c = Smtml.Bitvector. to_int32 bv in
112- if Int32. lt 255l c || Int32. lt c 0l then trap `Invalid_character_in_memory
112+ let ch = char_of_int (Int32. to_int c) in
113+ if Char. equal ch '\x00' then return (List. rev accu |> Array. of_list)
113114 else
114- let ch = char_of_int (Int32. to_int c) in
115- if Char. equal ch '\x00' then return (List. rev accu |> Array. of_list)
116- else make_str m (ch :: accu) (Int32. add i (Int32. of_int 1 ))
115+ make_str_null_terminated m (ch :: accu) (Int32. add i (Int32. of_int 1 ))
117116 | _ -> assert false
118117
118+ let rec make_str_of_length m accu i len =
119+ let open Symbolic_choice in
120+ if len < i then return (List. rev accu |> Array. of_list)
121+ else
122+ let * p = Symbolic_memory. load_8_u m (Symbolic_i32. of_int i) in
123+ match Smtml.Typed. view p with
124+ | Val (Bitv bv ) when Smtml.Bitvector. numbits bv = 32 ->
125+ let c = Smtml.Bitvector. to_int32 bv in
126+ let ch = char_of_int (Int32. to_int c) in
127+ make_str_of_length m (ch :: accu) (succ i) len
128+ | _ -> assert false
129+
119130 let cov_label_is_covered id =
120131 let open Symbolic_choice in
121132 let * id = select_i32 id in
@@ -136,7 +147,7 @@ module M :
136147 Mutex. protect cov_lock @@ fun () ->
137148 if Hashtbl. mem covered_labels id || in_seacoral_store id then abort ()
138149 else
139- let * chars = make_str m [] ptr in
150+ let * chars = make_str_null_terminated m [] ptr in
140151 let str = String. init (Array. length chars) (Array. get chars) in
141152 Hashtbl. add covered_labels id str;
142153 add_label (Int32. to_int id, str)
@@ -148,13 +159,23 @@ module M :
148159 (Smtml.Typed.Unsafe. unwrap ptr) );
149160 assert false
150161
151- let open_scope m ptr =
162+ let open_scope_null_terminated m ptr =
152163 let open Symbolic_choice in
153164 let * ptr = select_i32 ptr in
154- let * chars = make_str m [] ptr in
165+ let * chars = make_str_null_terminated m [] ptr in
155166 let str = String. init (Array. length chars) (Array. get chars) in
156167 open_scope str
157168
169+ let open_scope_of_length m ptr len =
170+ let open Symbolic_choice in
171+ let * ptr = select_i32 ptr in
172+ let ptr = Int32. to_int ptr in
173+ let * len = select_i32 len in
174+ let len = Int32. to_int len in
175+ let * bytes = make_str_of_length m [] ptr len in
176+ let str = String. init len (Array. get bytes) in
177+ open_scope str
178+
158179 let close_scope = Symbolic_choice. close_scope
159180end
160181
@@ -181,7 +202,11 @@ let symbolic_extern_module =
181202 ; ( " cov_label_set"
182203 , Extern_func (memory 0 ^-> i32 ^-> i32 ^->. unit , cov_label_set) )
183204 ; (" cov_label_is_covered" , Extern_func (i32 ^->. i32, cov_label_is_covered))
184- ; (" open_scope" , Extern_func (memory 0 ^-> i32 ^->. unit , open_scope))
205+ ; ( " open_scope_null_terminated"
206+ , Extern_func (memory 0 ^-> i32 ^->. unit , open_scope_null_terminated) )
207+ ; ( " open_scope_of_length"
208+ , Extern_func (memory 0 ^-> i32 ^-> i32 ^->. unit , open_scope_of_length)
209+ )
185210 ; (" close_scope" , Extern_func (unit ^->. unit , close_scope))
186211 ; (" alloc" , Extern_func (memory 0 ^-> i32 ^-> i32 ^->. i32, alloc))
187212 ; (" dealloc" , Extern_func (memory 0 ^-> i32 ^->. i32, free))
0 commit comments