Page 98 - 《软件学报》2025年第9期
P. 98

王小兵 等: Solidity  到  MSVL  转换的等价性研究                                              4009


                                    (  l  r  )  l                          r
                                                                                                  i
                 表示当前状态, 且有      s i = s , s ,   s (x)  表示变量  x  在  s i  状态下的存储位置,   s (x)  表示   x  在  s i  状态下的值,   是区间
                                      i  i  i                              i
                 σ i−1  包含的状态个数, 亦可记作    |σ i−1 |. 程序起始格局为  co 0 = (P m ,ϵ, s 0 ,0) , 终止格局为  co f = (true,σ,∅,|σ|+1). 令  ↣
                                                 ∗                                              +
                                                                                             ,
                 表示在相同状态内格局间的变化关系,             co ↣ co  表示格局  co 在同一状态下经过多步转换为格局           co co ↣ co  表示
                                                                                                    ′
                                                     ′
                                                                                            ′
                                                       ∗                                     +
                 至少一步. 令   → 表示不同状态下格局间的变化,            → 表示不同状态下格局间经过多步发生的变化,                → 表示至少一
                 步. 令  V  为变量的集合,   D  为所有类型数据的集合,        N 0  为非负整数的集合. 对于表达式         exp, 其格局为四元组
                                                           l
                                                                                            l
                 (exp,σ i−1 , s i ,i). 左值表达式的求值规则为  (la,σ i−1 , s i ,i) ⇒ (bl,δ), 表示左值表达式  la 的存储位置是  s (la) = (bl,δ), 其
                                                                                            i
                 中  bl 表示内存块索引, 是一个表示地址的整数,          δ 表示块内字节偏移量. 右值表达式的求值规则为               (ra,σ i−1 , s i ,i) ⇓ n,
                 表示右值表达式      ra 的值为  n.
                    表  1  为  MSVL  的左值表达式求值规则, 其中       sizeof(τ) 表示类型   的存储大小,   type(a) 表示表达式  a 的类型,
                                                                      τ
                 field_offset(v φ ,φ) 表示结构体成员列表  φ 中名称为  v φ  的成员变量距结构体首地址的偏移量,           ptr(bl,δ) 表示指向存
                 储位置   (bl,δ) 的指针值, 布尔值处理为整数. 规则       L1  处理变量, L2  和  L3  处理数组元素, L4  和  L5  处理结构体成员,
                 L6  处理指针解引用.

                                                  表 1 左值表达式求值规则

                   序号                                        求值规则
                                                                   l
                    L1                                   (id,σ i−1 , s i ,i) ⇒ s (id)
                                                                     l
                                                                     i
                                                                 l
                                            (ra,σ i−1 , s i ,i) ⇓ v(id,σ i−1 , s i ,i) ⇒ (bl,δ)
                    L2                                                其中,τ为id[ra]的类型
                                                        l (           )
                                            (id[ra],σ i−1 , s i ,i) ⇒ bl,δ+v·sizeof(τ)
                                                               l
                            (ra 1 ,σ i−1 , s i ,i) ⇓ v 1 (ra 2 ,σ i−1 , s i ,i) ⇓ v 2 (id,σ i−1 , s i ,i) ⇒ (bl,δ)
                    L3                                              其中,n表示数组id的列数,τ为id[ra 1 ][ra 2 ]的类型
                                              l (                 )
                              (id[ra 1 ][ra 2 ],σ i−1 , s i ,i) ⇒ bl,δ+(v 1 ·n+v 2 )·sizeof(τ)
                                                                   l
                                                         (la,σ i−1 , s i ,i) ⇒ (bl,δ)
                    L4                            type(la) = struct id{φ}field_offset(v φ ,φ) = δ ′
                                                       (         ) l
                                                        la.v φ ,σ i−1 , s i ,i ⇒ (bl,δ+δ )
                                                                         ′
                                                         (pt,σ i−1 , s i ,i) ⇓ ptr(bl,δ)
                                                  type(pt) = struct id{φ}∗field_offset(v φ ,φ) = δ ′
                    L5
                                                                    l
                                                      (pt → v φ ,σ i−1 , s i ,i) ⇒ (bl,δ+δ )
                                                                          ′
                                                         (pt,σ i−1 , s i ,i) ⇓ ptr(bl,δ)
                    L6                                             l
                                                         (∗pt,σ i−1 , s i ,i) ⇒ (bl,δ)

                    命题  1. 对于任意给定的表达式        la, 使用左值表达式求值规则求出的值          (bl,δ) 是唯一的.
                    证明: 反证法, 若   la  的左值不唯一, 有两个不同的存储位置          (bl,δ) 和  (bl ,δ ), 对  la  进行赋值, 则有:
                                                                            ′
                                                                          ′
                                 ′
                                ′
                    (1)   (bl,δ) 和  (bl ,δ ) 都发生变化, 表明  la  同时影响两个存储位置, 与左值表达式定义不符;
                    (2)   (bl,δ) 和  (bl ,δ ) 都不发生变化, 表明  la  不影响两个存储位置, 与左值表达式定义不符;
                                ′
                                 ′
                                 ′
                    (3)   (bl,δ) 和  (bl ,δ ) 其中一个发生变化另一个不发生变化, 表明    la  只有一个存储位置, 与假设不符.
                                ′
                    表  2  为  MSVL  的右值表达式求值规则, 其中       c 表示常量,  x  表示  V  中的变量,  v,v 1 ,v 2  表示  D  中的值,  (τ)v 1  为
                 cast( v 1 , type( v 1 ,τ)) 的简写, 表示将  v 1  从它原始类型  type( v 1 ) 强制转换为期望的类型  τ. 规则  R1  处理常量, R2  处理
                 可以作为左值表达式的表达式, R3          处理取地址表达式, R4      处理强制类型转换, R5      和  R6  处理数组元素, R7  处理结
                 构体成员, R8  和  R9  处理算数运算, R10   和  R11  处理  if 语句求值, R12  处理前一状态  ( ⊝) 操作, R13  处理参数列表
                 求值.
   93   94   95   96   97   98   99   100   101   102   103