CN115017048A - 一种测试种子的确定方法及装置 - Google Patents

一种测试种子的确定方法及装置 Download PDF

Info

Publication number
CN115017048A
CN115017048A CN202210666920.1A CN202210666920A CN115017048A CN 115017048 A CN115017048 A CN 115017048A CN 202210666920 A CN202210666920 A CN 202210666920A CN 115017048 A CN115017048 A CN 115017048A
Authority
CN
China
Prior art keywords
test
seed
round
function
candidate
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.)
Pending
Application number
CN202210666920.1A
Other languages
English (en)
Inventor
郑子彬
李辉忠
杨硕
张开翔
范瑞彬
白兴强
李成博
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sun Yat Sen University
WeBank Co Ltd
Original Assignee
Sun Yat Sen University
WeBank Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Sun Yat Sen University, WeBank Co Ltd filed Critical Sun Yat Sen University
Priority to CN202210666920.1A priority Critical patent/CN115017048A/zh
Publication of CN115017048A publication Critical patent/CN115017048A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3676Test management for coverage analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

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)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本发明涉及金融科技(Fintech)领域,公开一种测试种子的确定方法及装置,针对目标智能合约的第i轮测试种子,基于第i轮测试种子进行第i+1轮模糊测试;针对任一个测试种子,根据测试种子在第i+1轮模糊测试中的函数调用记录,若确定测试种子在第i+1轮模糊测试中覆盖函数调用流图中的新节点,则保留测试种子作为候选测试种子;针对任一个候选测试种子,根据候选测试种子对应的新节点在函数调用流图中的调用次数和被调用次数,确定候选测试种子的种子适应度;根据各候选测试种子分别对应的种子适应度,确定出用于进行第i+2轮模糊测试的第i+1轮测试种子。基于该方式可筛选出高质量的测试种子,从而提升模糊测试的效率。

Description

一种测试种子的确定方法及装置
技术领域
本申请实施例涉及金融科技(Fintech)领域,尤其涉及一种测试种子的确定方法及装置。
背景技术
随着计算机技术的发展,越来越多的技术(例如:大数据、云计算或区块链)应用在金融领域,传统金融业正在逐步向金融科技转变。例如,对于金融领域中存在着的海量数据,该些海量数据可通过区块链进行存储。在用区块链对数据进行存储时,将用到智能合约。智能合约本质上是存储在以太坊区块链一个特定地址上的一组代码和数据,因此为了保障数据存储的质量,智能合约在正式投入使用之前,需对其进行测试。目前对智能合约进行测试的方法有灰盒模糊测试,灰盒模糊测试采用了轻量级的程序分析技术,通过收集部分关键的代码信息来指导测试过程。其中,灰盒模糊测试首先针对被测程序生成随机的测试案例,并运行测试案例来判断其是否覆盖了一条新的未被覆盖的程序路径,然后通过某种筛选策略筛选出高质量的测试案例,对其进行交叉和变异的操作,从而生成新的测试案例,并进行下一轮的测试迭代。目前在筛选测试案例的过程中,测试种子选择的策略较为简单,主要是基于控制流图定义的距离选择方法保留所有覆盖到新分支的种子。显然该方案并没有考虑到被选择种子的不同适应度对于模糊测试产生的输入的影响,从而影响模糊测试种子池的质量,降低了模糊测试效率。
发明内容
本申请提供一种测试种子的确定方法及装置,用以筛选出高质量的测试种子,从而提升模糊测试的效率。
第一方面,本申请实施例提供一种测试种子的确定方法,该方法包括:针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试,并获取所述第i轮测试种子中的各测试种子在所述第i+1轮模糊测试中的函数调用记录;针对所述第i轮测试种子中的任一个测试种子,根据所述测试种子在所述第i+1轮模糊测试中的函数调用记录,若确定所述测试种子在所述第i+1轮模糊测试中覆盖函数调用流图中的新节点,则保留所述测试种子作为候选测试种子;其中,所述函数调用流图是以所述目标智能合约中的各函数作为节点,且对存在调用关系的两个函数进行节点连线作为调用边构建的,任一调用边标记有函数调用次数;针对所述第i轮测试种子中的任一个候选测试种子,根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度;根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,并返回执行针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试的步骤,直至满足所述模糊测试的预设时间。
上述方案中,在每一轮模糊测试过程中选择用于进行下一轮测试的测试种子时,通过分析当前模糊测试过程中每一个用于模糊测试的种子是否覆盖到函数调用流图中的新节点,如果覆盖到,则保留该测试种子,针对所保留的测试种子,通过分析该测试种子对应的新节点在函数调用流图中的调用与被调用的数据,对于该种基于函数调用与被调用的数据确定测试种子的种子适应度的方法,通过为更有能力覆盖到更多分支的测试种子赋予更高的权重,通过适应度维度差异化种子质量,优化测试的输入,使得模糊测试的进程加快,测试效率变高。
在一种可能实现的方法中,通过下述方式获取所述目标智能合约的第1轮测试种子,包括:编译所述目标智能合约,获取所述目标智能合约的应用程序二进制接口ABI文件;根据所述ABI文件中的不同参数的数据类型,得到所述目标智能合约的第1轮测试种子。
上述方案中,具体描述了如何得到对智能合约进行模糊测试的第1轮的测试种子,当在得到对智能合约进行模糊测试的第1轮测试种子时,可基于第1轮测试种子对智能合约进行第1轮的模糊测试,从而根据第1轮的模糊测试结果得到对智能合约进行第2轮模糊测试的第2轮的测试种子。
在一种可能实现的方法中,所述根据所述ABI文件中的不同参数的数据类型,得到所述目标智能合约的第1轮测试种子,包括:针对所述ABI文件中的任一个参数,若所述参数的数据类型为整数或者小数类型,则通过随机函数在所述数据类型的最大值与最小值中确定一个值作为所述参数的第1轮测试种子;若所述参数为布尔类型,则随机从0和1中确定一个值作为所述参数的第1轮测试种子;若所述参数为字符串类型,则从字节码中的常量字符串中随机取值作为所述参数的第1轮测试种子;若所述参数为数组类型,则根据数组中元素的原始数据类型,生成所述参数的第1轮测试种子;若所述参数为结构体类型,则根据结构体中的原始数据类型,生成所述参数的第1轮测试种子。
上述方案中,具体描述了针对不同数据类型的参数,该如何确定对应的测试种子。通过该方式,可以快速地生成对智能合约进行第1轮模糊测试的各测试种子。
在一种可能实现的方法中,所述函数调用流图通过下述方式构建,包括:编译所述目标智能合约,获取所述目标智能合约的WASM字节码文件;根据所述WASM字节码文件,确定所述目标智能合约的函数集合以及所述函数集合中任一个函数的指令集;根据所述函数集合以及各指令集,确定所述函数调用流图。
上述方案中,具体描述了如何生成智能合约对应的函数调用流图,在完成每一轮的模糊测试后,可依据所生成的函数调用流图计算进行当前轮模糊测试的各测试种子的种子适应度,由于函数调用流图中涉及了各函数的调用与被调用的数据,因此基于该种方式计算的测试种子的种子适应度的精确度更高,从而在使用精确度高的测试种子进行模糊测试,将可以提升模糊测试的效率。
在一种可能实现的方法中,所述根据所述WASM字节码文件,确定所述目标智能合约的函数集合以及所述函数集合中任一个函数的指令集,包括:转换所述WASM字节码文件为wat文本,并设置初始态的函数集合;所述初始态的函数集合为空;遍历所述wat文本中的每一条指令;针对当前遍历的指令,若确定所述指令指示函数,则添加所述指令指示的函数至所述初始态的函数集合的尾部;若确定所述指令并非指示函数,则添加所述指令至当前指示函数的指令的指令集的末尾;所述根据所述函数集合以及各指令集,确定所述函数调用流图,包括:针对所述函数集合中的任一个函数,遍历所述函数的指令集中的各指令;若确定当前遍历的指令为调用指令,则记录所述调用指令后的调用函数,并添加由所述函数指向所述调用函数的有向连线;若确定已经存在所述有向连线,则更新所述有向连线指示的调用边的调用次数;若确定当前遍历的指令为返回指令,则跳转至所述函数集合中的下一函数,并返回执行遍历所述函数的指令集中的各指令的步骤,从而得到所述函数调用流图。
上述方案中,具体描述了如何生成智能合约对应的函数调用流图,通过将智能合约中各函数的调用与被调用的关系通过图形样式进行表现出来,同时还标识出调用次数,调用次数越大,函数对应的测试种子的适应度也相应变大,因此通过为更有能力覆盖到更多分支的测试种子赋予更高的权重,通过适应度维度差异化种子质量,优化测试的输入,使得模糊测试的进程加快,测试效率变高。
在一种可能实现的方法中,所述根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度,包括:获取所述函数调用流图的邻接矩阵;根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数、被调用次数以及所述邻接矩阵,确定所述候选测试种子的种子适应度。
上述方案中,具体描述了如何确定候选测试种子的种子适应度,在确定候选测试种子的种子适应度的过程中,由于应用了函数调用流图的邻接矩阵,以及用到了候选测试种子对应的新节点在函数调用流图中的调用次数、被调用次数,将可以使得对候选测试种子的种子适应度的计算的准确度极大提升,从而通过为更有能力覆盖到更多分支的测试种子赋予更高的权重,通过适应度维度差异化种子质量,优化测试的输入,使得模糊测试的进程加快,测试效率变高。
在一种可能实现的方法中,所述根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数、被调用次数以及所述邻接矩阵,确定所述候选测试种子的种子适应度,包括:确定初始种子适应度k;其中k=αS+βT,α和β分别为S和T的预设权重,S表示基于所述函数调用流图确定的到达所述新节点的各入调用边的调用次数的和,T表示基于所述函数调用流图确定的从所述新节点出发的各出调用边的调用次数的和;根据所述初始种子适应度k和所述邻接矩阵,确定所述候选测试种子的种子适应度。
上述方案中,具体描述了如何确定候选测试种子的种子适应度,由于在计算候选测试种子的种子适应度的过程中,由于用到了候选测试种子对应的函数在函数调用流图中的调用次数和被调用次数,以及为更有能力覆盖到更多分支的测试种子赋予更高的权重,通过适应度维度差异化种子质量,优化测试的输入,使得模糊测试的进程加快,测试效率变高。
在一种可能实现的方法中,所述根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,包括:从各候选测试种子中确定出各第一候选测试种子和各第二候选测试种子;其中,任一第一候选测试种子的种子适应度大于任一第二候选测试种子的种子适应度;对各第一候选测试种子按照第一设定方式进行更新从而生成各第一更新测试种子,以及对各第二候选测试种子按照第二设定方式进行更新从而生成各第二更新测试种子;将各第一更新测试种子和各第二更新测试种子作为用于进行第i+2轮模糊测试的第i+1轮测试种子。
上述方案中,针对每一轮模糊测试的结果,通过计算各轮模糊测试的候选测试种子的种子适应度,并对当中不同种子适应度的候选测试种子采用不同的更新方式进行测试种子的更新,使用更新后的候选测试种子(即更新测试种子)用于作为下一轮模糊测试的测试种子。该种基于更新测试种子进行模糊测试的方案有助于提升模糊测试的效率以及准确性。
第二方面,本申请实施例提供一种测试种子的确定装置,该装置包括:函数调用记录获取单元,用于针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试,并获取所述第i轮测试种子中的各测试种子在所述第i+1轮模糊测试中的函数调用记录;候选测试种子确定单元,用于针对所述第i轮测试种子中的任一个测试种子,根据所述测试种子在所述第i+1轮模糊测试中的函数调用记录,若确定所述测试种子在所述第i+1轮模糊测试中覆盖函数调用流图中的新节点,则保留所述测试种子作为候选测试种子;其中,所述函数调用流图是以所述目标智能合约中的各函数作为节点,且对存在调用关系的两个函数进行节点连线作为调用边构建的,任一调用边标记有函数调用次数;种子适应度确定单元,用于针对所述第i轮测试种子中的任一个候选测试种子,根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度;测试种子确定单元,用于根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,并返回执行针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试的步骤,直至满足所述模糊测试的预设时间。
第三方面,本申请实施例提供了一种计算设备,包括:
存储器,用于存储程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行如第一方面任一实现方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如第一方面任一实现方法。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的一种测试种子的确定方法的示意图;
图2为本申请实施例提供的一种函数调用流图的示意图;
图3为本申请实施例提供的一种测试种子的确定装置的示意图;
图4为本申请实施例提供的一种计算设备的示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
针对当前应用于模糊测试的测试种子的选择策略过于简单,导致所选择的测试种子影响到模糊测试种子池的质量,降低了模糊测试的效率。
针对上述技术问题,本申请提供一种测试种子的确定方法,该方法由测试种子的确定装置执行,基于本申请提出的测试种子的确定方法而确定的测试种子,可以提升模糊测试种子池的质量,进而提升模糊测试的效率。如图1所示,为本申请实施例提供的一种测试种子的确定方法的示意图,该方法包括以下步骤:
步骤101,针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试,并获取所述第i轮测试种子中的各测试种子在所述第i+1轮模糊测试中的函数调用记录。
在本步骤中,可选的,目标智能合约为任一Liquid智能合约。其中,Liquid智能合约是微众银行区块链团队结自主开发的基于Rust语言的全新智能合约语言,用于FISCO-BCOS链上的智能合约开发。
WASM全称为WebAssembly,是一种全新的可移植、体积小、加载快且兼容Web的字节码格式,在智能合约上使用WASM可减少区块链资源占用,并使得智能合约运行更加快速和稳定,网络传输信息更加高效。
可选的,本申请的Liquid智能合约采用WASM(WebAssembly)字节码格式。目前EOSIO、FISCO-BCOS都支持将链上的智能合约转化为WASM字节码格式。FISCO-BCOS自主提出的Liquid智能合约语言能够被编译转化为WASM字节码和对应的ABI文件部署上链。
在本步骤中,对于目标智能合约的第i轮测试种子中的任一个测试种子,通过用该测试种子对目标智能合约进行第i+1轮的模糊测试,在模糊测试的过程中,可选的,将通过WASM虚拟机插桩技术获取该测试种子在第i+1轮模糊测试过程中的函数调用记录。
步骤102,针对所述第i轮测试种子中的任一个测试种子,根据所述测试种子在所述第i+1轮模糊测试中的函数调用记录,若确定所述测试种子在所述第i+1轮模糊测试中覆盖函数调用流图中的新节点,则保留所述测试种子作为候选测试种子。
其中,所述函数调用流图是以所述目标智能合约中的各函数作为节点,且对存在调用关系的两个函数进行节点连线作为调用边构建的,任一调用边标记有函数调用次数。
在本步骤中,基于步骤101得到的第i轮的测试种子在第i+1轮模糊测试中的函数调用记录,凭借该函数调用记录,将可以对预先生成的函数调用流图进行查找,以确定测试种子是否覆盖到函数调用流图中的新节点,如果当中的某一测试种子覆盖到函数调用流图中的新节点,则可以将该测试种子作为一个候选测试种子。
步骤103,针对所述第i轮测试种子中的任一个候选测试种子,根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度。
在本步骤中,基于步骤102得到的各候选测试种子,通过对各候选测试种子分别对应的新节点在函数调用流图中的调用次数与被调用次数进行获取,并基于所获取的调用次数与被调用次数确定候选测试种子的种子适应度。
上述方式中,通过为更有能力覆盖到更多分支的测试种子赋予更高的权重,通过适应度维度差异化种子质量,从而对各候选测试种子在模糊测试过程中表现出来的重要度进行了量化,基于量化的候选测试种子进行选择质优的测试种子作为新一轮模糊测试的种子,可以使得模糊测试的进程加快,测试效率变高。
步骤104,根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,并返回执行针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试的步骤,直至满足所述模糊测试的预设时间。
在本步骤中,基于步骤103得到的各候选测试种子的种子适应度,根据各种子适应度,将可以选择出用于进行新一轮模糊测试的测试种子;当在选择出用于进行新一轮模糊测试的测试种子后,将可以使用所选择出的测试种子开启执行新一轮的模糊测试的流程,具体步骤可以参考步骤101-104,直到达到为本次模糊测试设置的预设时间,结束模糊测试。
上述方案中,在每一轮模糊测试过程中选择用于进行下一轮测试的测试种子时,通过分析当前模糊测试过程中每一个用于模糊测试的种子是否覆盖到函数调用流图中的新节点,如果覆盖到,则保留该测试种子,针对所保留的测试种子,通过分析该测试种子对应的新节点在函数调用流图中的调用与被调用的数据,对于该种基于函数调用与被调用的数据确定测试种子的种子适应度的方法,通过为更有能力覆盖到更多分支的测试种子赋予更高的权重,通过适应度维度差异化种子质量,优化测试的输入,使得模糊测试的进程加快,测试效率变高。
以下将结合示例分别对上述一些步骤进行详细说明。
在本申请的某些实施中,通过下述方式获取所述目标智能合约的第1轮测试种子,包括:编译所述目标智能合约,获取所述目标智能合约的应用程序二进制接口ABI文件;根据所述ABI文件中的不同参数的数据类型,得到所述目标智能合约的第1轮测试种子。
在本申请的某些实施中,所述根据所述ABI文件中的不同参数的数据类型,得到所述目标智能合约的第1轮测试种子,包括:针对所述ABI文件中的任一个参数,若所述参数的数据类型为整数或者小数类型,则通过随机函数在所述数据类型的最大值与最小值中确定一个值作为所述参数的第1轮测试种子;若所述参数为布尔类型,则随机从0和1中确定一个值作为所述参数的第1轮测试种子;若所述参数为字符串类型,则从字节码中的常量字符串中随机取值作为所述参数的第1轮测试种子;若所述参数为数组类型,则根据数组中元素的原始数据类型,生成所述参数的第1轮测试种子;若所述参数为结构体类型,则根据结构体中的原始数据类型,生成所述参数的第1轮测试种子。
例如,对于一待测试的Liquid智能合约,为了便于描述,该待测试的Liquid智能合约令为智能合约T,首先通过编译该智能合约,将得到该智能合约的ABI文件。
接下来,针对得到的ABI文件,通过ABI文件中的不同函数参数的数据类型,将生成对该智能合约进行模糊测试的初始测试种子,该初始测试种子也即进行第1轮模糊测试的测试种子。具体方法分别如下:
首先,读取JSON格式的ABI文件中每个参数的数据类型。
然后,对每个参数的参数数据类型(Type),执行下述的(1)-(5)规则:
(1)、如果Type是整数或小数类型,则利用随机函数在数据类型的最大值和最小值中选定一个值作为该参数的初始值。
(2)、如果Type是布尔类型,则随机从0和1中取值作为初始值。
(3)、如果Type是String类型,则从字节码中的const字符串常量中随机取值作为初始值。
(4)、如果Type是数组类型,则根据数据中元素的原始数据类型,利用(1)-(3)中的方法生成参数初始值。
(5)、如果Type是结构体类型,则根据结构体中的原始数据类型,利用(1)-(3)中的方法生成参数初始值。
在本申请的某些实施中,所述函数调用流图通过下述方式构建,包括:编译所述目标智能合约,获取所述目标智能合约的WASM字节码文件;根据所述WASM字节码文件,确定所述目标智能合约的函数集合以及所述函数集合中任一个函数的指令集;根据所述函数集合以及各指令集,确定所述函数调用流图。
在本申请的某些实施中,所述根据所述WASM字节码文件,确定所述目标智能合约的函数集合以及所述函数集合中任一个函数的指令集,包括:转换所述WASM字节码文件为wat文本,并设置初始态的函数集合;所述初始态的函数集合为空;遍历所述wat文本中的每一条指令;针对当前遍历的指令,若确定所述指令指示函数,则添加所述指令指示的函数至所述初始态的函数集合的尾部;若确定所述指令并非指示函数,则添加所述指令至当前指示函数的指令的指令集的末尾;所述根据所述函数集合以及各指令集,确定所述函数调用流图,包括:针对所述函数集合中的任一个函数,遍历所述函数的指令集中的各指令;若确定当前遍历的指令为调用指令,则记录所述调用指令后的调用函数,并添加由所述函数指向所述调用函数的有向连线;若确定已经存在所述有向连线,则更新所述有向连线指示的调用边的调用次数;若确定当前遍历的指令为返回指令,则跳转至所述函数集合中的下一函数,并返回执行遍历所述函数的指令集中的各指令的步骤,从而得到所述函数调用流图。
接着前文的例子,对于智能合约T,通过编译该智能合约,将得到WASM字节码;根据得到的WASM字节码,将构建智能合约T中函数间的调用关系,对能够反映调用关系的指令和数目进行记录,并绘制成图,该绘制成的图即为函数调用流图。具体方式如下:
1、初始化图数据结构G,该图由WASM字节码中的函数节点集合F和函数间的有向调用边集合E构成。函数节点集合F中的每个函数节点f由WASM操作码指令集S和节点名name组成,E中的每条有向边e由源节点、目标节点和该边的调用次数num组成。
2、读取WASM字节码文件,利用WASM官方工具wasm2wati定义将二进制WASM字节码转化为可读性强的wat文本。
3、扫描得到的wat文本,对于扫描到的每一条指令instr,按照如下方式进行判断:
如果指令为func,则在函数调用流图中新建一个函数节点N,添加到节点集合F的末尾,节点名为该函数名name;
如果指令不为func,也即指令为一般指令,则将该指令instr添加到节点集合末尾的节点N的指令集S中。
4、对于得到的包含指令集的函数节点集合F,对集合F中的每一个节点N,按照如下方式进行判断:
(1)、扫描节点N中的指令集S,对指令集S中的每一个指令instr,按照如下方式进行判断:
(a)、如果instr是call指令,则记录call指令后的函数名参数name,添加一条由节点N到节点名为name的有向连线;该有向连线即为一条调用边,针对调用边,作如下分析:
如果已经存在该调用边,则直接在边集合E中更新该边的调用次数num为num+1;
如果不存在该调用边,则添加该有向边,并设置调用次数num为1;
(b)、如果instr不是call指令,则继续扫描下一条指令,跳转到(a);
(c)、如果instr是return指令,则表示对该节点的指令集S扫描完毕,跳转到下一节点,并执行(a)。
扫描完成所有的F中的节点N,就得到函数调用流图G,该函数调用流图G包含所有函数节点集合F和有向调用边集合E。
在上述步骤103的一个实施中,所述根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度,包括:获取所述函数调用流图的邻接矩阵;根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数、被调用次数以及所述邻接矩阵,确定所述候选测试种子的种子适应度。
例如,接着上述的例子,对于智能合约A,在使用初始测试种子对该智能合约进行模糊测试的过程中,可以利用WASM虚拟机进行插桩处理。通过将初始测试种子放置于已插桩的WASM虚拟机中执行,那么就可以获得模糊测试过程中想要的日志输出,如可对与分支覆盖率分析有关的操作码执行过程中的信息进行记录,例如对return指令和call指令相关的虚拟机实现中添加日志输出,从而就可以得到初始测试种子在模糊测试过程中覆盖到的函数。
针对初始测试种子在模糊测试过程中覆盖到的函数,通过将覆盖到的函数与预先生成的函数调用流图进行比较,就可以确定覆盖到的函数是否覆盖到函数调用流图中新的节点,如果确定函数覆盖到函数调用流图中新的节点,则可以将该初始测试种子作为一个候选测试种子,否则,则直接舍弃该初始测试种子。
针对得到的多个候选测试种子中每一个候选测试种子,计算该候选测试种子的适应度k=αS+βT。
定义W为函数调用流图G中所有边的带权邻接矩阵,其中Wij表示函数节点i到函数节点j的有向边,其值为0(代表不存在该有向边)或num(代表存在该有向边,且num为该边包含的调用次数。S为到达候选测试种子对应的函数x的所有边的num的和,T为从候选测试种子对应的函数出发,所有下一条有向边的num的和。α和β分别为S和T的权值,作为一种示例,本申请中将α和β分别设置为0.6和0.4。
适应度高的种子意味着能够覆盖下一个函数节点的机会越高,更利于模糊测试的进行。在执行模糊测试过程中,新的模糊测试输入种子会根据该算法计算对应的适应度k。
在上述步骤104的一个实施中,所述根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,包括:从各候选测试种子中确定出各第一候选测试种子和各第二候选测试种子;其中,任一第一候选测试种子的种子适应度大于任一第二候选测试种子的种子适应度;对各第一候选测试种子按照第一设定方式进行更新从而生成各第一更新测试种子,以及对各第二候选测试种子按照第二设定方式进行更新从而生成各第二更新测试种子;将各第一更新测试种子和各第二更新测试种子作为用于进行第i+2轮模糊测试的第i+1轮测试种子。
例如,接着前述例子,假设利用初始测试种子对智能合约进行模糊测试后,共计得到10个候选测试种子,分别令为候选测试种子1、候选测试种子2……候选测试种子9和候选测试种子10,该10个候选测试种子一一对应函数调用流图G中的一个新节点,该10个候选测试种子按照上述种子适应度的计算方法进行计算后,设该10个候选测试种子按照种子适应度由高到低的顺序进行排序后,得到的排序结果设为候选测试种子1、候选测试种子2、……候选测试种子9、候选测试种子10。
具体的,本申请的在将候选测试种子1、候选测试种子2、……候选测试种子9、候选测试种子10作为用于进行第2轮模糊测试的测试种子之前,还将对该10个候选测试种子进行测试种子的更新操作,从而基于种子更新操作得到的更新测试种子进行第2轮模糊测试,可以提升模糊测试的效率。可选的,种子更新操作的方式包括交叉操作和变异操作。具体的,本申请的第一设定方式为交叉操作方式,第二设定方式为变异操作方式。
交叉与变异的操作,具体如下:
针对适应度排序靠前的若干候选测试种子,两两进行交叉操作:
a)、如针对适应度排序靠前的候选测试种子1和候选测试种子2,将每个种子的bit数组vector的某个索引位置i分解为两个片段,vector[0-i]和vector[i+1,n],n为数组长度;
b)、交叉两个种子的第二个片段得到两个新的种子,该两个新的种子分别记作更新测试种子1’和更新测试种子2’。
针对适应度排序靠后的若干候选测试种子,逐一变异操作:
如针对适应度排序靠后的候选测试种子10,翻转随机选择的位置或字节,增加或替换所选的随机字节,随机位置用常数替换一个值,从而得到对应的更新测试种子10’。
按照相同的方法,则可以将候选测试种子1、候选测试种子2、……候选测试种子9、候选测试种子10进行交叉与变异操作后的更新测试种子1’、更新测试种子2’、……更新测试种子9’、更新测试种子10’作为第2轮模糊测试的输入,进行第2轮的模糊测试。
接下来,通过一个具体的实例说明测试种子的确定方法的使用。
例如,对于某个支持编译为WASM字节码的智能合约(例如Liquid智能合约)进行编译,产生ABI文件和WASM字节码文件。
其中,ABI文件内容如下:
Figure BDA0003691892480000151
Figure BDA0003691892480000161
WASM字节码内容如下:
0x0061736d0100000001500d60027…
根据ABI文件初始化种子池:对于ABI中名为test的函数,当中有名为number,类型为uint32的参数和bool类型的返回值,由于uint32类型的最大值和最小值分别为4294967295和0,bool的取值范围为0和1,所以假设随机初始化种子池中的输入种子分别是0x21902100(16进制表示)和0,对应uint32和bool类型。
根据WASM字节码文件,构建函数调用流图G,内容如下:
初始状态下,按层级关系,函数调用流图G数据结构包含函数节点集合F和边集合E,函数节点集合F中的每一个节点f由操作码指令集S和函数节点名name组成,边集合E由源节点e1和目标节点e2以及该边的调用次数num组成,这些数据结构初始化为空集。
然后,将字节码转化为wat文本格式,内容如下:
Figure BDA0003691892480000162
Figure BDA0003691892480000171
对于以上示例的wat文本格式而言,函数节点集合F新增节点N1和N2,N1的指令集S包含该func$f7内的所有指令,N2同理。N1的节点名name为7,N2的节点名name为8。
接着,添加调用边。同样以上图为例,扫描节点集合F,当扫描到节点N1中的指令时,发现func$f7中包含语句call$f8,则发现目标节点的name为8,源节点name为自身,即在边集合E中添加一条边e,该边的源节点name为7,目标节点name为8,由于之前为搜索到该调用边的存在,该调用边的调用次数num设置为1。
如图2所示,为本申请实施例提供的一种函数调用流图的示意图,其中每一个圆圈表示一个函数节点,圆圈内分别标识有函数名称,其中有向箭头即为一条调用边,针对一条调用边,该调用边上的数字代表源节点函数包含的对目标函数调用的次数,如果该调用边上未标记有数字,则默认函数调用次数为1次,否则,则说明函数调用次数为调用边上标记的数字,例如$func11内包含5次对$func19的调用。
适应度计算:对于某个覆盖到了新的函数节点的测试种子而言,需要根据得到的函数调用流图G计算其适应度k。例如对于上图中覆盖到$func19的候选测试种子s1而言,S的值为5,即从$func11出发的调用边上的调用次数num为5,T的值为6,即从$func19出发的有向边包含对其他函数节点的调用次数为6,计算得到k值为5.4,其他种子的适应度计算方法相同。
交叉和变异过程:首先对各候选测试种子根据适应度高低进行排序,对于排序靠前的适应度较高的部分候选测试种子进行两两交叉操作。例如对于选取的两个种子s1(0x21902100)和s2(0x10231442),在第二个字节也就是16位的位置进行截断与交叉,则新的种子s3为(0x21901442),s4为(0x10232100)。对排序靠后的适应度较低的部分候选测试种子进行随机位翻转(某一bit由0变为1),例如s5(0x00001100)在最低位进行位翻转得到s6(0x00001101),得到这些新的种子放入种子池中。
基于同样的构思,本申请实施例提供一种测试种子的确定装置,如图3所示,为本申请实施例提供的一种测试种子的确定装置的示意图,该装置包括函数调用记录获取单元301、候选测试种子确定单元302、种子适应度确定单元303和测试种子确定单元304;
函数调用记录获取单元301,用于针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试,并获取所述第i轮测试种子中的各测试种子在所述第i+1轮模糊测试中的函数调用记录;
候选测试种子确定单元302,用于针对所述第i轮测试种子中的任一个测试种子,根据所述测试种子在所述第i+1轮模糊测试中的函数调用记录,若确定所述测试种子在所述第i+1轮模糊测试中覆盖函数调用流图中的新节点,则保留所述测试种子作为候选测试种子;其中,所述函数调用流图是以所述目标智能合约中的各函数作为节点,且对存在调用关系的两个函数进行节点连线作为调用边构建的,任一调用边标记有函数调用次数;
种子适应度确定单元303,用于针对所述第i轮测试种子中的任一个候选测试种子,根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度;
测试种子确定单元304,用于根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,并返回执行针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试的步骤,直至满足所述模糊测试的预设时间。
进一步的,对于该装置,还包括初始测试种子确定单元305;初始测试种子确定单元305,用于:编译所述目标智能合约,获取所述目标智能合约的应用程序二进制接口ABI文件;根据所述ABI文件中的不同参数的数据类型,得到所述目标智能合约的第1轮测试种子。
进一步的,对于该装置,初始测试种子确定单元305,具体用于:针对所述ABI文件中的任一个参数,若所述参数的数据类型为整数或者小数类型,则通过随机函数在所述数据类型的最大值与最小值中确定一个值作为所述参数的第1轮测试种子;若所述参数为布尔类型,则随机从0和1中确定一个值作为所述参数的第1轮测试种子;若所述参数为字符串类型,则从字节码中的常量字符串中随机取值作为所述参数的第1轮测试种子;若所述参数为数组类型,则根据数组中元素的原始数据类型,生成所述参数的第1轮测试种子;若所述参数为结构体类型,则根据结构体中的原始数据类型,生成所述参数的第1轮测试种子。
进一步的,对于该装置,还包括函数调用流图构建单元306;函数调用流图构建单元306,用于:编译所述目标智能合约,获取所述目标智能合约的WASM字节码文件;根据所述WASM字节码文件,确定所述目标智能合约的函数集合以及所述函数集合中任一个函数的指令集;根据所述函数集合以及各指令集,确定所述函数调用流图。
进一步的,对于该装置,函数调用流图构建单元306,具体用于:转换所述WASM字节码文件为wat文本,并设置初始态的函数集合;所述初始态的函数集合为空;遍历所述wat文本中的每一条指令;针对当前遍历的指令,若确定所述指令指示函数,则添加所述指令指示的函数至所述初始态的函数集合的尾部;若确定所述指令并非指示函数,则添加所述指令至当前指示函数的指令的指令集的末尾;针对所述函数集合中的任一个函数,遍历所述函数的指令集中的各指令;若确定当前遍历的指令为调用指令,则记录所述调用指令后的调用函数,并添加由所述函数指向所述调用函数的有向连线;若确定已经存在所述有向连线,则更新所述有向连线指示的调用边的调用次数;若确定当前遍历的指令为返回指令,则跳转至所述函数集合中的下一函数,并返回执行遍历所述函数的指令集中的各指令的步骤,从而得到所述函数调用流图。
进一步的,对于该装置,种子适应度确定单元303,具体用于:获取所述函数调用流图的邻接矩阵;根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数、被调用次数以及所述邻接矩阵,确定所述候选测试种子的种子适应度。
进一步的,对于该装置,种子适应度确定单元303,具体用于:确定初始种子适应度k;其中k=αS+βT,α和β分别为S和T的预设权重,S表示基于所述函数调用流图确定的到达所述新节点的各入调用边的调用次数的和,T表示基于所述函数调用流图确定的从所述新节点出发的各出调用边的调用次数的和;根据所述初始种子适应度k和所述邻接矩阵,确定所述候选测试种子的种子适应度。
进一步的,对于该装置,测试种子确定单元304,具体用于:
从各候选测试种子中确定出各第一候选测试种子和各第二候选测试种子;其中,任一第一候选测试种子的种子适应度大于任一第二候选测试种子的种子适应度;对各第一候选测试种子按照第一设定方式进行更新从而生成各第一更新测试种子,以及对各第二候选测试种子按照第二设定方式进行更新从而生成各第二更新测试种子;将各第一更新测试种子和各第二更新测试种子作为用于进行第i+2轮模糊测试的第i+1轮测试种子。
本申请实施例还提供了一种计算设备,该计算设备具体可以为桌面计算机、便携式计算机、智能手机、平板电脑、个人数字助理(Personal Digital Assistant,PDA)等。该计算设备可以包括中央处理器(Center Processing Unit,CPU)、存储器、输入/输出设备等,输入设备可以包括键盘、鼠标、触摸屏等,输出设备可以包括显示设备,如液晶显示器(Liquid Crystal Display,LCD)、阴极射线管(Cathode Ray Tube,CRT)等。
存储器,可以包括只读存储器(ROM)和随机存取存储器(RAM),并向处理器提供存储器中存储的程序指令和数据。在本申请实施例中,存储器可以用于存储测试种子的确定方法的程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行测试种子的确定方法。
如图4所示,为本申请实施例提供的一种计算设备的示意图,该计算设备包括:
处理器401、存储器402、收发器403、总线接口404;其中,处理器401、存储器402与收发器403之间通过总线405连接;
所述处理器401,用于读取所述存储器402中的程序,执行上述测试种子的确定方法;
处理器401可以是中央处理器(central processing unit,简称CPU),网络处理器(network processor,简称NP)或者CPU和NP的组合。还可以是硬件芯片。上述硬件芯片可以是专用集成电路(application-specific integrated circuit,简称ASIC),可编程逻辑器件(programmable logic device,简称PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(complex programmable logic device,简称CPLD),现场可编程逻辑门阵列(field-programmable gate array,简称FPGA),通用阵列逻辑(generic array logic,简称GAL)或其任意组合。
所述存储器402,用于存储一个或多个可执行程序,可以存储所述处理器401在执行操作时所使用的数据。
具体地,程序可以包括程序代码,程序代码包括计算机操作指令。存储器402可以包括易失性存储器(volatile memory),例如随机存取存储器(random-access memory,简称RAM);存储器402也可以包括非易失性存储器(non-volatile memory),例如快闪存储器(flash memory),硬盘(hard disk drive,简称HDD)或固态硬盘(solid-state drive,简称SSD);存储器402还可以包括上述种类的存储器的组合。
存储器402存储了如下的元素,可执行模块或者数据结构,或者它们的子集,或者它们的扩展集:
操作指令:包括各种操作指令,用于实现各种操作。
操作系统:包括各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
总线405可以是外设部件互连标准(peripheral component interconnect,简称PCI)总线或扩展工业标准结构(extended industry standard architecture,简称EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图4中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
总线接口404可以为有线通信接入口,无线总线接口或其组合,其中,有线总线接口例如可以为以太网接口。以太网接口可以是光接口,电接口或其组合。无线总线接口可以为WLAN接口。
本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行测试种子的确定方法。
本领域内的技术人员应明白,本申请的实施例可提供为方法、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (11)

1.一种测试种子的确定方法,其特征在于,包括:
针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试,并获取所述第i轮测试种子中的各测试种子在所述第i+1轮模糊测试中的函数调用记录;
针对所述第i轮测试种子中的任一个测试种子,根据所述测试种子在所述第i+1轮模糊测试中的函数调用记录,若确定所述测试种子在所述第i+1轮模糊测试中覆盖函数调用流图中的新节点,则保留所述测试种子作为候选测试种子;其中,所述函数调用流图是以所述目标智能合约中的各函数作为节点,且对存在调用关系的两个函数进行节点连线作为调用边构建的,任一调用边标记有函数调用次数;
针对所述第i轮测试种子中的任一个候选测试种子,根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度;
根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,并返回执行针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试的步骤,直至满足所述模糊测试的预设时间。
2.如权利要求1所述的方法,其特征在于,i=1;
通过下述方式获取所述目标智能合约的第1轮测试种子,包括:
编译所述目标智能合约,获取所述目标智能合约的应用程序二进制接口ABI文件;
根据所述ABI文件中的不同参数的数据类型,得到所述目标智能合约的第1轮测试种子。
3.如权利要求2所述的方法,其特征在于,
所述根据所述ABI文件中的不同参数的数据类型,得到所述目标智能合约的第1轮测试种子,包括:
针对所述ABI文件中的任一个参数,若所述参数的数据类型为整数或者小数类型,则通过随机函数在所述数据类型的最大值与最小值中确定一个值作为所述参数的第1轮测试种子;
若所述参数为布尔类型,则随机从0和1中确定一个值作为所述参数的第1轮测试种子;
若所述参数为字符串类型,则从字节码中的常量字符串中随机取值作为所述参数的第1轮测试种子;
若所述参数为数组类型,则根据数组中元素的原始数据类型,生成所述参数的第1轮测试种子;
若所述参数为结构体类型,则根据结构体中的原始数据类型,生成所述参数的第1轮测试种子。
4.如权利要求1所述的方法,其特征在于,
所述函数调用流图通过下述方式构建,包括:
编译所述目标智能合约,获取所述目标智能合约的WASM字节码文件;
根据所述WASM字节码文件,确定所述目标智能合约的函数集合以及所述函数集合中任一个函数的指令集;
根据所述函数集合以及各指令集,确定所述函数调用流图。
5.如权利要求4所述的方法,其特征在于,
所述根据所述WASM字节码文件,确定所述目标智能合约的函数集合以及所述函数集合中任一个函数的指令集,包括:
转换所述WASM字节码文件为wat文本,并设置初始态的函数集合;所述初始态的函数集合为空;
遍历所述wat文本中的每一条指令;
针对当前遍历的指令,若确定所述指令指示函数,则添加所述指令指示的函数至所述初始态的函数集合的尾部;
若确定所述指令并非指示函数,则添加所述指令至当前指示函数的指令的指令集的末尾;
所述根据所述函数集合以及各指令集,确定所述函数调用流图,包括:
针对所述函数集合中的任一个函数,遍历所述函数的指令集中的各指令;若确定当前遍历的指令为调用指令,则记录所述调用指令后的调用函数,并添加由所述函数指向所述调用函数的有向连线;若确定已经存在所述有向连线,则更新所述有向连线指示的调用边的调用次数;
若确定当前遍历的指令为返回指令,则跳转至所述函数集合中的下一函数,并返回执行遍历所述函数的指令集中的各指令的步骤,从而得到所述函数调用流图。
6.如权利要求1所述的方法,其特征在于,
所述根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度,包括:
获取所述函数调用流图的邻接矩阵;
根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数、被调用次数以及所述邻接矩阵,确定所述候选测试种子的种子适应度。
7.如权利要求6所述的方法,其特征在于,
所述根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数、被调用次数以及所述邻接矩阵,确定所述候选测试种子的种子适应度,包括:
确定初始种子适应度k;其中k=αS+βT,α和β分别为S和T的预设权重,S表示基于所述函数调用流图确定的到达所述新节点的各入调用边的调用次数的和,T表示基于所述函数调用流图确定的从所述新节点出发的各出调用边的调用次数的和;
根据所述初始种子适应度k和所述邻接矩阵,确定所述候选测试种子的种子适应度。
8.如权利要求1所述的方法,其特征在于,
所述根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,包括:
从各候选测试种子中确定出各第一候选测试种子和各第二候选测试种子;其中,任一第一候选测试种子的种子适应度大于任一第二候选测试种子的种子适应度;
对各第一候选测试种子按照第一设定方式进行更新从而生成各第一更新测试种子,以及对各第二候选测试种子按照第二设定方式进行更新从而生成各第二更新测试种子;
将各第一更新测试种子和各第二更新测试种子作为用于进行第i+2轮模糊测试的第i+1轮测试种子。
9.一种测试种子的确定装置,其特征在于,包括:
函数调用记录获取单元,用于针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试,并获取所述第i轮测试种子中的各测试种子在所述第i+1轮模糊测试中的函数调用记录;
候选测试种子确定单元,用于针对所述第i轮测试种子中的任一个测试种子,根据所述测试种子在所述第i+1轮模糊测试中的函数调用记录,若确定所述测试种子在所述第i+1轮模糊测试中覆盖函数调用流图中的新节点,则保留所述测试种子作为候选测试种子;其中,所述函数调用流图是以所述目标智能合约中的各函数作为节点,且对存在调用关系的两个函数进行节点连线作为调用边构建的,任一调用边标记有函数调用次数;
种子适应度确定单元,用于针对所述第i轮测试种子中的任一个候选测试种子,根据所述候选测试种子对应的新节点在所述函数调用流图中的调用次数和被调用次数,确定所述候选测试种子的种子适应度;
测试种子确定单元,用于根据各候选测试种子分别对应的种子适应度,从所述第i轮测试种子中确定出用于进行第i+2轮模糊测试的第i+1轮测试种子,并返回执行针对目标智能合约的第i轮测试种子,基于所述第i轮测试种子进行第i+1轮模糊测试的步骤,直至满足所述模糊测试的预设时间。
10.一种计算机设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于调用所述存储器中存储的计算机程序,按照获得的程序执行如权利要求1-8任一项所述的方法。
11.一种计算机可读存储介质,其特征在于,所述存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如权利要求1-8任一项所述的方法。
CN202210666920.1A 2022-06-13 2022-06-13 一种测试种子的确定方法及装置 Pending CN115017048A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210666920.1A CN115017048A (zh) 2022-06-13 2022-06-13 一种测试种子的确定方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210666920.1A CN115017048A (zh) 2022-06-13 2022-06-13 一种测试种子的确定方法及装置

Publications (1)

Publication Number Publication Date
CN115017048A true CN115017048A (zh) 2022-09-06

Family

ID=83075124

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210666920.1A Pending CN115017048A (zh) 2022-06-13 2022-06-13 一种测试种子的确定方法及装置

Country Status (1)

Country Link
CN (1) CN115017048A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115982784A (zh) * 2023-03-21 2023-04-18 紫光同芯微电子有限公司 一种WebAssembly模块调用函数的方法及装置

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115982784A (zh) * 2023-03-21 2023-04-18 紫光同芯微电子有限公司 一种WebAssembly模块调用函数的方法及装置
CN115982784B (zh) * 2023-03-21 2023-09-12 紫光同芯微电子有限公司 一种WebAssembly模块调用函数的方法及装置

Similar Documents

Publication Publication Date Title
CN108701250B (zh) 数据定点化方法和装置
Heineman et al. Algorithms in a Nutshell
US11016778B2 (en) Method for vectorizing Heapsort using horizontal aggregation SIMD instructions
CN112434188B (zh) 一种异构数据库的数据集成方法、装置及存储介质
CN113268485B (zh) 数据表关联分析方法、装置、设备及存储介质
US20230289640A1 (en) Quantum circuit simulation
de Oliveira et al. An ant colony hyperheuristic approach for matrix bandwidth reduction
CN115017048A (zh) 一种测试种子的确定方法及装置
CN116560984A (zh) 一种基于调用依赖图的测试用例聚类分组方法
Fieldsend Computationally efficient local optima network construction
Neto Efficient cluster compensation for Lin-Kernighan heuristics
Baka Python Data Structures and Algorithms
CN110796268A (zh) 确定业务处理模型超参数的方法和装置
CN116702157B (zh) 一种基于神经网络的智能合约漏洞检测方法
CN111683010B (zh) 基于光缆网光路的双路由的生成方法及装置
CN117453503A (zh) 一种深度学习算子程序的优化方法、装置、设备及介质
US11307867B2 (en) Optimizing the startup speed of a modular system using machine learning
JP5206197B2 (ja) 規則学習方法、プログラム及び装置
Biswas et al. Approximation in (poly-) logarithmic space
CN116010229A (zh) 测试用例的生成方法、装置、设备及程序产品
CN109918058B (zh) 信息处理装置和方法以及在编程环境中推荐代码的方法
CN112800425A (zh) 一种基于图计算的代码分析的方法和装置
Agarwal Hands-On Data Structures and Algorithms with Python: Store, manipulate, and access data effectively and boost the performance of your applications
CN108415815B (zh) 一种app软件运行数据异常判断方法
CN114218103A (zh) 一种测试案例生成方法、装置、设备及存储介质

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