一种基于Coq的C++编译器变量作用域形式化方法技术

技术编号:23445331 阅读:62 留言:0更新日期:2020-02-28 19:38
本发明专利技术公开了一种基于Coq的C++编译器变量作用域形式化方法,采用record数学模型形式化表结构,采用Inductive归纳定义形式化栈结构,采用match匹配形式化代码中引起分支的操作逻辑,采用Fixpoint递归函数形式化重复行为操作逻辑。现有技术中的FSPVM解释器在解释变量操作方法的时候,如果变量操作方法带有作用域特性,就会错误解释。采用本发明专利技术中的变量操作方法替代FSPVM解释器里的解释变量操作方法可以让新的FSPVM解释器能够解释带有作用域特性的代码。本发明专利技术使用了Record数学模型形式化字典数据结构,较使用Inductive归纳方法的传统形式化方式明显的提升了执行效率。

A formal method of variable scope of C + + compiler based on Coq

【技术实现步骤摘要】
一种基于Coq的C++编译器变量作用域形式化方法
本专利技术属于计算机应用的
,具体涉及一种基于Coq的C++编译器变量作用域形式化方法。
技术介绍
自区块链和虚拟币种市场诞生以来,各种安全问题层出不穷,由于各种安全问题导致的黑客攻击引起的损失也成文了行业内的关注重点。为了保证代码安全,业界提出了多种代码检测的方式。但就EOS智能合约的形式化验证,现阶段还没有成熟的方案。出现这一现象主要是由于对工业级程序语义的形式化语义较为困难。形式语义与形式建模即为了对计算机系统的行为进行推理验证,需要对编程语言的语义进行严格的定义,使用形式模型对计算机系统的行为进行建模。虽然当前有很多项目已经实现了对以太坊的智能合约的形式化验证,但是极少有对EOS智能合约的形式化验证。这主要是由于相较于由solidity编写的以太坊智能合约,由C++编写的EOS智能合约的语法和语义更为复杂。在形式化EOS智能合约时需要实现C++特有的语法特性形式化,其中C++变量作用域的形式化验证方案目前业界还未有成熟的解决方案。
技术实现思路
本专利技术公开了一种基于Coq的C++编译器变量作用域形式化方法,目的为解决Coq解释器无法将含有变量作用域特性的代码正确解释为虚拟内存指令序列的问题。本专利技术主要通过以下技术方案实现:一种基于Coq的C++编译器变量作用域形式化方法,采用record数学模型形式化表结构,采用Inductive归纳定义形式化栈结构,采用match匹配形式化代码中引起分支的操作逻辑,采用Fixpoint递归函数形式化重复行为操作逻辑。形式化验证:指从数学上完备地证明或验证程序的实现方案是否确实实现了程序设计所描述的功能。形式化/形式化方法:本专利技术中指代将某一实体或行为或特性抽象成Coq中的可解释的数学模型。FSPVM形式化验证引擎:指使用基于coq的形式化符号执行虚拟机[1](formalsymbolicprocessvirtualmachine,FSPVM)验证智能合约安全性的解决方案。(YangZ,LeiH.FormalProcessVirtualMachineforSmartContractsVerification[J].InternationalJournalofPerformabilityEngineering,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(YangZ,LeiH.FormalProcessVirtualMachineforSmartContractsVerification[J].InternationalJournalofPerformabilityEngineering,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、输入:待复制局部变量作用域表、待继承变量名列本文档来自技高网...

【技术保护点】
1.一种基于Coq的C++编译器变量作用域形式化方法,其特征在于,采用record数学模型形式化表结构,采用Inductive归纳定义形式化栈结构,采用match匹配形式化代码中引起分支的操作逻辑,采用Fixpoint递归函数形式化重复行为操作逻辑。/n

【技术特征摘要】
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、输出:复制产生的局部变量作用域表或...

【专利技术属性】
技术研发人员:雷航王自升李昂杨拯钱伟中唐琴曾惟如晏昃晖
申请(专利权)人:电子科技大学成都互诚在线科技有限公司
类型:发明
国别省市:四川;51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1