编译为 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

利用Golang玩转WebAssembly

使用 emcc 将 C++ 代码编译为 WASM 的问题

Rust 和 Cyber​​DWARF 可以一起使用吗?

哪些语言可以编译成 WebAssembly (Wasm)? [关闭]

如何使用LLVM将C语言编译为WASM

成功把泰山Office编译为wasm