任何人都可以帮助解释在WebAssembly设计中合理显示的“一次通过验证”过程

问题描述 投票:0回答:1

“一次验证”是什么意思?为什么基于堆栈的机器可以简化这个过程?

另外,我在WebAssembly文档“Semantic-> Validation”部分中找到以下句子:

必须在编译之前验证模块二进制文件。

我想知道验证过程何时会发生?在“wat2wasm”或任何其他阶段的过程中?谢谢!

webassembly
1个回答
1
投票

One pass verification意味着您不必遍历字节码两次以收集验证程序所需的所有信息。

它依赖于两种机制:

线性存储器与代码空间不相交;执行堆栈;和引擎控制结构,所以你的程序不能跳转到任意位置或破坏执行环境。因此,引擎不必在运行时进行繁琐的检查以确保内存安全。如果它完全消除了内存安全漏洞的风险?我无法回答。我相信,Spectre / Meltdown错误确实会导致一些引擎限制WebAssembly执行引擎的特权。

结构化控制流意味着构造的程序不能形成不可缩减的循环或包含具有未对齐堆栈高度的块的分支。

结构化控制流程部分简化了解析和验证机制。每个控制流指令都包含在一个块中,这意味着对于前向跳转我们已经知道了目的地,并且不必再次解析程序以找出。

validation process恰好在编译之前发生。例如,在Firefox中,它隐藏在迭代器后面,迭代器从二进制代码的读取器提供,并将每条指令传递给编译器。以下是验证每个函数体的函数:https://searchfox.org/mozilla-central/source/js/src/wasm/WasmValidate.cpp#903

通过将操作数放在类型堆栈上并验证该堆栈上的类型是否与指令的类型匹配来完成实际验证。 Firefox的一些代码摘录:DecodeFunctionBodyExpr有一系列i32函数的case子句,例如i32.add,i32.sub,i32.mul,它们都带有两个i32操作数。从那里调用ReadBinary,为每个操作数调用popWithType一次。在popWithType中,可以访问一个跟踪操作数的类型堆栈。如果类型不匹配,则会在callchain上发出错误信号。

本史密斯写了一篇博客文章WebAssembly type-checking,解释了如何用教学图片进行类型检查。 WebAssembly的类型检查很简单,但控制流中无法访问的代码除外。请参阅该帖子的最后一节,了解如何使用“多态堆栈”解决它。

© www.soinside.com 2019 - 2024. All rights reserved.