编译为 Wasm 时,指向堆分配内存的 Rust 指针可以为 0 吗?
Posted
技术标签:
【中文标题】编译为 Wasm 时,指向堆分配内存的 Rust 指针可以为 0 吗?【英文标题】:Can a Rust pointer to heap-allocated memory be 0 when compiled to Wasm? 【发布时间】:2020-09-14 11:19:06 【问题描述】:在编译成 Wasm 的 Rust 代码中进行堆分配内存时,会分配 Wasm 线性内存中的内存。
我是否正确理解指针的值是该内存中的偏移量?如果是,是否可以将值0
作为偏移量/指针并有效?
一个简单的例子是:
let data: Vec<u8> = Vec::with_capacity(123);
let data_ptr = data.as_ptr() as usize;
我可以假设data_ptr
是非零还是一个有效的地址?
【问题讨论】:
你可以假设指针不是std::ptr::null
。
只需阅读with_capacity
的文档即可回答您的问题。就是说,我不明白你为什么想知道这一点以及为什么要将它转换为使用。
@Stargateur 因为我需要从 Wasm 创建一个内存区域,将其地址转换为可用作导出 Wasm 函数的结果的类型,并从主机访问它以覆盖数据。
Vec 保证它的指针是非空的,所以这个例子可能不代表你的问题? null 由所有位为零表示的假设在 Rust 中很普遍,但我还没有将其确定为稳定的事实陈述(可能存在于某处)。
@SimonWarta 是的,确实如此。 Rust 不允许在引用中使用 null,也不会将堆放在那里。获得空指针的唯一方法是通过 C 绑定或手动不安全构造。
【参考方案1】:
是的,可以为零。
请参阅 Passing a javascript string to a Rust function compiled to WebAssembly 以了解其为零的示例,并且使用了一种解决方法来避免与传统的 NULL
值冲突。
【讨论】:
好的,0 在 Wasm 级别上有效。当主机控制位置时,这是一个很好的解决方法。在我的情况下,客人分配内存。你知道我是否也必须在 Rust 来宾代码中做解决方法吗?或者分配器可能已经在内部做了?以上是关于编译为 Wasm 时,指向堆分配内存的 Rust 指针可以为 0 吗?的主要内容,如果未能解决你的问题,请参考以下文章