@@ -28,6 +28,7 @@ const HostImportSpec = wasm_host_imports.ImportSpec;
2828
2929fn get_map_binary (env : * e.ErlNifEnv , map : e.ErlNifTerm , key : [:0 ]const u8 ) ! []const u8 {
3030 const key_term = beam .make_into_atom (key , .{ .env = env });
31+ // SAFETY: `enif_get_map_value` initializes `value_term` before it is read.
3132 var value_term : e.ErlNifTerm = undefined ;
3233 if (e .enif_get_map_value (env , map , key_term .v , & value_term ) == 0 ) return error .BadArg ;
3334 return beam .get ([]const u8 , .{ .v = value_term }, .{ .env = env });
@@ -43,7 +44,9 @@ fn parse_host_imports(env: *e.ErlNifEnv, imports: beam.term) ![]HostImportSpec {
4344 var list = imports .v ;
4445 var index : usize = 0 ;
4546 while (index < result .len ) : (index += 1 ) {
47+ // SAFETY: `enif_get_list_cell` initializes `head` and `tail` on success before use.
4648 var head : e.ErlNifTerm = undefined ;
49+ // SAFETY: `enif_get_list_cell` initializes `head` and `tail` on success before use.
4750 var tail : e.ErlNifTerm = undefined ;
4851 if (e .enif_get_list_cell (env , list , & head , & tail ) == 0 ) return error .BadArg ;
4952
@@ -67,6 +70,7 @@ fn next_host_call_id() u64 {
6770}
6871
6972fn extract_error_message (env : * e.ErlNifEnv , term : e.ErlNifTerm , fallback : []const u8 ) []const u8 {
73+ // SAFETY: `enif_inspect_binary` initializes `bin` on success before it is read.
7074 var bin : e.ErlNifBinary = undefined ;
7175 if (e .enif_inspect_binary (env , term , & bin ) != 0 and bin .size > 0 ) {
7276 return bin .data [0.. bin .size ];
@@ -256,6 +260,7 @@ fn parse_f64_term(env: *e.ErlNifEnv, term: beam.term) !f64 {
256260}
257261
258262fn term_to_wasm_val (env : * e.ErlNifEnv , term : beam.term , kind : wamr.wasm_valkind_t ) ! wamr.wasm_val_t {
263+ // SAFETY: `value` is fully populated in the kind-specific branch before it is returned.
259264 var value : wamr.wasm_val_t = undefined ;
260265 value .kind = kind ;
261266 value ._paddings = [_ ]u8 {0 } ** 7 ;
@@ -509,6 +514,7 @@ pub fn wasm_memory_grow(inst_res: WasmInstanceResource, delta: u32) beam.term {
509514
510515pub fn wasm_read_memory (inst_res : WasmInstanceResource , offset : u32 , length : u32 ) beam.term {
511516 const env = beam .context .env orelse return make_error ("no env" );
517+ // SAFETY: `enif_alloc_binary` initializes `bin` on success before it is passed on.
512518 var bin : e.ErlNifBinary = undefined ;
513519 if (e .enif_alloc_binary (length , & bin ) == 0 ) return make_error ("out of memory" );
514520
@@ -538,6 +544,7 @@ pub fn wasm_read_global(inst_res: WasmInstanceResource, name: []const u8) beam.t
538544 defer std .heap .c_allocator .free (name_z );
539545
540546 var err_buf : [256 ]u8 = undefined ;
547+ // SAFETY: WAMR initializes `value` on successful global reads before it is used.
541548 var value : wamr.wasm_val_t = undefined ;
542549
543550 if (! wamr .wamr_bridge_read_global (inst , name_z .ptr , & value , & err_buf , err_buf .len )) {
@@ -557,6 +564,7 @@ pub fn wasm_write_global(inst_res: WasmInstanceResource, name: []const u8, value
557564 defer std .heap .c_allocator .free (name_z );
558565
559566 var err_buf : [256 ]u8 = undefined ;
567+ // SAFETY: WAMR initializes `current` on successful global reads before it is inspected.
560568 var current : wamr.wasm_val_t = undefined ;
561569
562570 if (! wamr .wamr_bridge_read_global (inst , name_z .ptr , & current , & err_buf , err_buf .len )) {
0 commit comments