论文阅读Characterizing and Detecting WebAssembly Runtime Bugs表征错误

可以使用wabt将wasm二进制文件转换为WASM文本格式,反之亦然
论文阅读Characterizing and Detecting WebAssembly Runtime Bugs表征错误_第1张图片
wasm指令实际上定义了概念上的堆栈虚拟机,实现数字德 弹出并将结果留在堆栈中。

.wasm文件的生成

先用Emscripten,Webassembly Studio等工具将C/C++等转化为.wasam文件

.wasm文件的执行

在WASM运行时中执行
论文阅读Characterizing and Detecting WebAssembly Runtime Bugs表征错误_第2张图片
执行的三种模式:解释器模式、提前编译模式(AOT)、即时编译模式(JIT)
AOT模式:提前用后端编译器backend将wasm二进制文件编译成本机代码
JIT:backend中的JIT对热代码进行即时编译,加快效率

解释器:对wasm二进制文件进行解释执行

高级语言的嵌入

运行时可以嵌入C++等作为一个库
WASI:整个wasm运行的沙箱环境与操作系统的桥梁,是一种API
因此运行时做的工作主要是分配内存,执行堆栈操作,报告错误信息

表征与检测webassembly运行时错误

论文阅读Characterizing and Detecting WebAssembly Runtime Bugs表征错误_第3张图片

后端编译

作为执行WASM二进制文件的第一阶段,将WASM二进制文件翻译成本地原生代码:实际上是将.wasm转换为中间表示(IR),分配寄存器并优化代码
IR是wasm指令生成本机代码的中间步骤
在这里插入图片描述
转化为本机指令的过程中
A.2出现在生成不正确的IR代码或不正确的本机代码
A.1出现在运行时依赖的框架(llvm)等不适配
A.3发生在生成原生代码时抛出的异常
分配寄存器
A.4 后端编译器分配的寄存器不正确
跨操作系统运行
A.5 A.6
后端编译bug绝大部分是由编译不正确引起的

运行时环境

模块错误

模块实例化错误和模块导入错误

内存问题

内存分配、多内存支持、内存增长、内存释放、内存不足错误

其他

trap错误、异常报告没有正确提交

线程安全问题、堆栈问题(调用wasm函数时出栈匹配错误)

调用高级语言的宿主函数(参数传递、查找宿主函数错误)

入口点错误:有些wasm运行时要求每个wasm模块有一个严格的入口点

类型转换错误

WASI错误

文件操作错误:创建新目录、写入、读取文件、删除文件
输入输出流错误

修复运行时错误

修复后端错误

修改编译规则
如在llvm后端编译器中循环量为0时编译错误,修复规则
论文阅读Characterizing and Detecting WebAssembly Runtime Bugs表征错误_第4张图片
rotr指令:i64循环右移,从栈顶依次弹出1个i64的值a、1个i64的值b,将b循环右移a位的值压入栈(循环右移中最低位移到最高位)

在测试WASM 二进制文件的rotr指令时,当旋转量为0时,预计会打印数字 4 。然而,WAMR 中的实际输出是一个随机数。每次执行,都会导致不同的输出
修复了LLVM的编译规则

修复寄存器分配
修复数据操作:数据对齐、股定字节顺序

修复验证规则:比如在wasmer中无法获取65536内存页面
论文阅读Characterizing and Detecting WebAssembly Runtime Bugs表征错误_第5张图片
使用最大值分配WASM线性内存时,内存分配失败。这被后端编译器中的验证器拒绝

wasi

修复输入输出流、修复文件操作

运行时环境

你可能感兴趣的:(wasm,jvm,java)