CN110851141A - 一种基于Coq的C++编译器变量作用域形式化方法 - Google Patents
一种基于Coq的C++编译器变量作用域形式化方法 Download PDFInfo
- Publication number
- CN110851141A CN110851141A CN201911128077.6A CN201911128077A CN110851141A CN 110851141 A CN110851141 A CN 110851141A CN 201911128077 A CN201911128077 A CN 201911128077A CN 110851141 A CN110851141 A CN 110851141A
- Authority
- CN
- China
- Prior art keywords
- variable
- formalization
- stack
- scope
- formalizing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于Coq的C++编译器变量作用域形式化方法,采用record数学模型形式化表结构,采用Inductive归纳定义形式化栈结构,采用match匹配形式化代码中引起分支的操作逻辑,采用Fixpoint递归函数形式化重复行为操作逻辑。现有技术中的FSPVM解释器在解释变量操作方法的时候,如果变量操作方法带有作用域特性,就会错误解释。采用本发明中的变量操作方法替代FSPVM解释器里的解释变量操作方法可以让新的FSPVM解释器能够解释带有作用域特性的代码。本发明使用了Record数学模型形式化字典数据结构,较使用Inductive归纳方法的传统形式化方式明显的提升了执行效率。
Description
技术领域
本发明属于计算机应用的技术领域,具体涉及一种基于Coq的C++编译器变量作用域形式化方法。
背景技术
自区块链和虚拟币种市场诞生以来,各种安全问题层出不穷,由于各种安全问题导致的黑客攻击引起的损失也成文了行业内的关注重点。为了保证代码安全,业界提出了多种代码检测的方式。
但就EOS智能合约的形式化验证,现阶段还没有成熟的方案。出现这一现象主要是由于对工业级程序语义的形式化语义较为困难。形式语义与形式建模即为了对计算机系统的行为进行推理验证,需要对编程语言的语义进行严格的定义,使用形式模型对计算机系统的行为进行建模。
虽然当前有很多项目已经实现了对以太坊的智能合约的形式化验证,但是极少有对EOS智能合约的形式化验证。这主要是由于相较于由solidity编写的以太坊智能合约,由C++编写的EOS智能合约的语法和语义更为复杂。在形式化EOS智能合约时需要实现C++特有的语法特性形式化,其中C++变量作用域的形式化验证方案目前业界还未有成熟的解决方案。
发明内容
本发明公开了一种基于Coq的C++编译器变量作用域形式化方法,目的为解决Coq解释器无法将含有变量作用域特性的代码正确解释为虚拟内存指令序列的问题。
本发明主要通过以下技术方案实现:一种基于Coq的C++编译器变量作用域形式化方法,采用record数学模型形式化表结构,采用Inductive归纳定义形式化栈结构,采用match匹配形式化代码中引起分支的操作逻辑,采用Fixpoint递归函数形式化重复行为操作逻辑。
形式化验证:指从数学上完备地证明或验证程序的实现方案是否确实实现了程序设计所描述的功能。
形式化/形式化方法:本发明中指代将某一实体或行为或特性抽象成Coq中的可解释的数学模型。
FSPVM形式化验证引擎:指使用基于coq的形式化符号执行虚拟机[1](formalsymbolic process virtual machine ,FSPVM)验证智能合约安全性的解决方案。(Yang Z, Lei H . Formal Process Virtual Machine for Smart Contracts Verification[J].International Journal of Performability Engineering, 2018)。
编译器变量作用域特性:在编译器解释代码时,一个变量拥有其使用范围,超出使用范围的变量其读取/写入/创建等操作会受到限制。
Coq编译器:本发明中的Coq编译器指代基于Coq研发的针对C++进行解释的编译器。
如图1所示,FSPVM形式化验证系统可以分为:翻译器、Coq解释器、虚拟内存三个部分。其基本流程如下:
1、对于待验证的C++代码,翻译器将之翻译成可以被Coq解释器解释运行的中间语言FVIL编写成的代码。
2、对于由FVIL编写成的代码,Coq解释器将其解释为对虚拟内存指令组成的序列。
3、Coq解释器执行序列中的虚拟内存指令更改虚拟内存状态。根据虚拟内存最终状态,系统给出对输入C++代码的形式化验证结果。
本发明基于FSPVM形式化验证系统,应用于其中的Coq解释器,目的为解决Coq解释器无法将含有变量作用域特性的代码正确解释为虚拟内存指令序列的问题。
Coq解释器正确解释含有变量作用域特性的代码这一问题可以看做,正确解释带作用域限制的变量操作方法,也即变量操作方法形式化中的目标。使用Coq解释器解释目标代码等价于将目标代码在Coq上形式化,这部分等价概念请参考FSPVM(Yang Z , Lei H .Formal Process Virtual Machine for Smart Contracts Verification[J].International Journal of Performability Engineering, 2018)。
为了更好地实现本发明,进一步的,包括全局变量作用域表、局部变量作用域表栈结构形式化,主要包括以下步骤:
步骤S1:表值结构形式化,利用Inductive结构定义表值,dmt_init归纳子表示初始化表值,dmt_unit归纳子内部存储:虚拟内存地址、变量作用域标识符;
步骤S2:表结构形式化,利用Record数学模型模拟表结构,利用Record的directlyaccess特性形式化字典结构的hash表快速查找逻辑;
步骤S3:表栈结构形式化,利用Inductive归纳定义栈结构,通过构造dmt_genesis归纳基形式化栈底,dmt_block归纳构造子形式化栈内元素,表栈内存储:作用域表类别、函数标识符、函数虚拟内存地址、作用域表结构;
步骤S4:环境变量形式化,利用Record数学模型模拟编译器环境变量,内部定义虚拟内存、全局变量表、局部变量表。
为了更好地实现本发明,进一步的,包括步骤S5作用域表读写操作形式化,主要包括以下步骤:
步骤S5-1:作用域表读操作形式化:
S5-1-1、输入:变量作用域表、变量名;
S5-1-2、输出:变量值或异常抛出;
S5-1-3、定义形式化:读操作定义为变量名正常情况下返回变量名对应的值,输入非法变量名的情况下抛出异常;
S5-1-4、Coq形式化方法:采用match匹配形式化操作可能展开的两个分支,使用带有option限制的输出来形式化异常抛出操作;
步骤S5-2:作用域表写操作形式化:
S5-2-1、输入:变量作用域表、作用域表地址、待写入变量值;
S5-2-2、输出:写入后更新的变量作用域表;
S5-2-3、定义:写操作定义为返回指定地址的值更改为指定值的变量作用域表;
S5-2-4、Coq形式化方法:利用match匹配展开表结构分支,利用形式化方法S1、S2形式化全局变量作用域表结构。
为了更好地实现本发明,进一步的,还包括步骤S6作用域表栈操作形式化,主要包括以下步骤:
S6-1、表栈出栈操作形式化;
S6-1-1、输入:局部变量作用域表栈;
S6-1-2、输出:栈顶表出栈后的局部变量作用域表栈或异常抛出;
S6-1-3、定义:若表栈内元素大于0则移除栈顶表返回表栈,否则抛出异常;
S6-1-4、Coq形式化方法:利用match匹配形式化操作可能展开的两个分支,使用带有option限制的输出来形式化异常抛出操作;
S6-2、表栈入栈操作形式化:
S6-2-1、输入:局部变量作用域表栈,待入栈局部变量作用域表;
S6-2-2、输出:新表入栈后的局部变量作用域表栈;
S6-2-3、定义:将待入栈局部变量作用域表置于表栈栈顶,返回局部变量作用域表栈;
S6-2-4、Coq形式化方法:利用形式化方法S3形式化局部变量作用域表,利用match匹配展开形式化方法S3构成的形式化局部变量作用域表栈;
S6-3、栈顶表复制操作形式化:
S6-3-1、输入:待复制局部变量作用域表、待继承变量名列表;
S6-3-2、输出:复制产生的局部变量作用域表或异常抛出;
S6-3-3、定义:若待集成变量名列表中的变量名都为合法变量名,则构造空白表,复制待复制局部变量作用域表中所有变量名对应地址的值至空白表,并返回该表;否则抛出异常;
S6-3-4、Coq形式化方法:利用match匹配形式化条件判断产生的程序分支,利用形式化方法S5-2形式化单变量写入作用域表操作,在此基础上利用Fixpoint递归函数形式化多个变量值写入的重复性操作,使用带有option限制的输出来形式化异常抛出操作。
为了更好地实现本发明,进一步的,包括步骤S7全局变量操作方法形式化,主要包括以下步骤:
S7-1、全局变量读操作形式化:
形式化方法S7-1包含以下形式化定义及Coq形式化方法:
S7-1-1、输入:虚拟内存、全局变量作用域表、待读取变量名、待读取变量类型;
S7-1-2、输出:变量名对应的虚拟内存值或异常抛出;
S7-1-3、定义:如果给出的变量名合法、对应全局变量作用域表有变量信息、对应虚拟内存地址中有合法值、该合法值与待读取变量类型一致,则返回该合法值;否则异常抛出;
S7-1-4、Coq形式化方法:使用FSPVM中定义的内存读操作read_by_address,使用match匹配形式化条件判断产生的程序分支,使用形式化方法S5-1形式化对全局变量作用域表的读操作,使用带有option限制的输出来形式化异常抛出操作;
S7-2、全局变量写操作形式化:
S7-2-1、输入:虚拟内存、全局变量作用域表、待写入变量名、待写入变量值;
S7-2-2、输出:写入修改后的虚拟内存或异常抛出;
S7-2-3、定义:如果变量名合法、对应全局变量作用域表有变量信息、对应虚拟内存地址合法,则在虚拟内存的该地址处写入待写入变量值;否则异常抛出;
S7-2-4、Coq形式化方法:使用FSPVM中定义的内存读操作write_by_address,使用match匹配形式化条件判断产生的程序分支,使用形式化方法S5-1形式化对全局变量作用域表的读操作,使用带有option限制的输出来形式化异常抛出操作。
为了更好地实现本发明,进一步的,还包括步骤S8局部变量操作方法形式化,主要包括以下步骤:
S8-1、局部变量读操作形式化:
S8-1-1、输入:虚拟内存,局部变量作用域表栈,待写入变量名,待读取变量类型;
S8-1-2、输出:变量名对应的虚拟内存值或异常抛出;
S8-1-3、定义:如果给出的变量名合法、对应局部变量作用域表栈非空、对应局部变量作用域栈顶表有变量信息、对应虚拟内存地址中有合法值、该合法值与待读取变量类型一致,则返回该合法值;否则异常抛出;
S8-1-4、Coq形式化方法:使用match匹配展开Inductive形式化定义的表栈结构,形式化获取栈顶表操作,使用形式化方法S7-1形式化对局部变量作用域栈顶表的读操作,使用带有option限制的输出来形式化异常抛出操作;
S8-2、局部变量写操作形式化:
S8-2-1、输入:虚拟内存、局部变量作用域表栈、待写入变量名、待写入变量值;
S8-2-2、输出:写入修改后的虚拟内存或异常抛出;
S8-2-3、定义:如果变量名合法、对应局部变量作用域表栈非空、对应局部变量作用域栈顶表有变量信息、对应虚拟内存地址合法,则在虚拟内存的该地址处写入待写入变量值;否则异常抛出;
S8-2-4、Coq形式化方法:使用match匹配展开Inductive形式化定义的表栈结构性,形式化获取栈顶表操作,使用形式化方法S7-2形式化对局部变量作用域表栈顶表的写操作使用带有option限制的输出来形式化异常抛出操作。
在本发明中包括:1、形式化定义,包括输入、输出、功能定义。2、在Coq上具体如何形式化。这两部分描述如何在Coq上形式化一个操作/行为/对象,也即在Coq上的形式化方法。
本发明使用了Record数学模型形式化字典数据结构,相比传统的使用Inductive形式化字典的方法,对字典值的读写行为效率极大增加。传统方法使用Inductive归纳构造子,通过递归构造类似链表的结构形式化字典。由于这种递归构造,导致该方法形式化的字典读写效率十分低下。本发明使用Record数学模型形式化字典结构,Record结构拥有directly access的特性,该特性保证了读写内部结构的效率。
本发明的有益效果:
(1)本发明使用了Record数学模型形式化字典数据结构,较使用Inductive归纳方法的传统形式化方式明显的提升了执行效率。
(2)本发明实现了C++编译器变量作用域的形式化,解决了传统形式化方法无法对C++编译器变量作用域特性进行形式化验证的问题。
(3)现有技术中的FSPVM解释器在解释代码时,如果代码带有变量作用域特性,就会错误解释。采用本发明中的变量操作方法替代FSPVM解释器里的解释变量操作方法可以让新的FSPVM解释器正确解释带有作用域特性的代码。
附图说明
图1为FSPVM形式化验证系统的结构示意图。
具体实施方式
实施例1:
一种基于Coq的C++编译器变量作用域形式化方法,采用record数学模型形式化表结构,采用Inductive归纳定义形式化栈结构,采用match匹配形式化代码中引起分支的操作逻辑,采用Fixpoint递归函数形式化重复行为操作逻辑。
如图1所示,本发明基于FSPVM形式化验证系统,应用于其中的Coq解释器,目的为解决Coq解释器无法将含有变量作用域特性的代码正确解释为虚拟内存指令序列的问题。Coq解释器无法正确解释含有变量作用域特性的代码,即Coq解释器无法正确解释带作用域限制的变量操作方法。
为了解决这一问题,本发明将C++变量作用域特性形式化问题抽象为带有作用域限制的变量操作行为形式化问题。该问题核心为全局变量作用域表、局部变量作用域表栈操作形式化问题。而全局变量作用域表、局部变量作用域表栈操作形式化问题涉及全局变量作用域表、局部变量作用域表栈结构形式化问题。本发明采用record数学模型形式化表结构,inductive归纳定义形式化栈结构,match匹配形式化代码中引起分支的操作逻辑,Fixpoint递归函数形式化重复行为操作逻辑等方式解决了上述问题。
本发明使用了Record数学模型形式化字典数据结构,相比传统的使用Inductive形式化字典的方法,对字典值的读写行为效率极大增加。传统方法使用Inductive归纳构造子,通过递归构造类似链表的结构形式化字典。由于这种递归构造,导致该方法形式化的字典读写效率十分低下。本发明使用Record数学模型形式化字典结构,Record结构拥有directly access的特性,该特性保证了读写内部结构的效率。
现有技术中的FSPVM解释器在解释变量操作方法的时候,如果变量操作方法带有作用域特性,就会错误解释。采用本发明中的变量操作方法替代FSPVM解释器里的解释变量操作方法可以使FSPVM解释器正确解释带有作用域特性的代码。
实施例2:
一种基于Coq的C++编译器变量作用域形式化方法,基于FSPVM形式化验证引擎,目的为解决Coq解释器无法将含有变量作用域特性的代码正确解释为虚拟内存指令序列的问题。主要包括以下步骤:
1、全局变量作用域表、局部变量作用域表栈结构形式化方法:
S1、表值结构形式化,利用Inductive结构定义表值,dmt_init归纳子表示初始化表值,dmt_unit归纳子内部存储:虚拟内存地址、变量作用域标识符。
Inductive domain_map_table_v : Type :=
| dmt_init : domain_map_table_v
| dmt_unit : high_addres -> address -> dmt_sign -> domain_map_table_v.
S2、表结构形式化,利用Record数学模型模拟表结构,利用Record的directly access特性形式化字典结构的hash表快速查找逻辑。
Record domain_map_table : Type := newDmt {
dmt_0x00000000 : domain_map_table_v;
dmt_0x00000001 : domain_map_table_v;
…
dmt_0x000000fe : domain_map_table_v;
dmt_0x000000ff : domain_map_table_v;
}.
S3、表栈结构形式化,利用Inductive归纳定义栈结构,通过构造dmt_genesis归纳基模拟栈底,dmt_block归纳构造子模拟栈内元素。
Inductive dmt_chain : Type :=
| dmt_genesis : dmt_chain
| dmt_block: list dmt_address(* 当前作用域变量列表 *) -> nat (* 已占用内存地址 *) ->
nat (* level *)-> option variable_name (*函数名 *) ->
dmt_type -> domain_map_table -> dmt_chain -> dmt_chain.
S4、环境变量形式化,利用Record数学模型模拟编译器环境变量,内部定义虚拟内存、全局变量表、局部变量表。
Record exe_environment : Type := newEnv {
exe_seg : memory;
exe_dmts : dmt_chain;
exe_global: domain_map_table;
}.
2、变量作用域表、变量作用域表栈操作方法形式化:
S5、作用域表读写操作形式化。
形式化方法S1包含以下形式化方法:
S5-1、作用域表读操作形式化
形式化方法S5-1包含以下形式化定义及Coq形式化方法:
S5-1-1、输入:变量作用域表、变量标识符;
S5-1-2、输出:变量值或异常抛出;
S5-1-3、定义形式化:读操作定义为变量名正常情况下返回变量名对应的值,输入非法变量名的情况下抛出异常;
S5-1-4、Coq形式化方法:采用match匹配形式化操作可能展开的两个分支,使用带有option限制的输出来形式化异常抛出操作。
S5-2、作用域表写操作形式化
形式化方法S5-2包含以下形式化定义:
S5-2-1、输入:变量作用域表、作用域表地址、待写入逻辑变量值;
S5-2-2、输出:更新后的变量作用域表;
S5-2-3、定义:写操作定义为返回指定地址更改后的变量作用域表;
S5-2-4、Coq形式化方法:利用match匹配展开表结构分支,利用形式化方法S1、S2形式化全局变量作用域表结构。
Definition read_dmt_basic (c: domain_map_table) (vn: variable_name) :option domain_map_table_v :=
match num_to_dmtAddr vn with
| None => None
| Some dmt_addr => Some c.(dmt_addr)
end.
Definition write_dmt_basic (c: domain_map_table)
(dmt_addr: dmt_address)
(dmtv: domain_map_table_v): domain_map_table :=
match dmt_addr with
|dmtAddr_00000000 => modify_dmt_0x00000000 c dmtv
|dmtAddr_00000001 => modify_dmt_0x00000001 c dmtv
…
|dmtAddr_000000fe => modify_dmt_0x00000062 c dmtv
|dmtAddr_000000ff => modify_dmt_0x00000063 c dmtv
end.
S6、作用域表栈操作形式化
形式化方法S6包含以下形式化方法:
S6-1、表栈出栈操作形式化
形式化方法S6-1包含以下形式化定义及Coq形式化方法:
S6-1-1、输入:局部变量作用域表栈;
S6-1-2、输出:局部变量作用域表栈或异常抛出;
S6-1-3、定义:若表栈内元素大于0则移除栈顶表返回表栈,否则抛出异常;
S6-1-4、Coq形式化方法:利用match匹配形式化操作可能展开的两个分支,使用带有option限制的输出来形式化异常抛出操作。
S6-2、表栈入栈操作形式化
形式化方法S6-2包含以下形式化定义及Coq形式化方法:
S6-2-1、输入:局部变量作用域表栈,待入栈局部变量作用域表;
S6-2-2、输出:更新后的局部变量作用域表栈;
S6-2-3、定义:将待入栈局部变量作用域表置于表栈栈顶,返回局部变量作用域表栈;
S6-2-4、Coq形式化方法:利用形式化方法S3形式化局部变量作用域表,利用match匹配展开形式化方法S3构成的形式化局部变量作用域表栈。
S6-3、栈顶表复制操作形式化
形式化方法S6-3包含以下形式化定义及Coq形式化方法:
S6-3-1、输入:待复制局部变量作用域表、待继承变量名列表;
S6-3-2、输出:局部变量作用域表或异常抛出;
S6-3-3、定义:若待集成变量名列表中的变量名都为合法变量名,则构造空白表,复制待复制局部变量作用域表中所有变量名对应地址的值至空白表,并返回该表;否则抛出异常;
S6-3-4、Coq形式化方法:利用match匹配形式化条件判断产生的程序分支,利用形式化方法S5-2形式化单变量写入作用域表操作,在此基础上利用Fixpoint递归函数形式化多个变量值写入的重复性操作,使用带有option限制的输出来形式化异常抛出操作。
(* 出栈操作 *)
Definition pop_dmt_chain (dmtc: dmt_chain) : option dmt_chain :=
match dmtc with
| dmt_genesis => None
| dmt_block _ _ _ _ _ _ dmtc_tail => Some dmtc_tail
end.
(* 入栈操作 *)
Definition push_dmt_chain_basic (dmtc: dmt_chain) (dmt: domain_map_table): dmt_chain :=
match dmtc with
| dmt_genesis => dmt_block nil 0 0 None namespace dmt dmtc
| dmt_block _ dmt_count dmt_level _ _ _ _ => dmt_block nil dmt_countdmt_level None funspace dmt dmtc
end.
(* 栈顶表部分复制 *)
Fixpoint push_part_dmt_copy (dmt: domain_map_table) (vn_list: listvariable_name): option domain_map_table :=
match vn_list with
| nil => Some empty_dmt
| cons vn tail =>
match read_dmt_basic dmt vn with
| None => None
| Some dmt_v =>
match push_part_dmt_copy dmt tail with
| None => None
| Some result_dmt =>
match dmt_v with
| dmt_init => write_dmt_basic result_dmt vn dmt_init
| dmt_unit haddr laddr sign => write_dmt_basic result_dmtvn (dmt_unit haddr laddr dmt_far)
end
end
end
end.
3、变量操作方法形式化
S7、全局变量操作方法形式化
形式化方法S7包含以下形式化方法:
S7-1、全局变量读操作形式化
形式化方法S7-1包含以下形式化定义及Coq形式化方法:
S7-1-1、输入:虚拟内存、全局变量作用域表、待读取变量名、待读取变量类型;
S7-1-2、输出:虚拟内存值或异常抛出;
S7-1-3、定义:如果给出的变量名合法、对应全局变量作用域表有变量信息、对应虚拟内存地址中有合法值、该合法值与待读取变量类型一致,则返回该合法值;否则异常抛出;
S7-1-4、Coq形式化方法:使用FSPVM中定义的内存读操作read_by_address,使用match匹配形式化条件判断产生的程序分支,使用形式化方法S5-1形式化对全局变量作用域表的读操作,使用带有option限制的输出来形式化异常抛出操作。
S7-2、全局变量写操作形式化
形式化方法S7-2包含以下形式化定义及Coq形式化方法:
S7-2-1、输入:虚拟内存、全局变量作用域表、待写入变量名、待写入变量值;
S7-2-2、输出:虚拟内存或异常抛出;
S7-2-3、定义:如果变量名合法、对应全局变量作用域表有变量信息、对应虚拟内存地址合法,则在虚拟内存的该地址处写入待写入变量值;否则异常抛出;
S7-2-4、Coq形式化方法:使用FSPVM中定义的内存读操作write_by_address,使用match匹配形式化条件判断产生的程序分支,使用形式化方法S5-1形式化对全局变量作用域表的读操作,使用带有option限制的输出来形式化异常抛出操作。
S8、局部变量操作方法形式化
形式化方法S8包含以下形式化方法:
形式化方法S8-1包含以下形式化定义及Coq形式化方法:
S8-1、局部变量读操作形式化
S8-1-1、输入:虚拟内存,局部变量作用域表栈,待写入变量名,待读取变量类型;
S8-1-2、输出:虚拟内存值或异常抛出;
S8-1-3、定义:如果给出的变量名合法、对应局部变量作用域表栈非空、对应局部变量作用域栈顶表有变量信息、对应虚拟内存地址中有合法值、该合法值与待读取变量类型一致,则返回该合法值;否则异常抛出;
S8-1-4、Coq形式化方法:使用match匹配展开Inductive形式化定义的表栈结构,形式化获取栈顶表操作,使用形式化方法S7-1形式化对局部变量作用域栈顶表的读操作,使用带有option限制的输出来形式化异常抛出操作。
S8-2、局部变量写操作形式化
形式化方法S8-2包含以下形式化定义及Coq形式化方法:
S8-2-1、输入:虚拟内存、局部变量作用域表栈、待写入变量名、待写入变量值;
S8-2-2、输出:虚拟内存或异常抛出;
S8-2-3、定义:如果变量名合法、对应局部变量作用域表栈非空、对应局部变量作用域栈顶表有变量信息、对应虚拟内存地址合法,则在虚拟内存的该地址处写入待写入变量值;否则异常抛出;
S8-2-4、Coq形式化方法:使用match匹配展开Inductive形式化定义的表栈结构性,形式化获取栈顶表操作,使用形式化方法S7-2形式化对局部变量作用域表栈顶表的写操作使用带有option限制的输出来形式化异常抛出操作。
(* 读写全局变量 *)
Definition read_v_dmt (m: expanded_memory) (dmt: domain_map_table) (vn:variable_name) (t: type): option value :=
match read_dmt_basic dmt vn with
| None => None
| Some dmt_cube =>
match dmt_cube with
| dmt_init => None
| dmt_unit haddr laddr l => read_by_address m haddr laddr
end
end.
Definition write_v_dmt (m: expanded_memory) (dmt: domain_map_table) (vn:variable_name) (v: value) : option expanded_memory :=
match read_dmt_basic dmt vn with
| None => None
| Some dmt_cube =>
match dmt_cube with
| dmt_init => None
| dmt_unit haddr laddr l => Some (write_by_address m v haddrladdr)
end
end.
(* 读写局部变量 *)
Definition read_without_type_dmtc (m: expanded_memory) (dmtc: dmt_chain)(vn: variable_name) (t: type): option value :=
match dmtc with
| dmt_genesis => None
| dmt_block _ dmt_count _ _ _ dmt tail =>
read_v_dmt m dmt vn t
end.
Definition write_v_dmtc (m: expanded_memory) (dmtc: dmt_chain) (vn:variable_name) (v: value) : option expanded_memory :=
match dmtc with
| dmt_genesis => None
| dmt_block _ dmt_count _ _ _ dmt tail =>
write_v_dmt m dmt vn v
end.
上述形式化方法中的read_by_address和write_by_address为FSPVM体系中虚拟内存读写操作的形式化方法。expand_memory、high_address、address、value等为FSPVM体系中的虚拟内存定义。
本发明实现了C++编译器变量作用域的形式化,解决了传统形式化方法无法对C++编译器变量作用域特性进行形式化验证的问题。现有技术中的FSPVM解释器在解释变量操作方法的时候,如果变量操作方法带有作用域特性,就会错误解释。采用本发明中的变量操作方法替代FSPVM解释器里的解释变量操作方法可以让新的FSPVM解释器能够解释带有作用域特性的代码。
本专利将变量作用域形式化抽象为带有作用域限制的变量操作行为形式化问题。该问题核心为全局变量作用域表、局部变量作用域表栈操作形式化问题。而全局变量作用域表、局部变量作用域表栈操作形式化问题涉及全局变量作用域表、局部变量作用域表栈结构形式化问题。本专利采用record数学模型形式化表结构,inductive归纳定义形式化栈结构,match匹配形式化代码中引起分支的操作逻辑,Fixpoint递归函数形式化重复行为操作逻辑等方式解决了上述问题。
本发明使用了Record数学模型形式化字典数据结构,相比传统的使用Inductive形式化字典的方法,对字典值的读写行为效率极大增加。传统方法使用Inductive归纳构造子,通过递归构造类似链表的结构形式化字典。由于这种递归构造,导致该方法形式化的字典读写效率十分低下。本发明使用Record数学模型形式化字典结构,Record结构拥有directly access的特性,该特性保证了读写内部结构的效率。
以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。
Claims (7)
1.一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,采用record数学模型形式化表结构,采用Inductive归纳定义形式化栈结构,采用match匹配形式化代码中引起分支的操作逻辑,采用Fixpoint递归函数形式化重复行为操作逻辑。
2.根据权利要求1所述的一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,包括全局变量作用域表、局部变量作用域表栈结构形式化,主要包括以下步骤:
步骤S1:表值结构形式化,利用Inductive结构定义表值,dmt_init归纳子表示初始化表值,dmt_unit归纳子内部存储:虚拟内存地址、变量作用域标识符;
步骤S2:表结构形式化,利用Record数学模型模拟表结构,利用Record的directlyaccess特性形式化字典结构的hash表快速查找逻辑。
3.根据权利要求2所述的一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,还包括以下步骤:
步骤S3:表栈结构形式化,利用Inductive归纳定义栈结构,通过构造dmt_genesis归纳基形式化栈底,dmt_block归纳构造子形式化栈内元素,表栈内存储:作用域表类别、函数标识符、函数虚拟内存地址、作用域表结构;
步骤S4:环境变量形式化,利用Record数学模型形式化编译器环境变量,内部定义虚拟内存、全局变量表、局部变量表栈。
4.根据权利要求2所述的一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,包括步骤S5作用域表读写操作形式化,主要包括以下步骤:
步骤S5-1:作用域表读操作形式化:
S5-1-1、输入:变量作用域表、变量名;
S5-1-2、输出:变量值或异常抛出;
S5-1-3、定义形式化:读操作定义为变量名正常情况下返回变量名对应的值,输入非法变量名的情况下抛出异常;
S5-1-4、Coq形式化方法:采用match匹配形式化操作展开的两个分支,使用带有option限制的输出来形式化异常抛出操作;
步骤S5-2:作用域表写操作形式化:
S5-2-1、输入:变量作用域表、作用域表地址、待写入变量值;
S5-2-2、输出:写入后更新的变量作用域表;
S5-2-3、定义:写操作定义为返回指定地址的值更改为指定值的变量作用域表;
S5-2-4、Coq形式化方法:利用match匹配展开表结构分支,利用形式化方法S1、S2形式化全局变量作用域表结构。
5.根据权利要求2所述的一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,还包括步骤S6作用域表栈操作形式化,主要包括以下步骤:
S6-1、表栈出栈操作形式化;
S6-1-1、输入:局部变量作用域表栈;
S6-1-2、输出:栈顶表出栈后的局部变量作用域表栈或异常抛出;
S6-1-3、定义:若表栈内元素大于0则移除栈顶表返回表栈,否则抛出异常;
S6-1-4、Coq形式化方法:利用match匹配形式化操作展开的两个分支,使用带有option限制的输出来形式化异常抛出操作;
S6-2、表栈入栈操作形式化:
S6-2-1、输入:局部变量作用域表栈,待入栈局部变量作用域表;
S6-2-2、输出:新表入栈后的局部变量作用域表栈;
S6-2-3、定义:将待入栈局部变量作用域表置于表栈栈顶,返回局部变量作用域表栈;
S6-2-4、Coq形式化方法:利用形式化方法S3形式化局部变量作用域表,利用match匹配展开形式化方法S3构成的形式化局部变量作用域表栈;
S6-3、栈顶表复制操作形式化:
S6-3-1、输入:待复制局部变量作用域表、待继承变量名列表;
S6-3-2、输出:复制产生的局部变量作用域表或异常抛出;
S6-3-3、定义:若待集成变量名列表中的变量名都为合法变量名,则构造空白表,复制待复制局部变量作用域表中所有变量名对应地址的值至空白表,并返回该表;否则抛出异常;
S6-3-4、Coq形式化方法:利用match匹配形式化条件判断产生的程序分支,利用形式化方法S5-2形式化单变量写入作用域表操作,在此基础上利用Fixpoint递归函数形式化多个变量值写入的重复性操作,使用带有option限制的输出来形式化异常抛出操作。
6.根据权利要求4所述的一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,包括步骤S7全局变量操作方法形式化,主要包括以下步骤:
S7-1、全局变量读操作形式化:
形式化方法S7-1包含以下形式化定义及Coq形式化方法:
S7-1-1、输入:虚拟内存、全局变量作用域表、待读取变量名、待读取变量类型;
S7-1-2、输出:变量名对应的虚拟内存值或异常抛出;
S7-1-3、定义:如果给出的变量名合法、对应全局变量作用域表有变量信息、对应虚拟内存地址中有合法值、该合法值与待读取变量类型一致,则返回该合法值;否则异常抛出;
S7-1-4、Coq形式化方法:使用FSPVM中定义的内存读操作read_by_address,使用match匹配形式化条件判断产生的程序分支,使用形式化方法S5-1形式化对全局变量作用域表的读操作,使用带有option限制的输出来形式化异常抛出操作;
S7-2、全局变量写操作形式化:
S7-2-1、输入:虚拟内存、全局变量作用域表、待写入变量名、待写入变量值;
S7-2-2、输出:写入修改后的虚拟内存或异常抛出;
S7-2-3、定义:如果变量名合法、对应全局变量作用域表有变量信息、对应虚拟内存地址合法,则在虚拟内存的该地址处写入待写入变量值;否则异常抛出;
S7-2-4、Coq形式化方法:使用FSPVM中定义的内存读操作write_by_address,使用match匹配形式化条件判断产生的程序分支,使用形式化方法S5-1形式化对全局变量作用域表的读操作,使用带有option限制的输出来形式化异常抛出操作。
7.根据权利要求6所述的一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,还包括步骤S8局部变量操作方法形式化,主要包括以下步骤:
S8-1、局部变量读操作形式化:
S8-1-1、输入:虚拟内存,局部变量作用域表栈,待写入变量名,待读取变量类型;
S8-1-2、输出:变量名对应的虚拟内存值或异常抛出;
S8-1-3、定义:如果给出的变量名合法、对应局部变量作用域表栈非空、对应局部变量作用域栈顶表有变量信息、对应虚拟内存地址中有合法值、该合法值与待读取变量类型一致,则返回该合法值;否则异常抛出;
S8-1-4、Coq形式化方法:使用match匹配展开Inductive形式化定义的表栈结构,形式化获取栈顶表操作,使用形式化方法S7-1形式化对局部变量作用域栈顶表的读操作,使用带有option限制的输出来形式化异常抛出操作;
S8-2、局部变量写操作形式化:
S8-2-1、输入:虚拟内存、局部变量作用域表栈、待写入变量名、待写入变量值;
S8-2-2、输出:写入修改后的虚拟内存或异常抛出;
S8-2-3、定义:如果变量名合法、对应局部变量作用域表栈非空、对应局部变量作用域栈顶表有变量信息、对应虚拟内存地址合法,则在虚拟内存的该地址处写入待写入变量值;否则异常抛出;
S8-2-4、Coq形式化方法:使用match匹配展开Inductive形式化定义的表栈结构性,形式化获取栈顶表操作,使用形式化方法S7-2形式化对局部变量作用域表栈栈顶表的写操作使用带有option限制的输出来形式化异常抛出操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911128077.6A CN110851141B (zh) | 2019-11-18 | 2019-11-18 | 一种基于Coq的C++编译器变量作用域形式化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911128077.6A CN110851141B (zh) | 2019-11-18 | 2019-11-18 | 一种基于Coq的C++编译器变量作用域形式化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110851141A true CN110851141A (zh) | 2020-02-28 |
CN110851141B CN110851141B (zh) | 2021-03-09 |
Family
ID=69601874
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911128077.6A Active CN110851141B (zh) | 2019-11-18 | 2019-11-18 | 一种基于Coq的C++编译器变量作用域形式化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110851141B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1437102A (zh) * | 2002-09-11 | 2003-08-20 | 北京南思达科技发展有限公司 | 宏指令集对称式并行体系结构微处理器 |
US20160328542A1 (en) * | 2015-05-05 | 2016-11-10 | Nxp, B.V. | White-box elliptic curve point multiplication |
CN106971038A (zh) * | 2017-03-22 | 2017-07-21 | 南京航空航天大学 | 基于Coq的航空电子模式控制一致性验证方法 |
CN108509336A (zh) * | 2018-03-05 | 2018-09-07 | 华东师范大学 | 一种操作系统规范形式化验证与测试方法 |
CN109753288A (zh) * | 2019-01-14 | 2019-05-14 | 杭州云象网络技术有限公司 | 一种适用于形式化验证的智能合约编译方法 |
US10339102B2 (en) * | 2016-09-30 | 2019-07-02 | Vmware, Inc. | Automating script creation for a log file |
-
2019
- 2019-11-18 CN CN201911128077.6A patent/CN110851141B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1437102A (zh) * | 2002-09-11 | 2003-08-20 | 北京南思达科技发展有限公司 | 宏指令集对称式并行体系结构微处理器 |
US20160328542A1 (en) * | 2015-05-05 | 2016-11-10 | Nxp, B.V. | White-box elliptic curve point multiplication |
US10339102B2 (en) * | 2016-09-30 | 2019-07-02 | Vmware, Inc. | Automating script creation for a log file |
CN106971038A (zh) * | 2017-03-22 | 2017-07-21 | 南京航空航天大学 | 基于Coq的航空电子模式控制一致性验证方法 |
CN108509336A (zh) * | 2018-03-05 | 2018-09-07 | 华东师范大学 | 一种操作系统规范形式化验证与测试方法 |
CN109753288A (zh) * | 2019-01-14 | 2019-05-14 | 杭州云象网络技术有限公司 | 一种适用于形式化验证的智能合约编译方法 |
Non-Patent Citations (1)
Title |
---|
ZHENG YANG等: "Optimization of Executable Formal Interpreters Developed in Higher-Order Logic Theorem Proving Systems", 《IEEE ACCESS》 * |
Also Published As
Publication number | Publication date |
---|---|
CN110851141B (zh) | 2021-03-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Heule et al. | Efficient, verified checking of propositional proofs | |
Barrett et al. | CVC Lite: A new implementation of the cooperating validity checker: Category B | |
CN103559449B (zh) | 一种代码改动的检测方法及装置 | |
Barbosa et al. | Scalable fine-grained proofs for formula processing | |
Bergmann et al. | A benchmark evaluation of incremental pattern matching in graph transformation | |
US5452226A (en) | Rule structure for insertion of new elements in a circuit design synthesis procedure | |
Gonzalez et al. | Graph based concept learning | |
Braibant et al. | Implementing and reasoning about hash-consed data structures in Coq | |
Hadarean et al. | Fine grained SMT proofs for the theory of fixed-width bit-vectors | |
Heinen et al. | Juggrnaut: Graph grammar abstraction for unbounded heap structures | |
Abrahamsson | A verified proof checker for higher-order logic | |
Abrahamsson et al. | Proof-producing synthesis of CakeML from monadic HOL functions | |
US8935657B2 (en) | Model-to-model transformation by kind | |
Sheard et al. | Programming in Ω mega | |
CN110851141B (zh) | 一种基于Coq的C++编译器变量作用域形式化方法 | |
Cunha et al. | Strongly typed rewriting for coupled software transformation | |
Andreotti et al. | Carcara: An efficient proof checker and elaborator for SMT proofs in the Alethe format | |
Mross et al. | Transformation of GRAFCET Into GAL for Verification Purposes Based on a Detailed Meta-Model | |
Hesselink et al. | Formalizing a hierarchical file system | |
Falke et al. | A Theory of Arrays with set and copy Operations. | |
US9875329B1 (en) | Method and system for import of mask layout data to a target system | |
WO2023248364A1 (ja) | プログラム生成装置、プログラム生成方法及びプログラム生成プログラム | |
Schellhorn et al. | Check for updates Refinement and Separation: Modular Verification of Wandering Trees | |
Stump et al. | Towards an SMT proof format | |
Hamie | Pattern-based mapping of OCL specifications to JML contracts |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |