rust 为什么当我在编译时创建一个原始指针并在缓冲区中使用它时,wasm二进制代码是空的?

biswetbf  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(100)

我正在尝试使用wasm32-unknown-unknown目标构建no_std代码:

#[no_mangle]
pub fn test() {
    let mut idx: i32 = 10;
    let ptr = &mut idx as *mut i32;

    let buffer = unsafe { core::slice::from_raw_parts_mut(ptr, 10) };

    for pixel in buffer.iter_mut() {
        *pixel = 0x7d2b7500;
    }
}

构建之后,我得到了以下WASM二进制代码(我使用wasm2wat工具):

(module
  (type (;0;) (func))
  (func (;0;) (type 0)
    nop)
  (memory (;0;) 16)
  (global (;0;) i32 (i32.const 1048576))
  (global (;1;) i32 (i32.const 1048576))
  (export "memory" (memory 0))
  (export "test" (func 0))
  (export "__data_end" (global 0))
  (export "__heap_base" (global 1)))

由于某种原因(“nop”),我的test函数为空。
但是当我从外部传递一个原始指针ptr作为test函数参数时:

#[no_mangle]
pub fn test(ptr: *mut i32) {
    let buffer = unsafe { core::slice::from_raw_parts_mut(ptr, 10) };

    for pixel in buffer.iter_mut() {
    *pixel = 0x7d2b7500;
    }
}

WASM代码生成:

(module
(type (;0;) (func (param i32)))
  (func (;0;) (type 0) (param i32)
    local.get 0
    i64.const 9019431323700000000
    i64.store offset=32 align=4
    local.get 0
    i64.const 9019431323700000000
    i64.store offset=24 align=4
    local.get 0
    i64.const 9019431323700000000
    i64.store offset=16 align=4
    local.get 0
    i64.const 9019431323700000000
    i64.store offset=8 align=4
    local.get 0
    i64.const 9019431323700000000
    i64.store align=4)
  (memory (;0;) 16)
  (global (;0;) i32 (i32.const 1048576))
  (global (;1;) i32 (i32.const 1048576))
  (export "memory" (memory 0))
  (export "test" (func 0))
  (export "__data_end" (global 0))
  (export "__heap_base" (global 1)))

为什么会这样?
我需要wasm生成的代码

m1m5dgzv

m1m5dgzv1#

您只是修改了本地堆栈内存,而没有返回值,因此它没有副作用,并且可以进行优化。您可以使用write_volatile来停止此操作。
您的代码也是UB,因为您没有满足from_raw_parts_mut文档中的安全要求。

data must point to len consecutive properly initialized values of type T.

相关问题