深入解析Lolisa:智能合约形式化验证的新途径
1. 形式语义概述
在编程领域,表达式求值的语义是将Lolisa表达式转换为GERM框架内存地址值的规则,这个过程包含左值位置求值和右值位置求值两部分。不过,修饰符表达式是个特殊情况,它需依据规则8进行求值:
(8)
这里,⇓e 代表修饰符表达式在左值和右值位置的求值过程。其示例语义总结如图10所示,涵盖了数组、映射、常量、结构体以及二元和一元运算符等左右表达式的形式操作语义。
2. 表达式求值
2.1 左值位置表达式求值
我们用特定符号表示左值位置表达式求值以得到相应内存地址。多数由 Econst 构建的表达式显然不能作为左值,因为它们大多直接代表了表达式层面的 Lolisa 常量值。为简洁起见,用特定符号表示数组和映射用于搜索索引地址的递归过程。需要注意的是,为确保 Lolisa 格式良好且行为规范,结构体和字段禁止用于指定左值位置的表达式。在 Lolisa 中,改变结构体字段的唯一方式是使用 Estruct 来更改所有字段或声明新字段,虽然这对程序员或验证者不太友好,但可避免潜在风险。
基于之前定义的数组值语义,我们可以将地址搜索过程定义为规则9,它以名称、特定参数和地址偏移量作为参数。类似地,对于映射值可定义规则10。
(9)
(10)
2.2 右值位置表达式求值
用特定符号表示右值位置表达式求值以得到相应内存地