CN115037648B - 基于数据流约简的智能合约测试用例生成方法及系统 - Google Patents
基于数据流约简的智能合约测试用例生成方法及系统 Download PDFInfo
- Publication number
- CN115037648B CN115037648B CN202210634059.0A CN202210634059A CN115037648B CN 115037648 B CN115037648 B CN 115037648B CN 202210634059 A CN202210634059 A CN 202210634059A CN 115037648 B CN115037648 B CN 115037648B
- Authority
- CN
- China
- Prior art keywords
- node
- definition
- path
- nodes
- test case
- 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.)
- Active
Links
- 238000012360 testing method Methods 0.000 title claims abstract description 120
- 238000000034 method Methods 0.000 title claims abstract description 82
- 230000009467 reduction Effects 0.000 title claims abstract description 60
- 238000004422 calculation algorithm Methods 0.000 claims abstract description 24
- 238000005206 flow analysis Methods 0.000 claims abstract description 9
- 235000012907 honey Nutrition 0.000 claims description 113
- 230000006870 function Effects 0.000 claims description 64
- 241000257303 Hymenoptera Species 0.000 claims description 47
- 238000004590 computer program Methods 0.000 claims description 14
- 238000010586 diagram Methods 0.000 claims description 11
- 238000004458 analytical method Methods 0.000 claims description 6
- 230000003993 interaction Effects 0.000 claims description 6
- 238000010276 construction Methods 0.000 claims description 5
- 238000012545 processing Methods 0.000 claims description 5
- 230000007423 decrease Effects 0.000 claims description 4
- 238000011835 investigation Methods 0.000 claims description 3
- 238000001514 detection method Methods 0.000 abstract description 9
- 230000008569 process Effects 0.000 description 10
- 230000002068 genetic effect Effects 0.000 description 9
- 238000003780 insertion Methods 0.000 description 3
- 230000037431 insertion Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000035772 mutation Effects 0.000 description 2
- 238000005070 sampling Methods 0.000 description 2
- 238000012795 verification Methods 0.000 description 2
- 230000005856 abnormality Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 239000006185 dispersion Substances 0.000 description 1
- 238000013100 final test Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000013522 software testing Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000012549 training Methods 0.000 description 1
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L43/00—Arrangements for monitoring or testing data switching networks
- H04L43/08—Monitoring or testing based on specific metrics, e.g. QoS, energy consumption or environmental parameters
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L43/00—Arrangements for monitoring or testing data switching networks
- H04L43/14—Arrangements for monitoring or testing data switching networks using software, i.e. software packages
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer Security & Cryptography (AREA)
- Environmental & Geological Engineering (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于数据流约简的智能合约测试用例生成方法及系统。本发明首先对Solidity智能合约源程序结构进行分析,构建控制流图;然后通过遍历构建的控制流图进行数据流分析,提取出变量信息、require语句以及定义使用对等,并对定义使用对进行分类;之后设计数据流约简方法对获取到的定义使用对进行约简,减少测试用例生成方法的覆盖目标;在测试用例生成阶段,根据约简后的定义使用对进行源程序插桩,改进蜂群搜索系数,并应用人工蜂群算法优化测试用例生成,从而提高测试用例的覆盖率以及方法的效率。本发明方法切实可行,在提升方法执行效率的同时能够生成具有高覆盖的测试用例集,并实现了对智能合约的错误检测。
Description
技术领域
本发明涉及一种智能合约数据流测试用例生成方法及系统,属于软件测试技术领域。
背景技术
区块链由于其分散化、不篡改、透明度、可追溯性等特点,为提高资源利用率、隐私性、安全性、可追溯性和可靠性提供了解决方案,并广泛应用于各个领域。智能合约是部署在区块链平台上的计算机程序,当区块链状态满足执行条件时自动执行,可用于管理资金流动、资产交换和信息验证。区块链的特点使得智能合约非常受欢迎。智能合约被认为有可能重塑银行、保险、供应链和金融交易所等众多行业。然而,随着已开发的智能合约数量的不断增长,严重的安全漏洞经常出现。由于区块链的固有特性,一旦部署就不可能进行修改。如果部署了一个脆弱的智能合约,它可能会导致严重的后果。因此,在部署智能合约之前,合约发布者必须确保部署的合约不存在漏洞和错误。这使得对智能合约的充分测试变得非常重要,特别是在它部署它之前。
随着智能合约攻击的频繁出现,暴露出未经测试的智能合约的弱点,各种关于智能合约测试方法和技术的研究工作已经被广泛开展。大多数现有的检测智能契约中常见漏洞的方法基于符号执行、形式验证和模糊化等技术。Chan等人为智能合约设计了一个模糊测试体系架构,并实现了一个名为ContractFuzzer的模糊器来检查漏洞和编码错误,其中针对不同的漏洞定义了测试准则。该工具被证明能够有效地高精度检测真实智能合约中的多种安全漏洞。Zhou等人通过模型训练来嵌入智能合约函数特征,从真实部署的智能合约数据集中搜索相似的函数,学习相似函数的交易记录,为测试智能合约生成输入数据。Sun等人将突变测试应用到智能合约的整数溢出漏洞测试中,针对整数溢出漏洞提出了五种突变算子,利用生成的漏洞突变体对现有整数溢出漏洞测试工具进行评估。Zhang等人提出了基于数据流准则的智能合约测试用例生成方法,该方法改进了传统的适应度函数,应用遗传算法生成测试用例。
虽然目前的方法对智能合约测试取得了一些进展,但仍然存在以下问题:1)随着程序的复杂度、代码行数的增长,定义使用对的数量急剧增多,这导致测试用例生成方法的覆盖目标规模很大,不仅影响算法的性能,也降低了对程序的测试效率;2)目前针对智能合约的数据流测试用例生成方法虽然可以取得一定的覆盖率,但是没有实现测试用例集对定义使用对全覆盖的目标,这可能导致智能合约得不到充分的测试,遗漏存在的错误。因此,优化数据流测试测试用例生成,进一步检测智能合约中是否存在未知的编程错误是十分必要的。
发明内容
发明目的:考虑到部署了易受攻击的智能合约可能会导致严重后果,一方面目前针对智能合约测试方法还不完善;另一方面,已有的数据流测试用例生成方法不仅存在冗余的定义使用对影响方法性能和测试效率的问题,还存在生成的测试用例不能实现对智能合约中定义使用对全覆盖的问题。因此本发明提出了一种改进的数据流测试用例生成方法及系统,基于数据流约简,并优化了测试用例生成过程,进一步提高测试用例对定义使用对的覆盖率,提升方法的效率。
技术方案:为实现上述发明目的,本发明所述的一种基于数据流约简的智能合约测试用例生成方法,包括如下步骤:
(1)根据Solidity语言的结构及交互特性,对Solidity智能合约源程序进行分析,构建对应的控制流图;
(2)基于步骤(1)构建的控制流图进行数据流分析,提取出函数执行的变量信息,识别程序中的require语句,计算出所有变量的定义使用对并分类为一般定义使用对Nor_dup和require相关定义使用对Req_dup;
(3)设计数据流约简方法,根据步骤(1)构建的控制流图和步骤(2)提取出的所有定义使用对进行数据流约简,计算程序所有执行路径并识别条件分支节点,对每一条路径,如果路径上存在条件分支节点,查找其后第一个非条件判断,且使用了变量的节点,并保存该节点相关的定义使用对;否则,查找路径上离结束节点最近的使用节点,并保存该节点相关的定义使用对;
(4)根据约简后的定义使用对进行源程序插桩,根据步骤(2)提取的变量信息进行蜂群初始化,改进搜索系数,如果生成新的蜜源没有覆盖任何新的定义使用对,增大搜索系数取值范围,否则减小搜索系数取值范围,应用人工蜂群算法生成测试用例;
(5)将步骤(4)生成的测试用例作为智能合约的输入,执行合约并检测其是否存在错误。
作为优选,所述步骤(1)包括如下步骤:
(11)对于合约中的每个函数构建一个单独的控制流图作为子控制流图。针对程序中每一个有效语句作为控制流图的一个结点,并添加函数的开始和结束结点;以连接两个节点的有向边表示语句之间的执行顺序。同时,需要分析程序的顺序结构、选择结构和循环结构。在构建过程中,合约中的require语句被视为选择结构;
(12)通过创建表示两个函数之间的调用和返回关系的两条边来描述函数调用的关系,构建全局控制流图。
作为优选,所述步骤(2)包括如下步骤:
(21)遍历步骤(1)构建的控制流图,分析每个节点的信息并判断是否对应函数声明语句,以获取用于执行智能合约的变量信息,包括变量名称、变量类型和变量长度,提取并存储函数的输入参数的变量信息;
(22)遍历步骤(1)构建的控制流图,判断每个节点是否对应一个require语句,将require语句对应的结点编号进行保存;
(23)基于步骤(1)构建的控制流图,通过可达定义分析计算各节点变量的可达定义,分析各节点变量的使用,从而计算出每个变量的定义使用对All_dup;
(24)基于步骤(22)获取的require语句结点和步骤(23)计算的定义使用对All_dup,将定义使用对进行分类,分为Nor_dup和Req_dup。Nor_dup用于存储智能合约中一般定义使用对;Req_dup用于存储与require语句相关的定义使用对。
作为优选,所述步骤(3)包括:
(31)遍历步骤(1)构建的子控制流图,从start节点开始,沿着有向边遍历目标节点,对遍历的当前节点,判断其后继节点数量是否为1。如果后继节点数为1,则继续向下遍历,将目标节点添加到当前路径Templisti中;如果后继节点数大于1,则根据后继节点数量复制当前路径Templisti,每一条路径对应一条分支路径,并分别沿着每一个分支路径继续向下遍历,直到遇到end节点为止,将当前路径存入Pathlist中;
(32)遍历步骤(1)构建的全局控制流图,获取子控制流图之间的函数调用边call;根据函数调用边call的开始节点call_start(即函数调用节点)和结束节点call_end(即被调用函数的start节点),在Pathlist中搜索对应的开始节点call_start所在路径Pathlista和结束节点call_end所在路径Pathlistb;将Pathlista中从call_start后的所有节点移入到TempPath中,将Pathlistb中的所有节点加入到Pathlista中call_start节点处;最后,将TempPath加入到Pathlista中,并将Pathlista存入最终的路径集合GPath中;
(33)遍历步骤(1)构建的全局控制流图,将节点类型为if、for、while、require等的节点id存储在条件分支节点集合Con_id中;
(34)针对步骤(32)获取的路径集合GPath的每一条路径GPathi,从start节点开始顺序遍历路径中的所有节点;如果当前节点是条件分支节点,即当前节点属于Con_id,则沿着路径往后遍历找到第一个非条件分支节点,如果该非条件分支节点中使用了某个变量的节点,在Nor_dup和Req_dup中查找其相关的定义使用对,存入约简后的定义使用对集合Redups中,继续向下遍历;否则继续向下搜索是否存在下一个非条件分支节点对应的定义使用对,直到搜索到下一个条件分支节点重复上述步骤或end节点为止;
(35)当遍历完一条路径GPathi中所有节点都不属于条件分支节点,即不属于Con_id,则后序遍历当前路径的节点,找到距离end节点最近的使用节点,在Nor_dup中查找对应使用节点的定义使用对,存入约简后的定义使用对集合Redups中。
作为优选,所述步骤(4)包括如下步骤:
(41)根据最终约简的定义使用对集合Redups对智能合约源程序进行插桩,用于统计定义使用对所在语句的覆盖情况;
(42)根据提取的变量信息对蜜源进行初始化,大小为N,每个蜜源即为一个测试用例,以及初始化规模为2N的蜂群,包括引领蜂和跟随蜂,两者各取蜂群规模一半,即为N。初始化操作根据以下公式随机产生N个蜜源:
Xij=XLj+rand(XUj-XLj)
其中i∈{1,2,…,N},j∈{1,2,…S},每个解Xi是一个S维的向量,S是执行合约输入参数的个数,rand是(0,1)内的随机数。XLj、XUj分别表示参数取值的最小值与最大值;
(43)将蜜源输入到插桩后的智能合约,并根据合约执行后定义使用对的覆盖情况计算蜜源的适应度值,适应度函数如下:
其中r表示程序中约简后的Redups的数量,n表示当前测试用例tc所覆盖的约简后的Nor_dup的数量,m表示当前测试用例tc所覆盖的约简后的Req_dup的数量,是Req_dup的加权参数;
(44)根据贪心策略,从适应度最大的蜜源开始选择测试用例,如果蜜源覆盖了新的定义使用对,保存该蜜源为一个测试用例,记录该测试用例与定义使用对的覆盖关系,否则抛弃该蜜源;
(45)判断算法终止条件是否满足,若满足以下终止条件之一:1)达到最大迭代次数MaxIteration;2)所有约简后的定义使用对都被覆盖,则执行步骤(49);否则,执行步骤(46);
(46)每个引领蜂对应一个蜜源,所有引领蜂根据以下公式搜索新的蜜源:
Yij=Xij+μ(Xij-Xkj)
其中Yij表示新的蜜源,Xij表示当前蜜源,Xkj表示邻近蜜源,i,k∈{1,2,…,N},k≠i,j∈{1,2,…S},μ是蜂群搜索系数,μ∈[-λ,λ],其中λ的初始值为1。对新的蜜源进行适应度评估,如果新的蜜源适应度优于之前的蜜源,引领蜂则更新蜜源信息;否则仍保留之前的蜜源信息;如果生成蜜源没有覆盖任何新的定义使用对,λ值增大;否则λ值减小;
(47)根据轮盘赌规则,跟随蜂根据步骤(46)引领蜂搜索到的蜜源的适应度,选择相应的引领蜂进行跟随,一个蜜源被选择的概率根据以下公式计算:
其中fiti表示第i个蜜源的适应度。当跟随蜂选择蜜源后,跟随蜂转变为引领蜂,根据步骤(46)中公式搜索新的蜜源,并根据蜜源适应度对蜜源进行更新,完成蜜源搜索后,引领蜂转变为跟随蜂;
(48)被抛弃蜜源对应的引领蜂转变为侦查蜂,根据步骤(42)中公式随机生成一个新的蜜源解代替被抛弃的蜜源,继续返回执行步骤(43);
(49)输出最终的蜜源,即测试用例集。
基于相同的发明构思,本发明提供的一种基于数据流约简的智能合约测试用例生成系统,包括:
控制流图构建模块,用于根据Solidity语言的结构及交互特性,对Solidity智能合约源程序进行分析,构建对应的控制流图;
定义使用对提取模块,用于基于构建的控制流图进行数据流分析,提取出函数执行的变量信息,识别程序中的require语句,计算出所有变量的定义使用对并分类为一般定义使用对Nor_dup和require相关定义使用对Req_dup;
数据流约简模块,用于根据构建的控制流图和提取出的所有定义使用对进行数据流约简,计算程序所有执行路径并识别条件分支节点,对每一条路径,如果路径上存在条件分支节点,查找其后第一个非条件判断,且使用了变量的节点,并保存该节点相关的定义使用对;否则,查找路径上离结束节点最近的使用节点,并保存该节点相关的定义使用对;
测试用例生成模块,用于根据约简后的定义使用对进行源程序插桩,根据提取的变量信息进行蜂群初始化,改进搜索系数,如果生成新的蜜源没有覆盖任何新的定义使用对,增大搜索系数取值范围,否则减小搜索系数取值范围,应用人工蜂群算法生成测试用例;
以及测试模块,用于将生成的测试用例作为智能合约的输入,执行合约并检测其是否存在错误。
作为优选,所述数据流约简模块,包括:
函数路径处理单元,用于遍历合约中的每个函数对应的子控制流图,从start节点开始,沿着有向边遍历目标节点,对遍历的当前节点,判断其后继节点数量是否为1;如果后继节点数为1,则继续向下遍历,将目标节点添加到当前路径Templisti中;如果后继节点数大于1,则根据后继节点数量复制当前路径Templisti,每一条路径对应一条分支路径,并分别沿着每一个分支路径继续向下遍历,直到遇到end节点为止,将当前路径存入Pathlist中;
全局路径处理单元,用于遍历全局控制流图,获取子控制流图之间的函数调用边call;根据函数调用边call的开始节点call_start和结束节点call_end,在Pathlist中搜索对应的开始节点call_start所在路径Pathlista和结束节点call_end所在路径Pathlistb;将Pathlista中从call_start后的所有节点移入到TempPath中,将Pathlistb中的所有节点加入到Pathlista中call_start节点处;最后,将TempPath加入到Pathlista中,并将Pathlista存入最终的路径集合GPath中;
条件分支节点识别单元,用于遍历全局控制流图,找出条件分支节点并存储在集合Con_id中;条件分支节点类型包括if、for、while和require;
以及约简单元,用于针对获取的路径集合GPath的每一条路径GPathi,从start节点开始顺序遍历路径中的所有节点;如果当前节点是条件分支节点,则沿着路径往后遍历找到第一个非条件分支节点,如果该非条件分支节点中使用了某个变量的节点,在Nor_dup和Req_dup中查找其相关的定义使用对,存入约简后的定义使用对集合Redups中,继续向下遍历;否则继续向下搜索是否存在下一个非条件分支节点对应的定义使用对,直到搜索到下一个条件分支节点重复上述步骤或end节点为止;当遍历完一条路径GPathi中所有节点都不属于条件分支节点,则后序遍历当前路径的节点,找到距离end节点最近的使用节点,在Nor_dup中查找对应使用节点的定义使用对,存入约简后的定义使用对集合Redups中。
基于相同的发明构思,本发明提供的一种计算机系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的基于数据流约简的智能合约测试用例生成方法的步骤。
基于相同的发明构思,本发明提供的一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述的基于数据流约简的智能合约测试用例生成方法的步骤。
有益效果:本发明提供了一种基于数据流约简的智能合约测试用例生成方法及系统。考虑到程序开发的基本目标是根据特定的输入获得正确的输出,输入和输出之间的关联是通过在程序中定义和使用变量来实现的。因此保证智能合约数据流的正确性是一个基本而重要的要求。一方面,通过考虑到智能合约的特性,设计了一种数据流约简的方法,减少在测试用例生成阶段所需要覆盖的定义使用对数量;另一方面,为了生成更有效的测试用例,改进了搜索系数并优化了测试用例生成过程。与现有技术相比,本发明在Solidity智能合约的测试用例生成领域提出了一个有效方法,通过应用数据流约简方法有效提高方法的执行效率,同时通过对适应度函数的调整和测试用例生成过程的优化能够生成达到更高覆盖率的测试用例集,提高对智能合约测试的充分性。
附图说明
图1为本发明实施例的整体步骤图;
图2为本发明实施例的方法流程图;
图3为本发明实施例的源程序及对应的控制流图。
具体实施方式
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
如图1所示,本发明实施例公开的一种基于数据流约简的智能合约测试用例生成方法,主要包含如下步骤:
步骤1:根据Solidity语言的结构及交互特性,对Solidity智能合约源程序进行分析,构建对应的控制流图;
步骤2:基于步骤1构建的控制流图进行数据流分析,提取出函数执行的变量信息,识别程序中的require语句,计算出所有变量的定义使用对并进行分类;
步骤3:设计数据流约简方法,根据步骤1构建的控制流图和步骤2提取出的所有定义使用对,通过路径分析保留程序中必要的定义使用对,实现覆盖目标的约简;约简方法为:计算程序所有执行路径并识别条件分支节点,对每一条路径,如果路径上存在条件分支节点,查找其后第一个非条件判断,且使用了变量的节点,并保存该节点相关的定义使用对;否则,查找路径上离结束节点最近的使用节点,并保存该节点相关的定义使用对;
步骤4:根据约简后的定义使用对进行源程序插桩,根据步骤2提取的变量信息进行蜂群初始化,改进搜索系数,如果生成新的蜜源没有覆盖任何新的定义使用对,增大搜索系数取值范围,否则减小搜索系数取值范围,应用人工蜂群算法生成测试用例;
步骤5:将步骤4生成的测试用例作为智能合约的输入,执行合约并检测其是否存在错误。
下面结合具体示例对本发明实施例的具体步骤作进一步说明。
步骤1根据Solidity智能合约源程序构建控制流图,具体步骤如下:
步骤11:针对一个待测试的Solidity智能合约源程序中以function为关键字定义的函数,为每个函数构建的单独的子控制流图;分析与识别智能合约源程序中的顺序结构、选择结构和循环结构,常见的关键字有if-else、while、for、do等;此外,Solidity中包含一种以require关键字定义的特殊语句,与if语句具有相似的功能;在构建控制流图的过程中,require语句被处理为选择结构。对于源程序中每一条有效语句作为控制流图的一个结点,对于一个函数的控制流图各有一个开始结点和结束结点;通过一条有向边表示语句之间的执行顺序;
步骤12:分析和处理源程序中各个函数间的调用关系。在具有调用关系的两个函数间,创建两条有向边,分别表示函数的调用和函数的返回,从而构建全局控制流图。
步骤2将根据构建的控制流图进行数据流分析,提取出测试用例生成的相关信息,具体步骤如下:
步骤21:通过遍历步骤1构建的控制流图,分析控制流图的每个节点是否对应与一个函数的声明语句,以获取用于执行函数的变量信息,包括变量名称,变量类型和变量长度,并存储函数的输入参数的变量信息。对于用uint和int声明的变量,该变量类型分别用0和1表示。变量长度使用变量类型标识符指定;例如,用关键字uint8声明的变量可以表示介于0到(28-1)之间的自然数。直接使用关键字uint表示默认情况下对长度为256的变量的声明;
步骤22:require语句通常用于确认条件的有效性,例如输入变量或状态变量是否满足该条件,或者验证外部调用返回的值。当程序执行达到require语句时,只有在require语句中的条件为真时才会执行;由于require语句的特性,对定义使用对的覆盖具有很高的限制,与require语句相关的定义使用对需要单独分类。因此,遍历步骤1构建的控制流图,判断每个节点是否对应一个require语句。如果是,将require语句对应的结点编号进行保存;
步骤23:基于步骤1构建的控制流图,计算每个节点中变量的到达定义,并通过分析每个节点得到变量的使用情况。在分析过程中,一个变量的定义d被记为(x,n),这意味着变量x被定义在节点n处。对于一个变量定义d和一个节点n′,如果有一条从d到n′的路径并且d没有沿着这条路径被杀死(即重复定义),d可以到达n′。通过可达定义分析计算各节点变量的可达定义,可达定义由以下公式计算:
Out[n]=genn∪(IN[n]-killn)#(1)
IN[n]=∪s∈predecessor[n]OUT[s]#(2)
其中IN[n]和OUT[n]分别表示节点n的入口和出口处变量的到达定义。genn是由节点n生成的定义集合,而killn是结点n杀死的定义集合。predecessor[n]是节点n的前序集合。根据以下公式进一步计算出每个节点的到达定义的每个变量的所有定义使用对(x,n,n′),其中x∈def(n),n′∈du(x,n):
du(x,n)={n|(x,n)∈IN[n′],x∈use(n′)}#(3)
步骤24:基于步骤22获取的require语句结点和步骤23计算的定义使用对,将定义使用对进行分类,分为Nor_dup和Req_dup。Nor_dup用于存储智能合约中一般定义使用对;Req_dup用于存储与require语句相关的定义使用对,Req_dup有以下两类:1)对于定义使用对(x,n,n′),如果使用节点n′对应于require语句结点,则定义使用对属于Req_dup;2)对于定义使用对(x,n,n′),如果定义节点n或使用节点n′控制依赖于require语句结点,则定义使用对属于Req_dup。
为了减少测试的额外负担,提高对智能合约进行数据流测试的效率,在不影响对全部定义使用对覆盖的基础上进行数据流约简。步骤3中对提取出的所有定义使用对进行约简,具体步骤为:
步骤31:遍历步骤1构建的子控制流图,从start节点开始,沿着有向边遍历目标节点,对遍历的当前节点,判断其后继节点数量是否为1。如果后继节点数为1,则继续向下遍历,将目标节点添加到当前路径Templisti中;如果后继节点数大于1,则根据后继节点数量复制当前路径Templisti,每一条路径对应一条分支路径,并分别沿着每一个分支路径继续向下遍历,直到遇到end节点为止,将当前路径存入Pathlist中;
步骤32:遍历步骤1构建的全局控制流图,获取子控制流图之间的函数调用边call;根据函数调用边call的开始节点call_start(即函数调用节点)和结束节点call_end(即被调用函数的start节点),在Pathlist中搜索对应的开始节点call_start所在路径Pathlista和结束节点call_end所在路径Pathlistb;将Pathlista中从call_start后的所有节点移入到TempPath中,将Pathlistb中的所有节点加入到Pathlista中call_start节点处;最后,将TempPath加入到Pathlista中,并将Pathlista存入最终的路径集合GPath中;
步骤33:遍历步骤1构建的全局控制流图,将节点类型为if、for、while、require等的节点id存储在条件分支节点集合Con_id中;
步骤34:针对步骤32获取的路径集合GPath的每一条路径GPathi,从start节点开始顺序遍历路径中的所有节点;如果当前节点是条件分支节点,即当前节点属于Con_id,沿着路径往后遍历找到第一个非条件分支节点,如果该非条件分支节点中使用了某个变量的节点,在Nor_dup和Req_dup中查找其相关的定义使用对,存入约简后的定义使用对集合Redups中,继续向下遍历;否则继续向下搜索是否存在下一个非条件分支节点对应的定义使用对,直到搜索到下一个条件分支节点重复上述步骤或end节点为止;
步骤35:当遍历完一条路径GPathi中所有节点都不属于条件分支节点,即不属于Con_id,则后序遍历当前路径的节点,找到距离end节点最近的使用节点,在Nor_dup中查找对应使用节点的定义使用对,存入约简后的定义使用对集合Redups中。
本发明中采用人工蜂群算法,并改进了搜索系数,以进一步优化测试用例生成过程。步骤4为智能合约生成测试用例,如图2所示,具体步骤为:
步骤41:根据约简后得到的定义使用对集合Redups对智能合约源程序进行插桩,用于统计定义使用对所在语句的覆盖情况;
步骤42:根据步骤21提取的变量信息对蜜源进行初始化,大小为N,每个蜜源即为一个测试用例,以及初始化规模为2N的蜂群,包括引领蜂和跟随蜂,两者各取蜂群规模一半,即为N。初始化操作根据以下公式随机产生N个解:
Xij=XLj+rand(XUj-XLj)#(4)
其中i∈{1,2,…,N},j∈{1,2,…S},每个解Xi是一个S维的向量,S是执行合约输入参数的个数,rand是(0,1)内的随机数。XLj、XUj分别表示参数取值的最小值与最大值;
步骤43:将蜜源输入到插桩后的智能合约,记录每个蜜源与定义使用对之间的覆盖关系,并根据合约执行后定义使用对的覆盖情况计算蜜源的适应度值,适应度函数如下:
其中r表示程序中约简后的Redups的数量,n表示当前测试用例tc所覆盖的约简后的Nor_dup的数量,m表示当前测试用例tc所覆盖的约简后的Req_dup的数量,是Req_dup的加权参数;
步骤44:根据贪心策略,从适应度最大的蜜源开始选择测试用例,如果蜜源覆盖了新的定义使用对,保存该蜜源为一个测试用例,记录该测试用例与定义使用对的覆盖关系,否则抛弃该蜜源;
步骤45:判断算法终止条件是否满足,若满足以下终止条件之一:1)达到最大迭代次数MaxIteration;2)所有约简后的定义使用对都被覆盖,则执行步骤49;否则,执行步骤46;
步骤46:每个引领蜂对应一个蜜源,引领蜂根据以下公式搜索新的蜜源:
Yij=Xij+μ(Xij-Xkj)#(6)
其中Yij表示新的蜜源,Xij表示当前蜜源,Xkj表示邻近蜜源,i,k∈{1,2,…,N},k≠i,j∈{1,2,…S},μ是蜂群搜索系数,μ∈[-λ,λ],其中λ的初始值为1。对新的蜜源进行适应度评估,如果新的蜜源适应度优于之前的蜜源,引领蜂则更新蜜源信息;否则仍保留之前的蜜源信息;如果生成蜜源没有覆盖任何新的定义使用对,λ值增大;否则λ值减小;
步骤47:根据轮盘赌规则,跟随蜂根据步骤46引领蜂搜索到的蜜源的适应度,选择相应的引领蜂进行跟随,一个蜜源被选择的概率根据以下公式计算:
其中fiti表示第i个蜜源的适应度。当跟随蜂选择蜜源后,跟随蜂转变为引领蜂,根据公式(6)搜索新的蜜源,并根据蜜源适应度对蜜源进行更新,完成蜜源搜索后,引领蜂转变为跟随蜂;
步骤48:被抛弃蜜源对应的引领蜂转变为侦查蜂,根据公式(4)随机生成一个新的蜜源解代替被抛弃的蜜源,继续返回执行步骤43;
步骤49:输出最终的蜜源,即测试用例集。
步骤5根据生成的测试用例集检测智能合约源程序中是否存在未知的编程错误,具体步骤为:
步骤51:将步骤4生成的测试用例集作为智能合约的输入,在Remix平台上执行合约。在这个过程中,通过观察在函数执行和函数调用过程中产生的数据信息来判断是否发生了错误。
为了进一步描述,利用基于数据流约简的智能合约测试用例生成方法对示例智能合约进行测试用例生成,流程如下:
(1)控制流图构建:首先,对图3示例智能合约的buy和getproduce函数进行子控制流图构建;其次,根据buy函数中第10行对getproduce函数的调用关系,构建全局控制流图,如图3所示。
(2)数据流分析:通过对图3控制流图的遍历,获取函数的输入参数信息{(price,uint,8),(num,uint,8)},require语句节点{2}以及合约中一般定义使用对Nor_dup和require相关定义使用对Req_dup,如表1所示。
表1示例智能合约的定义使用对
(3)数据流约简:计算示例智能合约中的可执行路径和分支条件节点,路径集为{‘6-7-8-9-12’,‘6-7-8-9-10-1-2-5’,‘6-7-8-9-10-1-2-3-4-5-11-12’},条件分支节点为节点2和节点9;根据计算出的路径集合分支条件节点分析并保留合约中必要的定义使用对,约简后的定义使用对集合为{(a,1,3),(price,6,10)},即最终待覆盖的定义使用对集合。
(4)测试用例生成:基于人工蜂群算法生成的一个测试用例为{price=161,num=25},实现对约简后的定义使用对集合为{(a,1,3),(price,6,10)}的覆盖,所有待覆盖需求都被满足,则最终测试用例集为{{price=161,num=25}},对示例智能合约的所有定义使用对达到100%覆盖率。
(5)错误检测:在示例智能合约中第10行存在整数溢出错误。当输入price=161,num=52时,sumprice的输出为185。结果分析:uint8取值范围为0到255,当遇到255+1的情况,数值上溢为0;因此,161*25=256*15(上溢15次)+185=185(而不是4025),sumprice的输出为185,即说明示例智能合约发生了整数溢出错误。
为了进一步说明本发明方法的有效性,将本发明所述方法与传统遗传算法对智能合约开源平台Etherscan上真实部署的智能合约ApClyde_token进行测试用例生成并对比;经人工审查,该合约存在2处时间戳依赖错误;为了对比本发明所述方法与传统遗传算法及智能合约主流检测工具在检测错误方面的有效性,在不影响原合约正常功能的情况下人工引入4处整数溢出错误。
(1)根据本发明所述步骤对智能合约ApClyde_token进行定义使用对约简,得到如表2所示的约简前后的定义使用对数量,可以看出约简后的定义使用对数量明显减少,即在测试用例生成阶段待覆盖的测试目标数量明显减少;
表2智能合约ApClyde_token约简前后的定义使用对数量
(2)应用本发明方法与传统遗传算法进行测试用例生成,主要从覆盖率、迭代次数与执行时间、错误检测数量三个方面进行对比。
表3为本发明方法和传统遗传算法GA在应用约简前后的覆盖率对比。覆盖率计算公式如下:
一方面,从单个方法的覆盖率对比可以发现在进行定义使用对约简前后覆盖率波动很小,主要考虑是方法本身的随机性影响;另一方面,从两个方法的覆盖率对比可以发现本发明方法生成的测试用例集的覆盖率明显高于传统遗传算法。
表3约简前后的覆盖率对比
表4为本发明方法和传统遗传算法GA在应用约简前后的迭代次数与执行时间对比。一方面,从单个方法的迭代次数与执行时间对比可以发现在进行定义使用对约简前后迭代次数和执行时间都明显减少,说明约简方法可以提高方法的性能;另一方面,从两个方法的迭代次数和执行时间对比可以发现本发明方法性能优于传统遗传算法。
表4约简前后的迭代次数与执行时间对比
表5为本发明方法和传统遗传算法GA、目前智能合约主流检测工具在错误检测数量的对比。考虑到约简前后方法生成的测试用例覆盖率变化很小,将本发明方法和GA在应用约简后生成的测试用例集在Remix平台上输入智能合约并执行,观察执行过程中的状态、异常及输出信息,以进一步判断合约是否存在错误;为了进一步对比本发明生成测试用例的有效性,选取了Mythril、Oyente、Slither和SmartCheck四种目前智能合约主流静态检测工具。根据表5不同方法及工具错误检测数量的对比可以说明本发明方法对于检测错误的有效性。
表5不同方法及工具错误检测数量对比
基于相同的发明构思,本发明实施例提供的一种基于数据流约简的智能合约测试用例生成系统,包括:控制流图构建模块,用于根据Solidity语言的结构及交互特性,对Solidity智能合约源程序进行分析,构建对应的控制流图;定义使用对提取模块,用于基于构建的控制流图进行数据流分析,提取出函数执行的变量信息,识别程序中的require语句,计算出所有变量的定义使用对并分类为一般定义使用对Nor_dup和require相关定义使用对Req_dup;数据流约简模块,用于根据构建的控制流图和提取出的所有定义使用对进行数据流约简,计算程序所有执行路径并识别条件分支节点,对每一条路径,如果路径上存在条件分支节点,查找其后第一个非条件判断,且使用了变量的节点,并保存该节点相关的定义使用对;否则,查找路径上离结束节点最近的使用节点,并保存该节点相关的定义使用对;测试用例生成模块,用于根据约简后的定义使用对进行源程序插桩,根据提取的变量信息进行蜂群初始化,改进搜索系数,如果生成新的蜜源没有覆盖任何新的定义使用对,增大搜索系数取值范围,否则减小搜索系数取值范围,应用人工蜂群算法生成测试用例;以及测试模块,用于将生成的测试用例作为智能合约的输入,执行合约并检测其是否存在错误。
上述描述的各模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。所述模块/单元的划分仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块/单元可以结合或者可以集成到另一个系统。
基于相同的发明构思,本发明实施例提供的一种计算机系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的基于数据流约简的智能合约测试用例生成方法的步骤。
基于相同的发明构思,本发明实施例提供的一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述的基于数据流约简的智能合约测试用例生成方法的步骤。
本领域技术人员可以理解的是,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机系统(可以是个人计算机,服务器,或者网络设备等)执行本发明实施例所述方法的全部或部分步骤。存储介质包括:U盘、移动硬盘、只读存储器ROM、随机存取存储器RAM、磁碟或者光盘等各种可以存储计算机程序的介质。
Claims (10)
1.一种基于数据流约简的智能合约测试用例生成方法,其特征在于,包括如下步骤:
(1)根据Solidity语言的结构及交互特性,对Solidity智能合约源程序进行分析,构建对应的控制流图;
(2)基于步骤(1)构建的控制流图进行数据流分析,提取出函数执行的变量信息,识别程序中的require语句,计算出所有变量的定义使用对并分类为一般定义使用对Nor_dup和require相关定义使用对Req_dup;
(3)根据步骤(1)构建的控制流图和步骤(2)提取出的所有定义使用对进行数据流约简,计算程序所有执行路径并识别条件分支节点,对每一条路径,如果路径上存在条件分支节点,查找其后第一个非条件判断,且使用了变量的节点,并保存该节点相关的定义使用对;否则,查找路径上离结束节点最近的使用节点,并保存该节点相关的定义使用对;
(4)根据约简后的定义使用对进行源程序插桩,根据步骤(2)提取的变量信息进行蜂群初始化,改进搜索系数,如果生成新的蜜源没有覆盖任何新的定义使用对,增大搜索系数取值范围,否则减小搜索系数取值范围,应用人工蜂群算法生成测试用例;
(5)将步骤(4)生成的测试用例作为智能合约的输入,执行合约并检测其是否存在错误。
2.根据权利要求1所述的基于数据流约简的智能合约测试用例生成方法,其特征在于,所述步骤(1)包括:
(11)对于合约中的每个函数构建一个单独的控制流图作为子控制流图;
(12)通过创建表示两个函数之间的调用和返回关系的两条边来描述函数调用的关系,构建全局控制流图。
3.根据权利要求1所述的基于数据流约简的智能合约测试用例生成方法,其特征在于,所述步骤(2)包括如下步骤:
(21)遍历步骤(1)构建的控制流图,分析每个节点的信息并判断是否对应函数声明语句,以获取用于执行智能合约的变量信息,包括变量名称、变量类型和变量长度,提取并存储函数的输入参数的变量信息;
(22)遍历步骤(1)构建的控制流图,判断每个节点是否对应一个require语句,将require语句对应的结点编号进行保存;
(23)基于步骤(1)构建的控制流图,通过可达定义分析计算各节点变量的可达定义,分析各节点变量的使用,从而计算出每个变量的定义使用对All_dup;
(24)基于步骤(22)获取的require语句结点和步骤(23)计算的定义使用对All_dup,将定义使用对进行分类,分为一般定义使用对Nor_dup和require相关定义使用对Req_dup。
4.根据权利要求1所述的基于数据流约简的智能合约测试用例生成方法,其特征在于,所述步骤(3)包括如下步骤:
(31)遍历步骤(1)构建的子控制流图,从start节点开始,沿着有向边遍历目标节点,对遍历的当前节点,判断其后继节点数量是否为1;如果后继节点数为1,则继续向下遍历,将目标节点添加到当前路径Templisti中;如果后继节点数大于1,则根据后继节点数量复制当前路径Templisti,每一条路径对应一条分支路径,并分别沿着每一个分支路径继续向下遍历,直到遇到end节点为止,将当前路径存入Pathlist中;
(32)遍历步骤(1)构建的全局控制流图,获取子控制流图之间的函数调用边call;根据函数调用边call的开始节点call_start和结束节点call_end,在Pathlist中搜索对应的开始节点call_start所在路径Pathlista和结束节点call_end所在路径Pathlistb;将Pathlista中从call_start后的所有节点移入到TempPath中,将Pathlistb中的所有节点加入到Pathlista中call_start节点处;最后,将TempPath加入到Pathlista中,并将Pathlista存入最终的路径集合GPath中;
(33)遍历步骤(1)构建的全局控制流图,找出条件分支节点并存储在集合Con_id中;条件分支节点类型包括if、for、while和require;
(34)针对步骤(32)获取的路径集合GPath的每一条路径GPathi,从start节点开始顺序遍历路径中的所有节点;如果当前节点是条件分支节点,则沿着路径往后遍历找到第一个非条件分支节点,如果该非条件分支节点中使用了某个变量的节点,在Nor_dup和Req_dup中查找其相关的定义使用对,存入约简后的定义使用对集合Redups中,继续向下遍历;否则继续向下搜索是否存在下一个非条件分支节点对应的定义使用对,直到搜索到下一个条件分支节点重复上述步骤或end节点为止;
(35)当遍历完一条路径GPathi中所有节点都不属于条件分支节点,则后序遍历当前路径的节点,找到距离end节点最近的使用节点,在Nor_dup中查找对应使用节点的定义使用对,存入约简后的定义使用对集合Redups中。
5.根据权利要求1所述的基于数据流约简的智能合约测试用例生成方法,其特征在于,所述步骤(4)包括如下步骤:
(41)根据最终约简的定义使用对集合Redups对智能合约源程序进行插桩;
(42)根据提取的变量信息对蜜源进行初始化,大小为N,每个蜜源即为一个测试用例,以及初始化规模为2N的蜂群,包括引领蜂和跟随蜂,两者各取蜂群规模一半,即为N;初始化操作根据以下公式随机产生N个蜜源:
Xij=XLj+rand(XUj-XLj)
其中i∈{1,2,...,N},j∈{1,2,...S},每个解Xi是一个S维的向量,S是执行合约输入参数的个数,rand是(0,1)内的随机数,XLj、XUj分别表示参数取值的最小值与最大值;
(43)根据适应度函数计算蜜源的适应度值:
其中r表示程序中约简后的定义使用对的数量,n表示当前测试用例tc所覆盖的约简后的Nor_dup的数量,m表示当前测试用例tc所覆盖的约简后的Req_dup的数量,是Req_dup的加权参数;
(44)根据贪心策略,从适应度最大的蜜源开始选择测试用例,如果蜜源覆盖了新的定义使用对,保存该蜜源为一个测试用例,记录该测试用例与定义使用对的覆盖关系,否则抛弃该蜜源;
(45)判断算法终止条件是否满足,若满足以下终止条件之一:1)达到最大迭代次数MaxIteration;2)所有约简后的定义使用对都被覆盖,则执行步骤(49);否则,执行步骤(46);
(46)每个引领蜂对应一个蜜源,所有引领蜂根据以下公式搜索新的蜜源:
Yij=Xij+μ(Xij-Xkj)
其中Yij表示新的蜜源,Xij表示当前蜜源,Xkj表示邻近蜜源,i,k∈{1,2,...,N},k≠i,j∈{1,2,...S},μ是蜂群搜索系数,μ∈[-λ,λ],其中λ的初始值为1;对新的蜜源进行适应度评估,如果新的蜜源适应度优于之前的蜜源,引领蜂则更新蜜源信息;否则仍保留之前的蜜源信息;如果生成蜜源没有覆盖任何新的定义使用对,λ值增大;否则λ值减小;
(47)跟随蜂根据步骤(46)引领蜂搜索到的蜜源的适应度,选择相应的引领蜂进行跟随;当蜜源被选择后,跟随蜂转变为引领蜂,根据步骤(46)中公式搜索新的蜜源,并根据蜜源适应度对蜜源进行更新,完成蜜源搜索后,引领蜂转变为跟随蜂;
(48)被抛弃蜜源对应的引领蜂转变为侦查蜂,根据步骤(42)中公式随机生成一个新的蜜源解代替被抛弃的蜜源,继续返回执行步骤(43);
(49)输出最终的蜜源,即测试用例集。
6.一种基于数据流约简的智能合约测试用例生成系统,其特征在于,包括:
控制流图构建模块,用于根据Solidity语言的结构及交互特性,对Solidity智能合约源程序进行分析,构建对应的控制流图;
定义使用对提取模块,用于基于构建的控制流图进行数据流分析,提取出函数执行的变量信息,识别程序中的require语句,计算出所有变量的定义使用对并分类为一般定义使用对Nor_dup和require相关定义使用对Req_dup;
数据流约简模块,用于根据构建的控制流图和提取出的所有定义使用对进行数据流约简,计算程序所有执行路径并识别条件分支节点,对每一条路径,如果路径上存在条件分支节点,查找其后第一个非条件判断,且使用了变量的节点,并保存该节点相关的定义使用对;否则,查找路径上离结束节点最近的使用节点,并保存该节点相关的定义使用对;
测试用例生成模块,用于根据约简后的定义使用对进行源程序插桩,根据提取的变量信息进行蜂群初始化,改进搜索系数,如果生成新的蜜源没有覆盖任何新的定义使用对,增大搜索系数取值范围,否则减小搜索系数取值范围,应用人工蜂群算法生成测试用例;
以及测试模块,用于将生成的测试用例作为智能合约的输入,执行合约并检测其是否存在错误。
7.根据权利要求6所述的基于数据流约简的智能合约测试用例生成系统,其特征在于,所述数据流约简模块,包括:
函数路径处理单元,用于遍历合约中的每个函数对应的子控制流图,从start节点开始,沿着有向边遍历目标节点,对遍历的当前节点,判断其后继节点数量是否为1;如果后继节点数为1,则继续向下遍历,将目标节点添加到当前路径Templisti中;如果后继节点数大于1,则根据后继节点数量复制当前路径Templisti,每一条路径对应一条分支路径,并分别沿着每一个分支路径继续向下遍历,直到遇到end节点为止,将当前路径存入Pathlist中;
全局路径处理单元,用于遍历全局控制流图,获取子控制流图之间的函数调用边call;根据函数调用边call的开始节点call_start和结束节点call_end,在Pathlist中搜索对应的开始节点call_start所在路径Pathlista和结束节点call_end所在路径Pathlistb;将Pathlista中从call_start后的所有节点移入到TempPath中,将Pathlistb中的所有节点加入到Pathlista中call_start节点处;最后,将TempPath加入到Pathlista中,并将Pathlista存入最终的路径集合GPath中;
条件分支节点识别单元,用于遍历全局控制流图,找出条件分支节点并存储在集合Con_id中;条件分支节点类型包括if、for、while和require;
以及约简单元,用于针对获取的路径集合GPath的每一条路径GPathi,从start节点开始顺序遍历路径中的所有节点;如果当前节点是条件分支节点,则沿着路径往后遍历找到第一个非条件分支节点,如果该非条件分支节点中使用了某个变量的节点,在Nor_dup和Req_dup中查找其相关的定义使用对,存入约简后的定义使用对集合Redups中,继续向下遍历;否则继续向下搜索是否存在下一个非条件分支节点对应的定义使用对,直到搜索到下一个条件分支节点重复上述步骤或end节点为止;当遍历完一条路径GPathi中所有节点都不属于条件分支节点,则后序遍历当前路径的节点,找到距离end节点最近的使用节点,在Nor_dup中查找对应使用节点的定义使用对,存入约简后的定义使用对集合Redups中。
8.根据权利要求6所述的基于数据流约简的智能合约测试用例生成系统,其特征在于,所述测试用例生成模块中,人工蜂群算法根据如下适应度函数计算蜜源的适应度值:
其中r表示程序中约简后的定义使用对的数量,n表示当前测试用例tc所覆盖的约简后的Nor_dup的数量,m表示当前测试用例tc所覆盖的约简后的Req_dup的数量,是Req_dup的加权参数;
算法中所有引领蜂根据如下公式搜索新的蜜源:
Yij=Xij+μ(Xij-Xkj)
其中Yij表示新的蜜源,Xij表示当前蜜源,Xkj表示邻近蜜源,i,k∈{1,2,...,N},k≠i,j∈{1,2,...S},μ是蜂群搜索系数,μ∈[-λ,λ],其中λ的初始值为1;对新的蜜源进行适应度评估,如果新的蜜源适应度优于之前的蜜源,引领蜂则更新蜜源信息;否则仍保留之前的蜜源信息;如果生成蜜源没有覆盖任何新的定义使用对,λ值增大;否则λ值减小。
9.一种计算机系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述计算机程序被加载至处理器时实现根据权利要求1-5任一项所述的基于数据流约简的智能合约测试用例生成方法的步骤。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现根据权利要求1-5任一项所述的基于数据流约简的智能合约测试用例生成方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210634059.0A CN115037648B (zh) | 2022-06-07 | 2022-06-07 | 基于数据流约简的智能合约测试用例生成方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210634059.0A CN115037648B (zh) | 2022-06-07 | 2022-06-07 | 基于数据流约简的智能合约测试用例生成方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115037648A CN115037648A (zh) | 2022-09-09 |
CN115037648B true CN115037648B (zh) | 2023-11-10 |
Family
ID=83122773
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210634059.0A Active CN115037648B (zh) | 2022-06-07 | 2022-06-07 | 基于数据流约简的智能合约测试用例生成方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115037648B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015054938A1 (zh) * | 2013-10-14 | 2015-04-23 | 西安交通大学 | 基于程序行为切片的测试案例约减方法 |
CN110046089A (zh) * | 2019-03-01 | 2019-07-23 | 华南师范大学 | 一种基于路径覆盖充分性准则的智能合约测试方法 |
WO2019245167A1 (ko) * | 2018-06-14 | 2019-12-26 | 삼성전자 주식회사 | 동적 규칙 기반의 블록 체인을 이용하는 군집 제어 장치 및 방법 |
CN111797010A (zh) * | 2020-06-23 | 2020-10-20 | 河海大学 | 一种应用改进遗传算法的智能合约测试用例生成方法 |
CN112433856A (zh) * | 2020-12-04 | 2021-03-02 | 中国科学技术大学 | 无人机蜂群网去中心化自治决策方法 |
US11036614B1 (en) * | 2020-08-12 | 2021-06-15 | Peking University | Data control-oriented smart contract static analysis method and system |
-
2022
- 2022-06-07 CN CN202210634059.0A patent/CN115037648B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015054938A1 (zh) * | 2013-10-14 | 2015-04-23 | 西安交通大学 | 基于程序行为切片的测试案例约减方法 |
WO2019245167A1 (ko) * | 2018-06-14 | 2019-12-26 | 삼성전자 주식회사 | 동적 규칙 기반의 블록 체인을 이용하는 군집 제어 장치 및 방법 |
CN110046089A (zh) * | 2019-03-01 | 2019-07-23 | 华南师范大学 | 一种基于路径覆盖充分性准则的智能合约测试方法 |
CN111797010A (zh) * | 2020-06-23 | 2020-10-20 | 河海大学 | 一种应用改进遗传算法的智能合约测试用例生成方法 |
US11036614B1 (en) * | 2020-08-12 | 2021-06-15 | Peking University | Data control-oriented smart contract static analysis method and system |
CN112433856A (zh) * | 2020-12-04 | 2021-03-02 | 中国科学技术大学 | 无人机蜂群网去中心化自治决策方法 |
Non-Patent Citations (1)
Title |
---|
基于支配关系的数据流测试用例生成方法;吉顺慧等;计算机科学(第09期);46-52 * |
Also Published As
Publication number | Publication date |
---|---|
CN115037648A (zh) | 2022-09-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101983206B1 (ko) | 데이터 레코드 선택 | |
Maggi et al. | Parallel algorithms for the automated discovery of declarative process models | |
US6282527B1 (en) | Adaptive problem solving method and apparatus utilizing evolutionary computation techniques | |
CN111797010B (zh) | 一种应用改进遗传算法的智能合约测试用例生成方法 | |
CN105069306B (zh) | 基于工作流网模型的事件日志审计方法 | |
CN113536308B (zh) | 软件基因视角下多粒度信息融合的二进制代码溯源方法 | |
Naeem et al. | Scalable mutation testing using predictive analysis of deep learning model | |
CN113158194A (zh) | 一种基于多关系图网络的漏洞模型的构建方法及检测方法 | |
Taymouri et al. | Computing alignments of well-formed process models using local search | |
White et al. | Reassert: Deep learning for assert generation | |
Ji et al. | Test-case generation for data flow testing of smart contracts based on improved genetic algorithm | |
CN112052166B (zh) | 一种基于支配关系的测试用例生成方法与装置 | |
CN117725592A (zh) | 一种基于有向图注意力网络的智能合约漏洞检测方法 | |
CN116663018A (zh) | 一种基于代码可执行路径的漏洞检测方法及装置 | |
CN115037648B (zh) | 基于数据流约简的智能合约测试用例生成方法及系统 | |
CN116702157A (zh) | 一种基于神经网络的智能合约漏洞检测方法 | |
Khamis et al. | Automatic software test data generation for spanning sets coverage using genetic algorithms | |
Jansen | Static analysis of pointer programs-linking graph grammars and separation logic | |
Aldekhail et al. | Intelligent Identification and Resolution of Software Requirement Conflicts: Assessment and Evaluation. | |
CN114792007A (zh) | 代码检测方法、装置、设备、存储介质和计算机程序产品 | |
Oh et al. | A Model Independent S/W Framework for Search‐Based Software Testing | |
Yu et al. | Possibility of cost reduction by mutant clustering according to the clustering scope | |
Milov et al. | Development of a scenario modeling of conflict tools in a security system based on formal grammars | |
US20240135210A1 (en) | Replacing lambda expressions in a rete network with corresponding code classes | |
KR102557800B1 (ko) | 차분 프라이버시 기반 의사결정 트리 생성 방법 및 장치 |
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 |