一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于资源使用感知模糊测试的程序资源消耗量上界预测方法

2022-07-13 23:17:44 来源:中国专利 TAG:


1.本发明涉及软件测试技术领域,尤其涉及一种基于资源使用感知模糊测试的程序资源消耗量上界预测方法。


背景技术:

2.计算机系统中资源的使用与管理一直都是软件开发的重要关注点之一。软件在运行时不可避免地要对各种资源进行操作和管理,如堆栈内存、线程、文件句柄、数据库连接、网络套接字等。随着程序的运行(如打开或关闭文件),每种资源的使用量(如当前打开文件句柄数量)会随程序运行而发生动态变化,不同程序对各种类型资源的消耗量也不尽相同。如果给程序配置较少的系统资源或者程序本身存在未受控制的资源消耗缺陷,可能导致整个系统运行效率下降或者运行受阻,甚至出现崩溃的现象。因此,事先对程序资源消耗上界进行预测分析,对于检测程序资源消耗缺陷、优化资源配置、保障程序正确运行具有重要意义。
3.程序资源消耗上界预测的目的即是预测最差情形下程序运行过程中消耗资源量的上界。针对于资源消耗上界预测,目前通常是采用静态分析方法实现,通过将源程序中复杂的语法结构抽象出来,得到纯数值程序后再开展分析,采用保守方式来推导循环(或递归)的迭代次数,得到的分析结果一般是关于输入的线性表达式,分析过程中主要考虑堆内存的消耗量。上述传统采用静态分析方法对程序资源消耗上界进行预测通常包括以下步骤:在程序中引入整型变量建模资源使用量,增加资源使用建模语句,建模程序语句中的资源使用变化情况;基于增加建模语句后的程序源代码,开展静态分析(如符号执行、抽象解释等),分析得到资源使用建模变量的值范围上界。
4.但是上述传统采用静态分析方法对程序资源消耗上界进行预测的方式会存在以下问题:
5.1、基于传统静态分析方法虽然可以提供最差情况下的资源消耗的上限,但是仅能提供过于保守甚至无限制的结果,分析得到的最坏情况下资源消耗上界预测结果与程序实际最差情形下资源消耗量差距较大,即预测精度不高。
6.2、仅适用于对小规模程序进行预测,对于复杂的语法结构需要抽象出来,而现实世界的程序中,资源通常是通过特定的api(application programming interface,应用程序编程接口)操作,这些api可能会涉及复杂的结构,因而传统采用静态分析方法不适用于大规模的复杂程序。


技术实现要素:

7.本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种实现方法简单、自动化程度高以及预测效率与精度高的基于资源使用感知模糊测试的程序资源消耗量上界预测方法,能够实现大规模程序中多种资源类型在最坏情况下的资源消耗量精准预测。
8.为解决上述技术问题,本发明提出的技术方案为:
9.一种基于资源使用感知模糊测试的程序资源消耗量上界预测方法,步骤包括:
10.步骤s1.利用静态分析方法识别目标程序中指定资源类型的资源操作api、识别涉及资源使用的函数,以及识别资源使用所在的控制流分支,并将预先定义的资源使用建模函数以及用于代码覆盖率标记的覆盖率标签函数的调用语句插桩到目标程序中,得到插桩后的程序;
11.步骤s2.使用资源消耗量和资源使用操作覆盖为指导,对所述插桩后的程序进行模糊测试,得到目标程序在最坏情况下的资源消耗量,即为预测的程序资源消耗量上界。
12.进一步的,所述步骤s1包括:
13.步骤s101.识别资源操作api:所述资源使用操作api包括系统或库提供的应用程序编程接口,以及应用程序中定义的应用程序编程接口,针对所述资源使用操作,定义对应的资源使用建模函数,并将所述资源建模函数插桩到目标程序中指定位置,通过在目标程序中显式地调用所述资源使用建模函数以建模资源使用情况;
14.步骤s102.识别涉及资源使用的函数:根据步骤s101得到的资源操作api以及目标程序的函数调用图,识别出直接或间接调用资源使用操作的所有函数的列表,并在调用识别出的各函数的位置之前插桩预设的覆盖率标签函数,以用于识别程序中涉及资源使用的基本块;
15.步骤s103.识别资源使用所在的控制流分支:获取所有包含所述资源使用建模函数或所述覆盖率标签函数的目标程序块,识别出所述目标程序块所在的控制流分支,并在所述目标程序块所在的控制流分支之前以及在另一个分支的程序块开始处插桩预设的覆盖率标签函数。
16.进一步的,所述资源使用建模函数包括第一建模函数_ralloc(intn)以及第二建模函数_rdealloc(intn),所述第一建模函数_ralloc(intn)用于对资源数量n的分配进行建模,即将当前的资源使用量res_now加上n,其中如果当前资源使用量res_now多于当前资源使用峰值res_peak,则将所述资源使用量res_now的值赋予当前资源使用峰值res_peak;所述第二建模函数_rdealloc(intn)用于对资源数量为n的释放进行建模,即将当前的资源使用量(res_now)减去n。
17.进一步的,所述预设的覆盖率标签函数为_covl()函数,即所述步骤s102中通过插桩函数_covl(),以由函数_covl()识别程序中涉及资源使用的基本块,所述函数_covl()为空函数;所述步骤s103中,在所述目标程序块所在的控制流分支之前以及在另一个分支的程序块开始处插桩函数_covl()。
18.进一步的,所述步骤s103中,通过采用自底而上的插桩方式插桩预设的覆盖率标签函数,即从最里层符合匹配条件的分支开始一直插桩到最外层的分支,所述最里层符合匹配条件的分支为包含资源使用操作api的分支。
19.进一步的,所述步骤s1中利用基于语义补丁的程序插桩工具,自动将所述资源使用建模函数以及覆盖率标签函数的调用语句插桩到目标程序中。
20.进一步的,所述步骤s2的步骤包括:
21.步骤s201.输入所述插桩后的程序和初始输入用例,初始化当前查找到的最大资源消耗量max_res为0,以及初始化模糊测试种子序列为由所述初始输入用例组成的队列;
22.步骤s202.执行模糊测试,每次执行时从所述模糊测试种子序列中选择一个输入并进行变异,生成变异后的输入,运行所述变异后的输入并监控执行情况,收集资源使用量的信息以及资源使用感知覆盖信息,执行结束后获取到当前次执行的资源消耗量最大值;
23.步骤s203.判断当前次执行的资源消耗量最大值大小,如果大于当前查找到的最大资源消耗量max_res,则将所述当前次执行的资源消耗量最大值赋给所述当前查找到的最大资源消耗量max_res,并添加到所述模糊测试种子序列中以继续应用变异生成测试用例;或者如果当前变异后的输入的执行过程中,覆盖了之前没有覆盖到的资源使用位置,则将当前变异后的输入添加到种子序列;
24.步骤s204.判断当前输入的执行是否会导致程序崩溃,如果是则将当前输入添加到收集触发资源使用错误的测试用例集buggys中,完成当前输入的模糊测试后,得到在给定的时间下资源消耗量的最大值以及触发资源使用错误的测试用例集buggys并输出。
25.进一步的,所述步骤s202中,在执行模糊测试的过程中,模糊测试引擎分别跟踪当前次执行的当前资源使用量以及到当前查找到的最大资源消耗量max_res,通过捕获所述资源使用建模函数的参数更新资源使用量,并更新资源使用的当前量和历史峰值量。
26.进一步的,在所述模糊测试过程中,通过记录包含资源使用建模函数、覆盖率标签函数的基本块之间的跳转以指导模糊测试。
27.进一步的,在所述模糊测试过程中,资源使用感知模糊器使用不同的分支覆盖定义,以资源使用操作为覆盖目标,以及添加资源消耗量为指导,如果当前输入有新的资源使用感知覆盖,则将当前输入添加到所述模糊测试种子序列中以用于进一步变异。
28.与现有技术相比,本发明的优点在于:
29.1、本发明通过使用动态和静态相结合的方式,先对程序进行静态分析和代码的插桩,由于插桩的代码能够保证程序的功能完全不变,且不会影响程序的运行效率,然后再对插桩后的程序进行模糊测试,整个预测过程与被分析程序的复杂程度无关,可适用于大规模的复杂程序中,相比于传统采用静态分析方法需要先将源程序中复杂的语法结构抽象后再进行分析,可以大大降低程序资源消耗上界预测对于程序复杂度的限制。
30.2、本发明通过采用基于资源使用感知模糊测试的动态分析方式,实现程序资源消耗量上界的预测,能够极大化触发资源的消耗,且每次运行触发的资源消耗都是程序真实的消耗,因而可以使得程序资源消耗量上界的预测结果接近于程序实际最差情形下资源消耗上界,大大提高程序资源消耗上界的预测精度。
附图说明
31.图1是本实施例基于资源使用感知模糊测试的程序资源消耗量上界预测方法的实现流程示意图。
32.图2在具体应用实施例中按照步骤s1实现代码自动插桩的流程示意图。
具体实施方式
33.以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
34.如图1所示,本实施例基于资源使用感知模糊测试的程序资源消耗量上界预测方
法的步骤包括:
35.步骤s1.利用静态分析方法识别目标程序中指定资源类型的资源操作api、识别涉及资源使用的函数,以及识别资源使用所在的控制流分支,并将预先定义的资源使用建模函数以及用于代码覆盖率标记的覆盖率标签函数的调用语句插桩到目标程序中,得到插桩后的程序;
36.步骤s2.使用资源消耗量和资源使用操作覆盖为指导,对插桩后的程序进行模糊测试,得到目标程序在最坏情况下的资源消耗量,即为预测的程序资源消耗量上界。
37.本实施例使用动态和静态相结合的方式,首先对程序进行静态分析和代码的插桩,插桩的代码能够保证程序的功能完全不变,且不会影响程序的运行效率,然后再对插桩后的程序进行模糊测试,基于资源使用感知模糊测试的动态分析,通过结合资源消耗量极大化和资源使用操作覆盖为指导的模糊测试实现程序资源消耗量上界的预测。一方面,由于整个预测过程与被分析程序的复杂程度无关,因而可适用于现实世界的大规模复杂程序;另一方面,基于资源使用感知的模糊测试方式,能够极大化触发资源的消耗,且每次运行触发的资源消耗都是程序真实的消耗,使得程序资源消耗量上界的预测结果接近于程序实际最差情形下资源消耗上界,确保最终的预测精度。
38.如图1所示,步骤s1即对应于执行自动化程序转换,利用静态分析方法分别识别目标程序中资源相关操作、涉及资源使用的函数以及资源使用所在的控制流分支,然后进行代码自动插桩,将资源使用建模函数以及覆盖率标签函数的调用语句插桩到目标程序中,得到插桩后的程序;步骤s2对步骤s1得到的插桩后的程序进行模糊测试循环,测试过程中使用资源使用操作覆盖和资源消耗量作为指导,最终得到目标程序在最坏情况下的资源消耗峰值,即得到所需预测的程序资源消耗量上界。
39.本实施例步骤s1的步骤包括:
40.步骤s101.识别资源操作api:资源使用操作api包括系统或库提供的应用程序编程接口,以及应用程序中定义(如程序员自定义)的应用程序编程接口,针对上述资源使用操作,定义对应的资源使用建模函数,并将所述资源建模函数插桩到目标程序中指定位置,通过在目标程序中显式地调用所述资源使用建模函数以建模资源使用情况;
41.步骤s102.识别涉及资源使用的函数:根据步骤s101得到的资源操作api以及目标程序的函数调用图,识别出直接或间接调用资源使用操作的所有函数的列表,并在调用识别出的各函数的位置之前插桩预设的覆盖率标签函数,以用于识别程序中涉及资源使用的基本块;
42.步骤s103.识别资源使用所在的控制流分支:获取所有包含资源使用建模函数或所述覆盖率标签函数的目标程序块,识别出目标程序块所在的控制流分支,并在目标程序块所在的控制流分支之前以及在另一个分支的程序块开始处插桩预设的覆盖率标签函数。
43.资源使用操作api可以是系统或库提供的应用程序编程接口,也可以是应用程序中程序员自定义的应用程序编程接口,如堆内存申请函数malloc。从资源使用量增减变化的角度来看,所有的资源使用操作本质上都可以简单分类为分配(即增加)和释放(即减少)操作。本实施例中针对资源类型对应的每种资源操作api,定义两个基本的资源使用建模函数以模拟资源使用量变化情况,如表1所示,包括第一建模函数_ralloc(intn)以及第二建模函数_rdealloc(intn),第一建模函数_ralloc(intn)用于对资源数量n的分配进行建
模,即将当前的资源使用量res_now加上n,其中如果当前资源使用量res_now多于当前资源使用峰值res_peak,则将当前资源使用量res_now的值赋予当前资源使用峰值res_peak,即当前资源使用峰值res_peak即为当前资源使用量res_now;第二建模函数_rdealloc(intn)用于对资源数量为n的释放进行建模,即将当前的资源使用量(res_now)减去n。
44.表1资源操作建模函数
[0045][0046]
定义上述两个基本建模函数后,将插桩上述两个基本建模函数的调用,为原始程序中的每个资源使用操作显式地调用这两个基本建模函数以建模资源使用情况。例如,为了对pfile=fopen(...)建模,可以在该语句之后插桩_ralloc(pfile!=null?1:0);为了建模c程序中的free(p),可以在该语句之前插桩_rdealloc(malloc_usable_size(p)),其中,malloc_usable_size(p)函数(c语言的库函数)返回p指向的动态存储块占用的字节数;为了模拟堆栈深度的变化,可以分别在每个函数的入口和末端(在return语句之前)插桩_ralloc(1)和_rdealloc(1)。
[0047]
本实施例在每次预测分析时只考虑一种资源,不同资源采用多次预测分析来实现,以避免多种类型的资源之间相互影响。
[0048]
在具体应用实施例中,步骤s102中具体根据步骤s101得到的资源操作api以及目标程序的函数调用图,识别出直接或间接调用资源使用操作的所有函数的列表,然后在调用这些目标函数的位置之前插桩覆盖率标签函数_covl(),以由函数_covl()识别程序中涉及资源使用的基本块,该基本块将被进一步用于定义步骤s2中的资源使用感知覆盖,函数_covl()即为空函数。
[0049]
在具体应用实施例中,步骤s103中,对于每个包含资源使用建模函数(_ralloc、_rdealloc)的或覆盖率标签函数(即_covl)的程序块,识别出该程序块所在的控制流分支,在该程序块所在的控制流分支之前以及在另一个分支(如else分支)的程序块开始处插桩覆盖率标签函数_covl()。具体可采用自底而上的插桩方式,即从最里层符合匹配条件的分支开始一直插桩到最外层的分支,最里层符合匹配条件的分支即为包含资源使用操作api的分支。
[0050]
可以理解的是,上述识别资源操作api、涉及资源使用的函数以及识别资源所在控制流分支,当然也可以根据实际需求采用其他方法实现以获取程序资源使用量。
[0051]
本实施例步骤s1中具体利用基于语义补丁的程序插桩工具,自动将资源使用建模函数以及覆盖率标签函数的调用语句插桩到目标程序中,实现代码自动插桩。基于语义补丁的程序插桩工具允许编写语义补丁来指定所需的代码匹配和程序转换方式。例如,基于语义补丁的程序插桩工具coccinelle的转换引擎是根据控制流定义的,因此非常适合在资源使用所在控制流分支处插入覆盖率标签函数。
[0052]
以从包含已知cve漏洞的旧版本的libtirpc中提取的代码为例(如图2所示),产生cve现象的原因是没有在所有实例中检查makefd_xprt()的返回值,当服务器用尽最大数量的可用文件描述符时,这可能会导致崩溃。图2中(a)展示了从libtirpc的原始代码中提取的切片,图2中(b)展示了应用于工具的语义补丁的一部分,插桩后的程序如图2中(c)所示。该程序使用套接字连接,例如通过调用如图2中(a)中第13行所示的accept()函数。使用图2(b)所示的语义补丁,在成功建立连接时,在程序位置插桩资源使用建模函数_ralloc(1)以及覆盖率标签函数_covl(),插桩的代码如图2(c)中突出显示所示。
[0053]
可以理解的是,上述代码自动插桩也可以采用其他插桩方式实现,关键在于插入的辅助变量语句能够准确刻画程序的资源使用量以及使用量上界的变化。
[0054]
本实施例对于目标程序和需估计的资源类型,首先利用静态分析方法识别被分析的指定资源类型的资源操作api和直接或间接调用资源使用操作的所有函数的列表,以及上述资源操作api及函数列表中所有函数被调用的所有程序位置(即程序点),并针对该资源类型对应的每种资源操作api,定义相应的资源使用建模函数以模拟资源使用量变化情况;在此基础上,针对待分析目标程序的源代码,识别资源使用所在的控制流分支,再利用基于语义补丁的程序插桩工具自动将资源使用建模函数以及用于代码覆盖率标记的标签函数的调用语句插桩到原始程序中,插桩的代码保证程序的功能完全不变,且不会对程序的运行效率造成影响。
[0055]
本实施例中步骤s2的步骤包括:
[0056]
步骤s201.输入插桩后的程序和初始输入用例,初始化当前查找到的最大资源消耗量max_res为0,以及初始化模糊测试种子序列为由初始输入用例组成的队列;
[0057]
步骤s202.执行模糊测试,每次执行时从模糊测试种子序列中选择一个输入并进行变异,生成变异后的输入,运行变异后的输入并监控执行情况,收集资源使用量的信息以及资源使用感知覆盖信息,执行结束后获取到当前次执行的资源消耗量最大值;
[0058]
步骤s203.判断当前次执行的资源消耗量最大值大小,如果大于当前查找到的最大资源消耗量max_res,则将当前次执行的资源消耗量最大值赋给当前查找到的最大资源消耗量max_res,并添加到模糊测试种子序列中以继续应用变异生成测试用例;或者如果当前变异后的输入的执行过程中,覆盖了之前没有覆盖到的资源使用位置,则将当前变异后的输入添加到种子序列;
[0059]
步骤s204.判断当前输入的执行是否会导致程序崩溃,如果是则将当前输入添加到收集触发资源使用错误的测试用例集buggys中,完成当前输入的模糊测试后,得到在给定的时间下资源消耗量的最大值以及触发资源使用错误的测试用例集buggys输出。
[0060]
本实施例通过采用资源使用感知的模糊测试方式,结合资源消耗量极大化和资源使用操作覆盖为指导的模糊测试来获取程序在最坏情况下的资源消耗量,可以极大化触发资源的消耗,使得最终程序资源消耗量上界的预测结果能够接近于程序实际最差情形下资源消耗量。
[0061]
如图1所示,在执行模糊测试循环过程中,首先从种子序列中选择一个输入并进行变异,生成变异后的输入,执行变异后的输入并监控执行情况,收集资源使用量的信息以及资源使用感知覆盖信息,将收集的信息进行反馈,结合资源消耗量和资源使用操作覆盖作为模糊测试指导,对种子序列进行更新,直至得到最终的程序资源消耗量峰值(上界)的预
测结果。
[0062]
本实施例通过配置用于实现模糊测试的算法,算法输入步骤s1插桩后的程序和初始输入用例,执行完测试后输出为(max_res,buggys),其中max_res为当前查找到的最大资源消耗量,buggys为触发资源消耗漏洞的测试用例集。执行测试时由步骤s201首先将max_res初始化为0,buggys为空集,模糊测试种子序列初始化为由初始输入用例组成的队列。
[0063]
本实施例步骤s202中,在执行模糊测试的过程中,模糊测试引擎分别跟踪当前次执行的当前资源使用量以及到当前查找到的最大资源消耗量max_res,通过捕获资源使用建模函数的参数更新资源使用量,并更新资源使用的当前量和历史峰值量。
[0064]
在具体应用实施例中,步骤s202具体包括:在模糊测试过程中,如果模糊测试运行时间没有超过预先设定的阈值时限,则首先从种子队列中选择一个输入,对其进行变异并生成变异后的输入,然后运行该变异后的输入并监控其执行情况,收集资源使用量相关的信息以及资源使用感知覆盖信息,在执行的过程中,模糊测试引擎通过维护两个变量(resc_cur和resc_peak)以分别跟踪当前次执行的当前资源使用量以及到目前为止资源使用量的最大值;模糊测试引擎再通过捕获_ralloc(n)和_rdealloc(n)的参数来更新资源使用量,以及更新资源使用的当前量和历史峰值量。在当前次执行结束之后,即可获取到当前次执行的资源消耗量最大值resc_peak的值,并赋给变量n_res。
[0065]
本实施例在模糊测试过程中,通过记录包含资源使用建模函数、覆盖率标签函数的基本块之间的跳转指导模糊测试;程序中的许多基本块对于实现程序的功能是有用的,但与资源使用无关,与传统基于覆盖的灰盒模糊测试工具(例如,afl)方式不同的,本实施例只关注程序中的资源使用,即只记录包含资源使用建模函数(即_ralloc(),_rdealloc())、覆盖率标签函数_covl()和exit()函数的基本块之间的跳转,以指导模糊测试。例如,考虑执行路径仅包含前述资源相关功能,将该执行路径记录为从到的转换,并根据具体执行情况增加此转换的命中次数。
[0066]
本实施例在模糊测试过程中,在识别不同的资源使用方面,由资源使用感知模糊器使用不同的分支覆盖定义,并以资源使用操作为覆盖目标,同时添加资源消耗量为指导以保留有趣的输入,如果当前输入有新的资源使用感知覆盖,则将当前输入添加到所述模糊测试种子序列中以用于进一步变异。本实施例通过使用资源使用感知的边覆盖方式,相比于传统的边覆盖方式,能够实现更加精细和敏感的识别不同的资源使用。
[0067]
在具体应用实施例中,步骤s203中,如果当前次执行资源消耗量最大值n_res比当前查找到的最大资源消耗量max_res大,表明当前变异后的输入消耗了更多的资源,则将该n_res的值赋给max_res,即当前查找到的最大资源消耗量max_res为当前次执行资源消耗量最大值n_res,同时将当前变异后的输入被视为有趣的,并将其添加到种子序列继续应用变异来生成更多的测试用例。如果当前变异后的输入的执行过程中,覆盖了之前没有覆盖到的资源使用位置,将当前变异后的输入视为有趣的并被添加到种子序列。
[0068]
本实施例步骤s204中,当分配给模糊测试的运行时间耗尽时,则控制结束运行过程,输出结果(max_res,buggys),即在给定的时间下资源消耗量的最大值max_res以及触发资源使用错误的测试用例集buggys。
[0069]
可以理解的是,上述基于使用资源使用感知的模糊测试也可以采用其他实现方式,关键在于以资源使用覆盖和资源使用量为指导进行模糊测试。
[0070]
综上,在现实世界的程序中,资源通常是通过特定的api来操作的,这些api可能涉及复杂的结构,而且资源的使用量往往不仅取决于特定参数,还取决于运行的系统环境,例如考虑c程序中的malloc(n),其堆内存的实际分配量取决于运行环境(取决于对齐、当前第一个可用空闲槽等因素),并且在执行之前上述均是不确定的,则分配可能失败,也可能分配大于n的内存(例如,由于对齐因素)。本发明通过采用静态与动态结合的方式,关注的资源是操作系统系统调用api或库函数提供给应用程序的资源的抽象,包括堆内存、栈内存、文件句柄等,将程序分析划分为静态分析与动态分析,采用动态和静态相结合的以资源使用感知为指导的模糊测试方式,实现程序资源消耗量上界的预测,不仅可使得能够适用于现实世界的大规模复杂程序,而且还可以大大提高程序资源消耗量上界预测的精度。
[0071]
上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献