测试函数输出数据溢出的方法、终端设备及存储介质与流程

文档序号:17925122发布日期:2019-06-15 00:21阅读:200来源:国知局
测试函数输出数据溢出的方法、终端设备及存储介质与流程

本发明属于程序测试技术领域,尤其涉及一种测试函数输出数据溢出的方法、终端设备及存储介质。



背景技术:

在各种计算机软件的开发过程中,内存溢出是较容易发生的一种问题,函数输出数据溢出是内存溢出的主要形式之一。内存溢出最常见表现形式是死机,包括程序陷入死循环、数据冒犯异常死机、预取值异常死机等。内存溢出还有其他的表现形式,例如变量偶尔或始终被改写、读取到的数据偶尔或始终不正确。

常规的内存溢出测试主要通过观察函数被调用后,系统有无异常(例如,数据访问异常、取指异常)来间接和被动地进行溢出测试。由于内存溢出发生后,有时系统并无明显的异常表现,使得这类内存溢出测试方法并不可靠。还有的方法是依靠内存溢出检测工具,对程序源码进行扫描和检测。这种方法也存在一定局限性,它对动态运行状态下发生的内存溢出缺陷不容易检测出来。



技术实现要素:

有鉴于此,本发明实施例提供了一种测试函数输出数据溢出的方法、终端设备及存储介质,以解决现有技术对函数输出数据溢出测试存在的测试可靠性较低的问题。

根据第一方面,本发明实施例提供了一种测试函数输出数据溢出的方法,包括:随机生成第一对比数据和第二对比数据;将所述第一对比数据写入预设的第一对比内存空间,将所述第二对比数据写入预设的第二对比内存空间;所述第一对比内存空间和所述第二对比内存空间分别与预设的目标内存空间相邻,所述目标内存空间用于存储目标函数的一个输出数据;调用并执行所述目标函数;读取所述第一对比内存空间中的第一测试数据和所述第二对比内存空间中的第二测试数据;当所述第一测试数据与所述第一对比数据不相同,和/或所述第二测试数据与所述第二对比数据不相同时,确定所述目标函数存在输出数据溢出。

本发明实施例提供的测试函数输出数据溢出的方法,通过检测目标函数执行后,与其输出数据的目标内存空间相邻的两个对比内存空间中,是否出现数据篡改,实现对目标函数输出数据的溢出测试。由于函数输出数据溢出通常发生在输出变量的邻近内存区域,故通过严密地监测输出变量的前后邻近内存区域是否被改写,即可实现对输出数据溢出的检测和判定。本发明实施例提供的测试函数输出数据溢出的方法,可以实时检测出无明显异常表现的内存溢出,并且可以在程序运行的过程中对函数输出数据溢出进行动态检测,解决了现有技术中对函数输出数据溢出测试存在的测试可靠性较低的问题。

结合第一方面,在第一方面第一实施方式中,所述函数输出数据溢出测试方法还包括:当所述第一测试数据与所述第一对比数据相同,且所述第二测试数据与所述第二对比数据也相同时,获取测试计数;当所述测试计数达到预设的计数阈值时,确定所述目标函数不存在输出数据溢出。

本发明实施例提供的测试函数输出数据溢出的方法,通过统计测试计数,可以实现对函数输出数据溢出的多次测试。在本发明实施例提供的测试函数输出数据溢出的方法中,虽然在每次调用目标函数之前分别在第一对比内存空间和第二对比内存空间存储了随机数作为第一对比数据和第二对比数据,但仍存在溢出改写的内容恰好与随机数相同的情况。通过多次测试,且每次测试均更换随机数的方式,可以有效降低对函数输出数据溢出漏测的概率。

结合第一方面第一实施方式,在第一方面第二实施方式中,所述函数输出数据溢出测试方法还包括:当所述测试计数未达到预设的计数阈值时,重复执行所述随机生成第一对比数据和第二对比数据;将所述第一对比数据写入预设的第一对比内存空间,将所述第二对比数据写入预设的第二对比内存空间;所述第一对比内存空间和所述第二对比内存空间分别与预设的目标内存空间相邻,所述目标内存空间用于存储目标函数的一个输出数据;调用并执行所述目标函数;读取所述第一对比内存空间中的第一测试数据和所述第二对比内存空间中的第二测试数据的步骤,直至所述第一测试数据与所述第一对比数据不相同,和/或所述第二测试数据与所述第二对比数据不相同时,确定所述目标函数存在输出数据溢出;或者,直至所述测试计数达到预设的计数阈值时,确定所述目标函数不存在输出数据溢出。

本发明实施例提供的测试函数输出数据溢出的方法,在测试计数未达到预设的计数阈值时,反复对目标函数进行输出数据溢出测试,能够避免漏检,提高了溢出测试的可靠性。

根据第二方面,本发明实施例提供了一种测试函数多个输出数据溢出的方法,包括:根据第一方面或第一方面任一实施方式所述的测试函数输出数据溢出的方法,分别对目标函数的各个输出数据进行溢出测试;当所述目标函数的任一输出数据存在溢出时,确定所述目标函数存在输出数据溢出。

本发明实施例提供的测试函数多个输出数据溢出的方法,通过多次调用目标函数,并对目标函数的各个输出数据逐一进行溢出测试,能够对目标函数进行全面的溢出检测,不仅可以实时检测出无明显异常表现的内存溢出,并且可以在程序运行的过程中对函数输出数据溢出进行动态检测,解决了现有技术中对函数输出数据溢出测试存在的测试可靠性较低的问题。

结合第二方面,在第二方面第一实施方式中,所述测试函数多个输出数据溢出的方法还包括:当所述目标函数的各个输出数据均不存在溢出时,确定所述目标函数不存在输出数据溢出。

本发明实施例提供的测试函数多个输出数据溢出的方法,分别对目标函数的各个输出数据进行溢出测试,并判定输出数据均通过溢出测试的目标函数不存在输出数据溢出缺陷,能够可靠实现包含多个输出变量的函数输出溢出测试。

根据第三方面,本发明实施例提供了一种并行测试函数多个输出数据溢出的方法,包括:分别为目标函数的各个输出数据随机生成一对对比数据;每对所述对比数据均包括第一对比数据和第二对比数据;将所述对比数据分别写入对应的对比内存空间;每个所述对比内存空间包括用于存储所述第一对比数据的第一对比内存空间,以及用于存储所述第二对比数据的第二对比内存空间;所述第一对比内存空间和所述第二对比内存空间分别与用于存储对应的所述输出数据的内存空间相邻;调用并执行所述目标函数;读取各个所述第一对比内存空间中的第一测试数据,以及各个所述第二对比内存空间中的第二测试数据;当任一所述第一测试数据与对应的所述第一对比数据不相同,和/或任一所述第二测试数据与对应的所述第二对比数据不相同时,确定所述目标函数存在输出数据溢出。

本发明实施例提供的并行测试函数多个输出数据溢出的方法,仅需对目标函数进行一次调用,通过检测目标函数执行后,与其各个输出数据的目标内存空间相邻的两个对比内存空间中,是否出现数据篡改,实现对目标函数输出数据的溢出测试。由于函数输出数据溢出通常发生在输出变量的邻近内存区域,故通过严密地监测输出变量的前后邻近内存区域是否被改写,即可实现对输出数据溢出的检测和判定。本发明实施例提供的并行测试函数多个输出数据溢出的方法,可以实时检测出无明显异常表现的内存溢出,并且可以在程序运行的过程中对函数输出数据溢出进行动态检测,解决了现有技术中对函数输出数据溢出测试存在的测试可靠性较低的问题。

结合第三方面,在第三方面第一实施方式中,所述并行测试函数多个输出数据溢出的方法还包括:当任一所述第一测试数据与对应的所述第一对比数据相同,且任一所述第二测试数据与对应的所述第二对比数据也相同时,获取测试计数;当所述测试计数达到预设的计数阈值时,确定所述目标函数不存在输出数据溢出。

本发明实施例提供的并行测试函数多个输出数据溢出的方法,通过统计测试计数,可以实现对函数输出数据溢出的多次测试。在本发明实施例提供的并行测试函数多个输出数据溢出的方法中,虽然在每次的溢出测试中,均在调用目标函数之前分别在第一对比内存空间和第二对比内存空间存储了随机数作为第一对比数据和第二对比数据,但仍存在溢出改写的内容恰好与随机数相同的情况。通过多次测试,且每次测试均更换随机数的方式,可以有效降低对函数输出数据溢出漏测的概率。

结合第三方面第一实施方式,在第三方面第二实施方式中,所述并行测试函数多个输出数据溢出的方法还包括:当所述测试计数未达到预设的计数阈值时,重复执行所述分别为目标函数的各个输出数据随机生成一对对比数据;每对所述对比数据均包括第一对比数据和第二对比数据;将所述对比数据分别写入对应的对比内存空间;每个所述对比内存空间包括用于存储所述第一对比数据的第一对比内存空间,以及用于存储所述第二对比数据的第二对比内存空间;所述第一对比内存空间和所述第二对比内存空间分别与用于存储对应的所述输出数据的内存空间相邻;调用并执行所述目标函数;读取各个所述第一对比内存空间中的第一测试数据,以及各个所述第二对比内存空间中的第二测试数据的步骤,直至任一所述第一测试数据与对应的所述第一对比数据不相同,和/或任一所述第二测试数据与对应的所述第二对比数据不相同时,确定所述目标函数存在输出数据溢出;或者,直至所述测试计数达到预设的计数阈值时,确定所述目标函数不存在输出数据溢出。

本发明实施例提供的并行测试函数多个输出数据溢出的方法,在测试计数未达到预设的计数阈值时,反复对目标函数进行输出数据溢出测试,能够避免漏检,提高了溢出测试的可靠性。

根据第四方面,本发明实施例提供了一种测试函数输出数据溢出的装置,包括:第一对比数据生成单元,用于随机生成第一对比数据和第二对比数据;以及用于将所述第一对比数据写入预设的第一对比内存空间,将所述第二对比数据写入预设的第二对比内存空间;所述第一对比内存空间和所述第二对比内存空间分别与预设的目标内存空间相邻,所述目标内存空间用于存储目标函数的一个输出数据;第一函数执行单元,用于调用并执行所述目标函数;第一判断单元,用于读取所述第一对比内存空间中的第一测试数据和所述第二对比内存空间中的第二测试数据;当所述第一测试数据与所述第一对比数据不相同,和/或所述第二测试数据与所述第二对比数据不相同时,所述第一判断单元还用于确定所述目标函数存在输出数据溢出。

根据第五方面,本发明实施例提供了一种测试函数多个输出数据溢出的装置,包括:测试单元,用于根据第一方面或第一方面任一实施方式所述的测试函数输出数据溢出的方法,分别对目标函数的各个输出数据进行溢出测试;第二判断单元,当所述目标函数的任一输出数据存在溢出时,用于确定所述目标函数存在输出数据溢出。

根据第六方面,本发明实施例提供了一种并行测试函数多个输出数据溢出的装置,包括:第二对比数据生成单元,用于分别为目标函数的各个输出数据随机生成一对对比数据;每对所述对比数据均包括第一对比数据和第二对比数据;以及用于将所述对比数据分别写入对应的对比内存空间;每个所述对比内存空间包括用于存储所述第一对比数据的第一对比内存空间,以及用于存储所述第二对比数据的第二对比内存空间;所述第一对比内存空间和所述第二对比内存空间分别与用于存储对应的所述输出数据的内存空间相邻;第二函数执行单元,用于调用并执行所述目标函数;第三判断单元,用于读取各个所述第一对比内存空间中的第一测试数据,以及各个所述第二对比内存空间中的第二测试数据;当任一所述第一测试数据与对应的所述第一对比数据不相同,和/或任一所述第二测试数据与对应的所述第二对比数据不相同时,所述第三判断单元还用于确定所述目标函数存在输出数据溢出。

根据第七方面,本发明实施例提供了一种终端设备,包括:包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面或第一方面任一实施方式所述方法的步骤;或者,所述处理器执行所述计算机程序时实现如第二方面或第二方面任一实施方式方法的步骤;或者,所述处理器执行所述计算机程序时实现如第三方面或第三方面任一实施方式所述方法的步骤。

根据第八方面,本发明实施例的提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面或第一方面任一实施方式所述方法的步骤;或者,所述计算机程序被处理器执行时实现如第二方面或第二方面任一实施方式所述方法的步骤;或者,所述计算机程序被处理器执行时实现如第三方面或第三方面任一实施方式所述方法的步骤。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例提供的测试函数输出数据溢出的方法的一个具体示例的实现流程示意图;

图2是本发明实施例提供的测试函数多个输出数据溢出的方法的一个具体示例的实现流程示意图;

图3是本发明实施例提供的并行测试函数多个输出数据溢出的方法的一个具体示例的实现流程示意图;

图4是本发明实施例提供的测试函数输出数据溢出的装置的一个具体示例的结构示例图;

图5是本发明实施例提供的测试函数多个输出数据溢出的装置的一个具体示例的结构示例图;

图6是本发明实施例提供的并行测试函数多个输出数据溢出的装置的一个具体示例的结构示例图;

图7是本发明实施例提供的终端设备的示意图。

具体实施方式

以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本发明实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。

为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。

在各种计算机软件的开发过程中,内存溢出是较容易发生的一种问题,函数输出数据溢出是内存溢出的主要形式之一。这里的函数,是指计算机软件中完成某个特定任务并可被其它程序调用的子程序单元。本发明实施例关注的函数主要是api(applicationprogramminginterface应用编程接口,简称api)函数,还可以是用于在不同模块、不同软件层之间传递数据的函数。由于函数输出数据溢出通常发生在输出变量的邻近内存区域,故通过严密地监测输出变量的前后邻近内存区域是否被改写,即可实现对输出数据溢出的检测和判定。

在一些实施例中,如图1所示,可以通过以下步骤实现对函数输出数据溢出的测试:

步骤s101:随机生成第一对比数据和第二对比数据。在一具体实施方式中,可以分别生成随机数据r1和r2,并设定r1为第一对比数据,r2为第二对比数据。将第一对比数据r1和第二对比数据r2均存入备份文件中,以备后续步骤使用。

步骤s102:将第一对比数据写入预设的第一对比内存空间,将第二对比数据写入预设的第二对比内存空间。第一对比内存空间和第二对比内存空间分别与用于存储目标函数的一个输出数据的预设的目标内存空间相邻。

在一具体实施方式中,可以分配一段用于容纳目标变量(即目标函数的一个输出数据)的目标内存空间m,将目标变量存放到m之中,并在目标内存空间m的前后分别留有空闲内存空间s1和s2。s1即第一对比内存空间;s2即第二对比内存空间。不妨设s1为位于目标内存空间m前方并与目标内存空间m相邻的对比内存空间,s2为位于目标内存空间m后方并与目标内存空间m相邻的对比内存空间。在实际应用中,可以将步骤s101中随机生成的第一对比数据r1写入第一对比内存空间s1中,将步骤s101中随机生成的第二对比数据r2写入第二对比内存空间s2中。

具体的,m应等于目标变量的长度。例如,当目标变量的长度为16字节时,可以选取m的长度为16字节,并在m的前后分别选取1000字节的内存空间作为s1和s2。此外,由于实际应用中函数输出数据的溢出通常会从目标内存空间向后方溢出,即位于目标内存空间m后方的第二对比空间s2中,出现数据溢出的概率更高。为了提高内存使用效率,可以为第二对比空间s2分配更多的内存,即可以使s2的长度大于s1的长度。

步骤s103:调用并执行目标函数。在一具体实施方式中,可以以目标变量为参数来调用和执行目标函数。本发明实施例中,目标函数的参数具有输出或先输入后输出的属性。

在软件工程中,当函数需要提交给外部或其它程序员使用时,应提供函数接口描述文档。在函数接口描述文档中会对函数中的各个参数进行描述,其中,涉及参数的输入和输出属性。函数中任一参数的属性均为输入、输出或先输入后输出中的一种。

当目标变量具有输入和输出双重属性时,在调用目标函数前,应为该目标变量赋输入值;执行目标函数后,将该目标变量对应的输出数据存放到目标内存空间m中。

步骤s104:读取第一对比内存空间中的第一测试数据和第二对比内存空间中的第二测试数据。在一具体实施方式中,可以将目标函数运行后,读取到的第一对比内存空间s1中的第一测试数据记为r1,将读取到的第二对比内存空间s2中的第二测试数据记为r2。

步骤s105:判断第一测试数据与第一对比数据是否相同。在一具体实施方式中,可以将第一对比内存空间s1中的第一测试数据r1,与备份文件中存储的第一对比数据r1进行比对。当第一测试数据r1与第一对比数据r1不相同时,执行步骤s107;当第一测试数据r1与第一对比数据r1相同时,执行步骤s106。

步骤s106:判断第二测试数据与第二对比数据是否相同。在一具体实施方式中,可以将第二对比内存空间s2中的第二测试数据r2,与备份文件中存储的第二对比数据r2进行比对。当第二测试数据r2与第二对比数据r2不相同时,执行步骤s107;当第二测试数据r2与第二对比数据r2相同时,可选的,可以执行步骤s108。

步骤s107:确定目标函数存在输出数据溢出。函数的输出数据溢出通常发生在循环操作时,出现失误或额外地多写入数据。当失误或额外多写入的数据是按照从前往后的顺序写入内存空间时,即从地址低端往高端写入内存空间时,那么多写入的数据将紧跟在目标变量的后面;当失误或额外多写入的数据是按照从后往前的顺序写入内存空间时,即从地址高端往低端写入内存空间时,那么多写入的数据紧跟在目标变量的前面。因此,通过将内存空间s1中的测试数据(包括r1和r2)与备份文件数据(包括r1和r2)分别进行比对,即可判断目标函数是否存在数据溢出的情况。当第一测试数据r1与第一对比数据r1不相同,和/或第二测试数据r2与第二对比数据r2不相同时,均能够确定目标函数存在输出数据溢出。

此外,也可能存在多写入的数据位于与目标变量不相干的地方,该情况发生的概率极低,不属于本发明实施例所要解决的技术问题。

为了对同一目标函数进行多次溢出测试,可选的,可以增设以下步骤:

步骤s108:获取测试计数。当第一测试数据r1与第一对比数据r1相同,且第二测试数据r2与第二对比数据r2也相同时,可以判定目标函数通过了本次溢出测试。在本发明实施例中,虽然在溢出测试之初,在第一对比内存空间s1和第二对比内存空间s2中均采用了随机数来填充,但仍然存在溢出改写的内容恰好与随机数相同的情况。因此,需要通过多次测试并在每次测试之初均变更随机数的方式,将漏测的概率降到接近于零的程度。

在一具体实施方式中,在对目标函数进行溢出测试之前,可以将测试计数置零;在每次测试后,当第一测试数据r1与第一对比数据r1相同,且第二测试数据r2与第二对比数据r2也相同时,可以将测试计数增一,表明本次测试成功。

步骤s109:判断测试计数是否达到预设的计数阈值。当测试计数达到预设的计数阈值时,执行步骤s110;当测试计数未达到预设的计数阈值时,返回步骤s101,直至第一测试数据r1与第一对比数据r1不相同,和/或第二测试数据r2与第二对比数据r2不相同时,确定目标函数存在输出数据溢出;或者,直至测试计数达到预设的计数阈值时,确定目标函数不存在输出数据溢出。

步骤s110:确定目标函数不存在输出数据溢出。在对目标函数的输出数据进行溢出测试的过程中,需要确保重复测试的全部测试结果均通过,保证测试通过率达到100%,才表明该目标函数不存在数据溢出问题;一旦出现测试不通过的情况,则立即终止测试,并判定该目标函数存在数据溢出问题。

在步骤s110确定目标函数不存在输出数据溢出,或步骤s107确定目标函数存在输出数据溢出之后,还可以释放在测试之初分配的内存空间m、s1及s2,从而终止测试.

需要说明的是,本发明实施例不对重复测试的次数,即预设的计数阈值进行限制,用户可以根据测试时间、测试人手以及预期达到的质量等级来自行权衡确定计数阈值。在一具体实施方式中,可以将计数阈值设定为200。

本发明实施例提供的测试函数输出数据溢出的方法,通过检测目标函数执行后,与其输出数据的目标内存空间相邻的两个对比内存空间中,是否出现数据篡改,实现对目标函数输出数据的溢出测试。由于函数输出数据溢出通常发生在输出变量的邻近内存区域,故通过严密地监测输出变量的前后邻近内存区域是否被改写,即可实现对输出数据溢出的检测和判定。本发明实施例提供的测试函数输出数据溢出的方法,可以实时检测出无明显异常表现的内存溢出,并且可以在程序运行的过程中对函数输出数据溢出进行动态检测,解决了现有技术中对函数输出数据溢出测试存在的测试可靠性较低的问题。

本发明实施例还提供了一种测试函数多个输出数据溢出的方法,如图2所示,该方法可以包括以下步骤:

步骤s201:分别对目标函数的各个输出数据进行溢出测试。在一具体实施方式中,可以根据图1所示的测试函数输出数据溢出的方法,分别对目标函数的各个输出数据进行溢出测试。

步骤s202:判断目标函数的任一输出数据是否存在溢出。当目标函数的任一输出数据存在溢出时,执行步骤s203;当目标函数的各个输出数据均不存在溢出时,执行步骤s204。

步骤s203:确定目标函数存在输出数据溢出。

步骤s204:确定目标函数不存在输出数据溢出。

对多个输出数据的溢出测试,可以看成是对每个输出数据溢出测试的叠加。在图2所示的测试函数多个输出数据溢出的方法中,将单个输出变量的测试步骤先后执行多次,通过串行测试的方式实现目标函数中多个输出数据的溢出测试。

例如,某一目标函数fun()有两个输出变量o1和o2,其原型为intfun(char*o1,char*o2);在对该目标函数进行溢出测试时,先依照图1所示的单个输出变量的测试步骤,对输出变量o1进行测试;再依照图1所示的单个输出变量的测试步骤,对输出变量o2进行测试。在图2所示的测试函数多个输出数据溢出的方法中,需要根据输出数据的数量对目标函数进行多次调用。

本发明实施例提供的测试函数多个输出数据溢出的方法,通过多次调用目标函数,并对目标函数的各个输出数据逐一进行溢出测试,能够对目标函数进行全面的溢出检测,不仅可以实时检测出无明显异常表现的内存溢出,并且可以在程序运行的过程中对函数输出数据溢出进行动态检测,解决了现有技术中对函数输出数据溢出测试存在的测试可靠性较低的问题。

本发明实施例还提供了一种并行测试函数多个输出数据溢出的方法,如图3所示,该方法可以包括以下步骤:

步骤s301:分别为目标函数的各个输出数据随机生成一对对比数据。在一具体实施方式中,每对对比数据均包括第一对比数据r1和第二对比数据r2。将各个第一对比数据r1和第二对比数据r2均存入备份文件中,以备后续步骤使用。

步骤s302:将对比数据分别写入对应的对比内存空间。在一具体实施方式中,每个对比内存空间均包括用于存储第一对比数据r1的第一对比内存空间s1,以及用于存储第二对比数据r2的第二对比内存空间s2。第一对比内存空间s1和第二对比内存空间s2分别与用于存储对应的输出数据的内存空间m相邻。

步骤s303:调用并执行目标函数。

步骤s304:读取各个第一对比内存空间中的第一测试数据,以及各个第二对比内存空间中的第二测试数据。在一具体实施方式中,在执行步骤s303调用并执行目标函数后,可以依次读取各个第一对比内存空间s中的第一测试数据r1,以及各个第二对比内存空间s2中的第二测试数据r2。

步骤s305:判断任一第一测试数据与对应的第一对比数据是否相同。当任一第一测试数据r1与对应的第一对比数据r1不相同时,执行步骤s307;当任一第一测试数据r1与对应的第一对比数据r1均相同时,执行步骤s306:

步骤s306:判断任一第二测试数据与对应的第二对比数据是否相同。当任一第二测试数据r2与对应的第二对比数据r2不相同时,执行步骤s307;当任一第二测试数据r2与对应的第二对比数据r2均相同时,可选的,可以执行步骤s308。

步骤s307:确定目标函数存在输出数据溢出。当任一第一测试数据r1与对应的第一对比数据r1不相同,和/或任一第二测试数据r2与对应的第二对比数据r2不相同时,均能够确定目标函数存在输出数据溢出。

为了对同一目标函数进行多次并行溢出测试,可选的,可以增设以下步骤:

步骤s308:获取测试计数。当任一第一测试数据r1均与对应的第一对比数据r1相同,且任一第二测试数据r2均与对应的第二对比数据r2也相同时,可以判定目标函数通过了本次溢出测试。在本发明实施例中,虽然在溢出测试之初,在各个第一对比内存空间s1和各个第二对比内存空间s2中均采用了随机数来填充,但仍然存在溢出改写的内容恰好与随机数相同的情况。因此,需要通过多次测试并在每次测试之初均变更随机数的方式,将漏测的概率降到接近于零的程度。

步骤s309:判断测试计数是否达到预设的计数阈值。当测试计数达到预设的计数阈值时,执行步骤s310:当所测试计数未达到预设的计数阈值时,返回步骤s301,直至任一第一测试数据r1与对应的第一对比数据r1不相同,和/或任一第二测试数据r2与对应的第二对比数据r2不相同时,确定标函数存在输出数据溢出;或者,直至测试计数达到预设的计数阈值时,确定目标函数不存在输出数据溢出。

步骤s310:确定目标函数不存在输出数据溢出。

在图3所示的并行测试函数多个输出数据溢出的方法中,仅通过对目标函数进行一次调用。即实现了对该目标函数中多个输出变量的并行溢出检测,具有较高的检测效率。图3所示的并行测试函数多个输出数据溢出的方法,将图1所示的单个输出变量测试方法中的各个步骤均进行了循环扩充,每个步骤中循环操作的次数就是输出变量的个数。

例如,某一目标函数有n个输出变量,则步骤s301中随机生成n对对比数据;在步骤s302中分配n对对比内存空间,每对对比内存空间均包括第一对比内存空间s1和第二对比内存空间s2;在步骤s303中将n个输出变量均作为目标函数的接口参数,但调用函数仅需一次。

本发明实施例提供的并行测试函数多个输出数据溢出的方法,仅需对目标函数进行一次调用,通过检测目标函数执行后,与其各个输出数据的目标内存空间相邻的两个对比内存空间中,是否出现数据篡改,实现对目标函数输出数据的溢出测试。由于函数输出数据溢出通常发生在输出变量的邻近内存区域,故通过严密地监测输出变量的前后邻近内存区域是否被改写,即可实现对输出数据溢出的检测和判定。本发明实施例提供的并行测试函数多个输出数据溢出的方法,可以实时检测出无明显异常表现的内存溢出,并且可以在程序运行的过程中对函数输出数据溢出进行动态检测,解决了现有技术中对函数输出数据溢出测试存在的测试可靠性较低的问题。

应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。

本发明实施例还提供了一种测试函数输出数据溢出的装置,如图4所示,该装置可以包括:第一对比数据生成单元401、第一函数执行单元402和第一判断单元403。

其中,第一对比数据生成单元401用于随机生成第一对比数据和第二对比数据;以及用于将第一对比数据写入预设的第一对比内存空间,将第二对比数据写入预设的第二对比内存空间;第一对比内存空间和第二对比内存空间分别与预设的目标内存空间相邻,目标内存空间用于存储目标函数的一个输出数据;其具体的工作过程可参见上述方法实施例中步骤s101至步骤s102所述。

第一函数执行单元402用于调用并执行目标函数;其具体的工作过程可参见上述方法实施例中步骤s103所述。

第一判断单元403用于读取第一对比内存空间中的第一测试数据和第二对比内存空间中的第二测试数据;其具体的工作过程可参见上述方法实施例中步骤s104所述。

当第一测试数据与第一对比数据不相同,和/或第二测试数据与第二对比数据不相同时,第一判断单元403还用于确定目标函数存在输出数据溢出;其具体的工作过程可参见上述方法实施例中步骤s105至步骤s107所述。

可选的,在本发明实施例提供的测试函数输出数据溢出的装置中,还可以包括第一测试计数单元404。

当第一测试数据与第一对比数据相同,且第二测试数据与第二对比数据也相同时,第一测试计数单元404可以用于获取测试计数;其具体的工作过程可参见上述方法实施例中步骤s108所述。

第一测试计数单元404还可以用于判断测试计数是否达到预设的计数阈值;其具体的工作过程可参见上述方法实施例中步骤s109所述。

当测试计数达到预设的计数阈值时,第一判断单元403还用于确定目标函数不存在输出数据溢出;其具体的工作过程可参见上述方法实施例中步骤s110所述。

当测试计数未达到预设的计数阈值时,第一测试计数单元404还可以用于向第一对比数据生成单元401反馈对应信息,从而指示第一对比数据生成单元401重复启动对目标函数的溢出测试。

本发明实施例还提供了一种测试函数多个输出数据溢出的装置,如图5所示,该装置可以包括:测试单元501和第二判断单元502。

其中,测试单元501用于根据图1所示的测试函数输出数据溢出的方法,分别对目标函数的各个输出数据进行溢出测试;其具体的工作过程可参见上述方法实施例中步骤s201所述。

当目标函数的任一输出数据存在溢出时,第二判断单元502用于确定目标函数存在输出数据溢出;其具体的工作过程可参见上述方法实施例中步骤s202和步骤s203所述。

可选的,当目标函数的任一输出数据均不存在溢出时,第二判断单元502还可以用于确定目标函数不存在输出数据溢出;其具体的工作过程可参见上述方法实施例中步骤s202和步骤s204所述。

本发明实施例还提供了一种并行测试函数多个输出数据溢出的装置,如图6所示,该装置可以包括:第二对比数据生成单元601、第二函数执行单元602和第三判断单元603。

其中,第二对比数据生成单元601用于分别为目标函数的各个输出数据随机生成一对对比数据;每对对比数据均包括第一对比数据和第二对比数据;其具体的工作过程可参见上述方法实施例中步骤s301所述。

第二对比数据生成单元601还用于将对比数据分别写入对应的对比内存空间;每个对比内存空间包括用于存储所述第一对比数据的第一对比内存空间,以及用于存储第二对比数据的第二对比内存空间;第一对比内存空间和第二对比内存空间分别与用于存储对应的输出数据的内存空间相邻;其具体的工作过程可参见上述方法实施例中步骤s302所述。

第二函数执行单元602用于调用并执行目标函数;其具体的工作过程可参见上述方法实施例中步骤s303所述。

第三判断单元603用于读取各个第一对比内存空间中的第一测试数据,以及各个第二对比内存空间中的第二测试数据;其具体的工作过程可参见上述方法实施例中步骤s304所述。

当任一第一测试数据与对应的第一对比数据不相同,和/或任一第二测试数据与对应的第二对比数据不相同时,第三判断单元603还用于确定目标函数存在输出数据溢出;其具体的工作过程可参见上述方法实施例中步骤s305至步骤s307所述。

可选的,在本发明实施例提供的并行测试函数多个输出数据溢出的装置中,还可以包括第二测试计数单元604。

当各个第一测试数据均与对应的第一对比数据相同,且各个第二测试数据也均与对应的第二对比数据相同时,第二测试计数单元604可以用于获取测试计数;其具体的工作过程可参见上述方法实施例中步骤s308所述。

第二测试计数单元604还可以用于判断测试计数是否达到预设的计数阈值;其具体的工作过程可参见上述方法实施例中步骤s309所述。

当测试计数达到预设的计数阈值时,第二判断单元603还用于确定目标函数不存在输出数据溢出;其具体的工作过程可参见上述方法实施例中步骤s310所述。

当测试计数未达到预设的计数阈值时,第二测试计数单元604还可以用于向第二对比数据生成单元601反馈对应信息,从而指示第二对比数据生成单元601重复启动对目标函数的溢出测试。

图7是本发明一实施例提供的终端设备的示意图。如图7所示,该实施例的终端设备700包括:处理器701、存储器702以及存储在所述存储器702中并可在所述处理器701上运行的计算机程序703,例如测试函数输出数据溢出程序。所述处理器701执行所述计算机程序703时实现上述各个方法实施例中的步骤,例如图1所示的步骤s101至步骤s110。或者,所述处理器701执行所述计算机程序703时实现上述各装置实施例中各模块/单元的功能,例如图4所示第一对比数据生成单元401、第一函数执行单元402和第一判断单元403的功能。

所述计算机程序703可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器702中,并由所述处理器701执行,以完成本发明。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序703在所述终端设备700中的执行过程。例如,所述计算机程序703可以被分割成同步模块、汇总模块、获取模块、返回模块(虚拟装置中的模块)。

所述终端设备700可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述终端设备可包括,但不仅限于,处理器701、存储器702。本领域技术人员可以理解,图7仅仅是终端设备700的示例,并不构成对终端设备700的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述终端设备还可以包括输入输出设备、网络接入设备、总线等。

所称处理器701可以是中央处理单元(centralprocessingunit,cpu),还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现成可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

所述存储器702可以是所述终端设备700的内部存储单元,例如终端设备700的硬盘或内存。所述存储器702也可以是所述终端设备700的外部存储设备,例如所述终端设备700上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,所述存储器702还可以既包括所述终端设备700的内部存储单元也包括外部存储设备。所述存储器702用于存储所述计算机程序以及所述终端设备所需的其他程序和数据。所述存储器702还可以用于暂时地存储已经输出或者将要输出的数据。

所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

在本发明所提供的实施例中,应该理解到,所揭露的装置/终端设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/终端设备实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。

以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1