6个版本
0.1.5 | 2023年11月18日 |
---|---|
0.1.4 | 2020年6月11日 |
0.1.3 | 2020年5月24日 |
0.1.2 | 2020年4月4日 |
0.1.1 | 2020年3月29日 |
#569 in WebAssembly
用于 2 crate
74KB
1.5K SLoC
wain-validate
wain-validate
是一个用于验证解析后的WebAssembly抽象语法树的crate。验证逻辑定义在 规范 中
此crate是更大 wain 项目的组成部分。
安装
[dependencies]
wain-validate = "0"
使用方法
它接受一个 wain_ast::Root
值并对其进行验证。该值可以通过 wain-syntax-binary
和 wain-syntax-text
解析器生成
使用 wain_validate::validate()
是最简单的方法。
extern crate wain_syntax_binary;
extern crate wain_validate;
use std::fs;
use wain_syntax_binary::parse;
use wain_validate::validate;
let source = fs::read("foo.wasm").unwrap();
let tree = parse(&source).unwrap();
if let Err(err) = validate(&tree) {
eprintln!("This .wasm file is invalid!: {}", err);
}
可以在 examples/api/ 目录 中看到工作示例
请阅读文档(尚未)以获取详细信息。
实现
符合 规范,以下内容将被验证
- 在Wasm中,每个引用都是一个索引。它验证所有索引都没有超出范围
- Wasm被设计为静态检查堆栈操作。它通过模拟堆栈状态验证指令序列
- 类型检查由于多态指令
select
而是最佳尝试。由于几乎所有的指令都不是多态的,几乎所有的类型检查都可以在验证过程中完成
符合规范,wain在 unreachable
指令之后验证指令。例如,
(unreachable) (i64.const 0) (i32.add)
i32.add
是无效的,因为它应该从堆栈中获取两个 i32
值,但至少有一个 i64
值在堆栈中。