【问题标题】:Can a Rust pointer to heap-allocated memory be 0 when compiled to Wasm?编译为 Wasm 时,指向堆分配内存的 Rust 指针可以为 0 吗?
【发布时间】:2023-04-09 04:49:01
【问题描述】:

在编译成 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 绑定或手动不安全构造。

标签: rust webassembly rust-wasm


【解决方案1】:

是的,可以为零。

请参阅 Passing a JavaScript string to a Rust function compiled to WebAssembly 以了解其为零的示例,并且使用了一种解决方法来避免与传统的 NULL 值冲突。

【讨论】:

  • 好的,0 在 Wasm 级别上有效。当主机控制位置时,这是一个很好的解决方法。在我的情况下,客人分配内存。你知道我是否也必须在 Rust 来宾代码中做解决方法吗?或者分配器可能已经在内部做了?
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2021-12-26
  • 2020-07-26
  • 2019-10-23
  • 1970-01-01
  • 2020-11-16
  • 2015-04-26
  • 2020-09-18
相关资源
最近更新 更多