#语法树 #验证 #抽象语法树

wain-validate

针对wain项目的WebAssembly语法树验证器

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

MIT 协议

74KB
1.5K SLoC

wain-validate

crates.io CI

wain-validate 是一个用于验证解析后的WebAssembly抽象语法树的crate。验证逻辑定义在 规范

此crate是更大 wain 项目的组成部分。

安装

[dependencies]
wain-validate = "0"

使用方法

它接受一个 wain_ast::Root 值并对其进行验证。该值可以通过 wain-syntax-binarywain-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 值在堆栈中。

许可

MIT 许可证

依赖关系