我正在尝试使用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生成的代码
1条答案
按热度按时间m1m5dgzv1#
您只是修改了本地堆栈内存,而没有返回值,因此它没有副作用,并且可以进行优化。您可以使用write_volatile来停止此操作。
您的代码也是UB,因为您没有满足from_raw_parts_mut文档中的安全要求。