当前位置: 首页 > 专利查询>河海大学专利>正文

一种面向solidity语言的测试用例生成方法技术

技术编号:21798851 阅读:24 留言:0更新日期:2019-08-07 10:26
本发明专利技术公开了一种面向solidity语言的测试用例生成方法,针对应用solidity语言实现的智能合约程序,根据程序得到对应的控制流图(CFG),控制流图中涵盖了该智能合约程序中函数方法间的调用信息;根据程序CFG得到程序中存在的变量的定义‑使用对(dup);在生成测试用例的过程中,应用遗传算法加快有效测试用例的生成速度。另一方面,考虑solidity存在的整数溢出安全性问题,设计遗传算法的适应度函数时强调测试用例对可引起整数溢出错误的变量的定义及使用实现了覆盖,对与整数溢出错误相关的dup实现覆盖的测试用例的适应度值会相对较大。本发明专利技术方法切实可行,在实现对程序中常规变量操作进行覆盖测试的基础上,实现了整数溢出覆盖测试。

A Test Case Generation Method for Solidity Language

【技术实现步骤摘要】
一种面向solidity语言的测试用例生成方法
本专利技术涉及一种面向solidity语言的测试用例生成方法,尤其涉及到应用遗传算法并基于数据流测试的测试用例生成方法,属于软件测试

技术介绍
近两年来,随着区块链技术的不断发展,数字货币、智能合约成为了许多研究的热点,其中以太坊是支持智能合约部署编译的典型平台之一,solidity更是成为当今智能合约编写的热门语言。之所以被称为智能合约,其主要特点就在于可以自动的或具备一定的智能性的,通过预先定义好的执行条件和逻辑,在条件满足时,自动的执行合约内容,实现期望的功能;尤其是借助于区块链平台的去中心化、去信任、防篡改等特性,智能合约的优势被更好的放大,有了更大的应用前景。因此,对solidity这门语言的测试也是一个需更深入研究的问题。由于区块链平台的特性,以solidity语言编写的智能合约没办法在执行过程中完成动态测试,因此,目前对于solidity语言的测试分析主要集中在对源代码进行静态分析上。除了传统语言中常见的程序错误,在solidity语言中还可能因编程缺陷等引发一些其特有的错误。针对solidity语言编程,Tsankov等人开发了一个程序分析器Securify,该分析器将程序预定义为两种模式:合规模式和违规模式,然后通过分析合约的依赖图从代码中得到语言信息,通过预定义的条件,判断程序合规或违规或者警告;基于重入攻击这个错误,Liu等提出了一个模型ReGuard,该模型通过将solidity程序通过中间表示转换成通过语言C++,然后通过对得到的C++程序执行模糊测试迭代的生成随机又不同的交易来发现错误。随着对智能约合的使用越来越广泛,已经不仅仅是在货币交易领域,在其他通用信息产业等领域也将会有很广泛的使用,而面向solidity语言的测试仍处于起步阶段,因此有必要考虑到面向程序整体测试的测试用例生成技术。
技术实现思路
专利技术目的:考虑到solidity语言的新颖性,且在使用过程中已出现了一些较为严重的安全性错误;与此同时,随着智能合约的应用领域越来越广,在现有的一些静态代码分析的基础上,程序的通用测试也是一个需求。本专利技术目的是提供一种面向solidity语言的测试用例生成方法,基于数据流测试的方法,实现对程序执行过程中变量操作进行整体性测试,并同时强调了对执行过程中可引发整数溢出错误的变量操作的测试。技术方案:为实现上述专利技术目的,本专利技术采用如下技术方案:一种面向solidity语言的测试用例生成方法,包括如下步骤:(1)根据solidity语言的变量类型、流程控制语句、函数体结构、内部函数require以及函数修改器的使用对solidity语言实现的待测试智能合约程序进行分析得到对应的控制流图CFG;(2)根据步骤(1)的CFG图遍历各节点信息,判断存在uint型变量使用的节点是否存在整数溢出错误的安全性问题,若存在,则将存在整数溢出错误的节点标记;(3)根据步骤(1)的CFG图遍历各节点信息,统计出程序中所有数值型变量的定义-使用对,记为dup,且若步骤(2)中判断结果为存在整数溢出错误,则将包含步骤(2)中的标记节点存在的变量的定义-使用对统计出来,记为dup’;(4)根据步骤(3)统计出的dup,针对程序中的所有数值型变量随机生成初始的包含若干组测试用例的测试用例集;(5)设计遗传算法中的适应度函数用于选取较优的测试用例以驱动算法执行;其中测试用例的适应度值为测试用例覆盖的dup的数量与覆盖的涉及到整数溢出错误的dup’数量的加权和与所有dup的数量与所有dup’数量加权和的比值;(6)根据步骤(5)中的适应度函数以及算法的执行界限,求得步骤(4)中初始测试用例的适应度值,开始遗传算法迭代执行,得到算法内最优结果。在优选的实施方案中,所述步骤(1)中分析待测试程序的CFG图时,考虑程序中地址型变量的使用,考虑由地址变量引出其他变量的定义;考虑程序中require和assert条件判断语句的使用,将require语句作为一个if条件结构语句进行处理;将函数修改器看作是函数调用的一种形态,遇到函数体时,首先分析该函数是否使用了函数修改器,若使用了函数修改器则先转入函数修改器,根据函数修改器内容进行节点间的连接关系转移。在优选的实施方案中,所述步骤(2)中包括如下步骤:(21)根据步骤(1)得到的CFG分析程序中是否存在整数溢出错误,具体为:遍历CFG图节点,对于存在uint型变量使用的节点,其中变量使用包括执行加、减、乘或除计算,判断在变量使用节点前是否已有对相应变量操作结果进行溢出判断的语句节点,若没有,则判定程序会出现整数溢出错误;(22)若存在整数溢出错误,对CFG中涉及到引发整数溢出错误的变量操作节点进行标注。在优选的实施方案中,所述步骤(3)中包括如下步骤:(31)根据CFG图,逐节点分析语句信息,找到程序中存在的数值型变量的定义节点;(32)针对步骤(31)中找到的每一个变量的定义节点,找到其对应的所有使用节点;(33)结合步骤(31)、(32),得到程序中存在的变量的定义-使用对:dup=(d,u,v),计算其总数量,记为n;其中v表示某一变量,d表示v的某一定义节点,u表示v的某一使用节点;(34)结合步骤(22)与步骤(31)、(32)的内容得到存在整数溢出问题的变量定义-使用对,这里用dup’表示,计算其总数量,记为m,若步骤(22)中结果为没有整数溢出问题,即未做标记,则此处m统计值为0。在优选的实施方案中,所述步骤(4)中针对程序中的所有数值型变量随机生成初始的包含4组测试用例的测试用例集。在优选的实施方案中,所述步骤(5)中,适应度函数公式其中pi表示第i个测试用例覆盖的dup的数量,qi表示第i个测试用例覆盖的涉及到整数溢出错误的dup’数量,n表示程序中所有dup的数量,m表示程序中所有涉及到整数溢出错误的dup’数量,ε为权重参数,0<ε<1。在优选的实施方案中,所述步骤(6)中,算法执行界限的设定包含两部分:(1)遗传算法迭代次数,若达到最高代数限制,适应度值仍未达到1,也结束;(2)在遗传代数上限内,若适应度值达到1则保存当前测试用例生成结果,再进行下一代实验,若实验结果的适应度值较父代小,则结束,取上一代结果。在优选的实施方案中,所述步骤(6)中包括如下步骤:(61)种群中个体适应度值计算:对于生成的每个个体,即每个测试用例,将对应的测试数据放到程序中执行,通过预先对源程序进行插桩的方式计算其覆盖的dup数量,记为p,以及覆盖dup’数量,记为q,在统计q的值时,其前提条件为在当前个体执行状态下,变量的操作满足溢出条件,才将其记为对整数溢出错误的一次有效覆盖,根据适应度函数,计算个体适应度值;(62)遗传算法迭代执行,选取算法内最优结果:依照遗传算法中的轮盘赌选择法、均匀交叉算子以及变异执行迭代执行遗传算法,遗传算法每一次执行适应度值计算都如步骤(61),直到达到算法执行界限为止,最终得到算法结果。有益效果:本专利技术提供的一种面向solidity语言的基于数据流测试的测试用例生成方法,考虑到程序执行中涉及到较多的函数调用,而在函数执行调用过程中,变量的定义和使用又是其关键环节,本文档来自技高网
...

【技术保护点】
1.一种面向solidity语言的测试用例生成方法,其特征在于,包括如下步骤:(1)根据solidity语言的变量类型、流程控制语句、函数体结构、内部函数require以及函数修改器的使用对solidity语言实现的待测试智能合约程序进行分析得到对应的控制流图CFG;(2)根据步骤(1)的CFG图遍历各节点信息,判断存在uint型变量使用的节点是否存在整数溢出错误的安全性问题,若存在,则将存在整数溢出错误的节点标记;(3)根据步骤(1)的CFG图遍历各节点信息,统计出程序中所有数值型变量的定义‑使用对,记为dup,且若步骤(2)中判断结果为存在整数溢出错误,则将包含步骤(2)中的标记节点存在的变量的定义‑使用对统计出来,记为dup’;(4)根据步骤(3)统计出的dup,针对程序中的所有数值型变量随机生成初始的包含若干组测试用例的测试用例集;(5)设计遗传算法中的适应度函数用于选取较优的测试用例以驱动算法执行;其中测试用例的适应度值为测试用例覆盖的dup的数量与覆盖的涉及到整数溢出错误的dup’数量的加权和与所有dup的数量与所有dup’数量加权和的比值;(6)根据步骤(5)中的适应度函数以及算法的执行界限,求得步骤(4)中初始测试用例的适应度值,开始遗传算法迭代执行,得到算法内最优结果。...

【技术特征摘要】
1.一种面向solidity语言的测试用例生成方法,其特征在于,包括如下步骤:(1)根据solidity语言的变量类型、流程控制语句、函数体结构、内部函数require以及函数修改器的使用对solidity语言实现的待测试智能合约程序进行分析得到对应的控制流图CFG;(2)根据步骤(1)的CFG图遍历各节点信息,判断存在uint型变量使用的节点是否存在整数溢出错误的安全性问题,若存在,则将存在整数溢出错误的节点标记;(3)根据步骤(1)的CFG图遍历各节点信息,统计出程序中所有数值型变量的定义-使用对,记为dup,且若步骤(2)中判断结果为存在整数溢出错误,则将包含步骤(2)中的标记节点存在的变量的定义-使用对统计出来,记为dup’;(4)根据步骤(3)统计出的dup,针对程序中的所有数值型变量随机生成初始的包含若干组测试用例的测试用例集;(5)设计遗传算法中的适应度函数用于选取较优的测试用例以驱动算法执行;其中测试用例的适应度值为测试用例覆盖的dup的数量与覆盖的涉及到整数溢出错误的dup’数量的加权和与所有dup的数量与所有dup’数量加权和的比值;(6)根据步骤(5)中的适应度函数以及算法的执行界限,求得步骤(4)中初始测试用例的适应度值,开始遗传算法迭代执行,得到算法内最优结果。2.根据权利要求1所述的面向solidity语言的测试用例生成方法,其特征在于,所述步骤(1)中分析待测试程序的CFG图时,考虑程序中地址型变量的使用,考虑由地址变量引出其他变量的定义;考虑程序中require和assert条件判断语句的使用,将require语句作为一个if条件结构语句进行处理;将函数修改器看作是函数调用的一种形态,遇到函数体时,首先分析该函数是否使用了函数修改器,若使用了函数修改器则先转入函数修改器,根据函数修改器内容进行节点间的连接关系转移。3.根据权利要求1所述的面向solidity语言的测试用例生成方法,其特征在于,所述步骤(2)中包括如下步骤:(21)根据步骤(1)得到的CFG分析程序中是否存在整数溢出错误,具体为:遍历CFG图节点,对于存在uint型变量使用的节点,其中变量使用包括执行加、减、乘或除计算,判断在变量使用节点前是否已有对相应变量操作结果进行溢出判断的语句节点,若没有,则判定程序会出现整数溢出错误;(22)若存在整数溢出错误,对CFG中涉及到引发整数溢出错误的变量操作节点进行标注。4.根据权利要求3所述的面向solidity语言的测试用例生成...

【专利技术属性】
技术研发人员:张鹏程于佳男吉顺慧肖锋
申请(专利权)人:河海大学
类型:发明
国别省市:江苏,32

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

1