访问未设置的WebAssembly局部变量:是默认值还是未定义行为?
WebAssembly未初始化局部变量访问的行为规范
- 核心结论:直接用
local.get访问未通过local.set/local.tee赋值的局部变量,属于未定义行为,WebAssembly规范不保证能获取到特定默认值(比如0)。 - 规范依据:WebAssembly核心明确规定,函数的局部变量(非参数类型)在函数入口时处于未初始化状态,访问未初始化的局部变量的行为是未定义的——不同引擎实现可自由处理该情况,没有统一要求。
- Chrome返回0的说明:你测试的代码在Chrome中返回0,这只是V8引擎(Chrome的WebAssembly运行时)的具体实现行为,并非规范强制要求。其他引擎(如Firefox的SpiderMonkey)可能返回不同值,甚至触发运行时错误,这些都符合规范。
对应的WAT示例代码:
(module (func (result i32) (local i32) local.get 0))
内容的提问来源于stack exchange,提问作者Sam Estep
相关产品推荐
相关产品推荐

