CN113297069A - 一种基于目标驱动的软件测试方法和装置 - Google Patents
一种基于目标驱动的软件测试方法和装置 Download PDFInfo
- Publication number
- CN113297069A CN113297069A CN202110479754.XA CN202110479754A CN113297069A CN 113297069 A CN113297069 A CN 113297069A CN 202110479754 A CN202110479754 A CN 202110479754A CN 113297069 A CN113297069 A CN 113297069A
- Authority
- CN
- China
- Prior art keywords
- function
- functions
- test
- unit
- target
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 38
- 238000013522 software testing Methods 0.000 title claims abstract description 10
- 230000006870 function Effects 0.000 claims abstract description 185
- 238000012360 testing method Methods 0.000 claims abstract description 159
- 238000012795 verification Methods 0.000 claims abstract description 8
- 238000004590 computer program Methods 0.000 claims description 6
- 238000010276 construction Methods 0.000 claims description 4
- 238000005314 correlation function Methods 0.000 claims description 4
- 230000001960 triggered effect Effects 0.000 claims description 2
- 230000009897 systematic effect Effects 0.000 abstract description 2
- 238000011161 development Methods 0.000 description 3
- 238000004880 explosion Methods 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 2
- 230000001419 dependent effect Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000012423 maintenance Methods 0.000 description 2
- 238000010998 test method Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000012790 confirmation Methods 0.000 description 1
- 230000002596 correlated effect Effects 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000002243 precursor Substances 0.000 description 1
- 238000010200 validation analysis Methods 0.000 description 1
Images
Classifications
-
- 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
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)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种基于目标驱动的软件测试方法和装置。该方法首先执行系统级的concolic测试以收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;然后在扩展单元中使用单元测试发现潜在错误;然后在系统级的concolic测试中使用目标驱动的搜索策略验证潜在错误是否在全局存在。本发明通过计算函数依赖关系的方式将目标函数拓展为一组测试单元,使由于缺少上下文带来的误报大大降低;通过先在局部进行错误搜索,再将潜在错误信息放入到系统级的concolic执行中进行验证,降低了对目标函数进行测试的难度,且提高了测试的准确度。
Description
技术领域
本发明属于软件安全测试技术领域,具体涉及一种基于目标驱动的软件测试方法和装置。
背景技术
单元测试是一种软件测试方法,通过该方法可以测试源代码的每个单元以确定它们是否适合使用。单元是最小的可测试软件组件,通常执行单个内聚功能。有人认为任何走出一个函数的测试,都不是单元测试,其实,对“单元”的定义取决于自己。如果你正在使用函数式编程,一个单元最有可能指的是一个函数,你的单元测试将使用不同的参数调用这个函数,并断言它是否返回了期待的结果;在面向对象语言里,从一个单一的方法到一整个的类都可以是一个单元。单元测试就是指对这个最小可测试组件进行检查和验证。
单元测试可以测试源代码的每个单元以确定它们的可用性和安全性。单元测试是保证产品质量的必要步骤,开发人员可以利用它来发现并纠正源代码中的缺陷。如果单元测试有效执行,可能会在提高产品质量、减少开发时间/成本、优化源代码设计以及提高维护难度等方面获得重大收益。通常,单元测试需要测试人员建立测试驱动程序,并用该驱动程序调用被测试单元,它根据已知值或以前执行同一测试(回归测试)的结果来检查返回的结果。
单元测试的弱点在于,因为单元测试使用近似的符号输入和返回值来表示单元的上下文,因此单元中发现的大多数错误都是由不可行的路径引起的错误警报,这意味着这些错误警报在系统级别不存在。而“单元”的定义又影响着误报率,例如,当以一个函数为单元时就比以该函数为中心加入一层函数调用所产生的误报高,并且该误报会随着加入的函数而减少,直到极限情况下以整个程序为单元,此时的误报为0,但随着单元范围的扩大,程序的路径更将复杂且调用深度也在不断增加,这使得动态的单元测试性能也在不断的降低。此外,由于单元测试有大量潜在的错误报告,需要将局部的路径信息逆向推导到全局来确认这些报告中各个错误在完整的程序中是否,但要对潜在的错误进行确认很困难,这往往给测试工程师带来大量的手动工作,需要花费大量的时间。
Concolic测试是符号执行的一种形式,它已经成为一种有效的软件测试方法。Concolic测试的实质是在具体执行程序的同时,用符号值代替程序手动或随机构造的输入来运行程序。符号执行在最初允许为任意值的符号输入上运行代码,并在执行路径上收集该路径的分支条件,即当程序执行的分支基于符号值时,concolic执行引擎跟踪两个分支,在每个分支上维护一组路径约束,并利用符号求解器寻找路径约束的可满足解,获得当前路径的具体值以产生该路径的测试用例。利用生成的测试用例再次运行程序,它可以遵循相同的路径,且命中相同的错误。精心选择新分支路径可帮助测试人员系统地探索具有高代码覆盖率而又不会产生冗余的程序的执行路径。
不幸的是,由于程序中不同执行路径的数量通常与条件语句的数量成指数关系,或者在最坏的情况下甚至是无限的,因此,concolic测试存在众所周知的路径爆炸问题。尽管符号执行比传统测试倾向于研究更多数量级的输入路径,但是它通常难以耗尽所有有趣的路径。此外,由于程序的复杂性,通常不可能到达程序内部最深的代码。即使工具成功到达深层代码,它也只会考虑满足可以到达此代码的少数路径的输入值。
综上所述,现有技术存在的问题和缺点是:
单元测试的有效执行,可能会在提高产品质量、减少开发时间/成本、优化源代码设计以及降低维护难度等方面获得重大收益。但单元测试的结果难以在真实的软件中直接使用,它仍然需要现场工程师手动为每个目标单元生成必要的全局输入。自动单元测试可以对代码中的较小功能进行彻底的分析,但存在以下事实:未考虑对单元输入的某些限制或在系统级别上发生的输入之间的相关性。因此,它们通常会带来很多误报。最新的一些研究通过过滤单元测试中发现的潜在错误来减少误报,但是对潜在错误的确认仍然为测试工程师带来了很多工作量。
Concolic测试由于其高代码覆盖率而避免在同一路径上生成冗余输入,因此被广泛用于单元测试中。然而,concolic测试遭受符号执行中普遍存在的路径爆炸等困扰,因此该方法虽然没有误报,但却存在大量的漏报。尽管已经意识到全面测试软件的重要性,但是需要测试人员给出相关测试用例需要大量工作,这就导致很少能在真实的软件中付诸实践。
发明内容
本发明通过结合单元测试和concolic测试开发了称为目标驱动的concolic测试(TDCT,Target-Driven Concolic Testing)技术。TDCT通过基于函数之间的相关性构造扩展单元来减少单元测试中的误报。同时,它会自动确认在单元测试中发现的潜在错误,并通过在系统级concolic测试中采用目标驱动的搜索策略来生成系统级输入。
本发明采用的技术方案如下:
一种基于目标驱动的软件测试方法,包括以下步骤:
收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;
在扩展单元中使用单元测试发现潜在错误;
使用目标驱动的搜索策略验证潜在错误是否在全局存在。
进一步地,所述收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,包括:
以待测的目标程序和一组系统级测试初始值为输入开始concolic执行,并根据实际情况设置时间阈值;concolic引擎以获取尽可能多的系统级路径为目的,一旦到达设定的时间阈值就停止运行;同时收集已运行路径上函数的调用关系,利用函数间的调用频次,通过计算条件概率来确定函数间的相关性。
进一步地,在获得所述函数间的调用频次后,通过以下公式计算两个函数x和y之间的相关性R:
其中,F(x,y)表示函数x调用函数y的次数与函数y调用函数x的次数之和,F(x)表示函数x在所有路径中出现的次数,F(y)表示函数y在所有路径中出现的次数。
进一步地,所述通过函数的相关性构建扩展单元,包括:根据实际情况预设函数相关性阈值,根据函数相关性阈值选择满足要求的相关函数,以构建出扩展单元;对于每个目标函数f,构造一组扩展单元,其中包括f本身,满足函数相关性阈值的调用者e,及其满足函数相关性阈值的后继g。
进一步地,所述在扩展单元中使用单元测试发现潜在错误,包括:
对于被测程序P中和目标函数相关的每一组扩展单元,自动生成扩展单元的测试驱动程序driver_e和符号存根stub_g;
测试驱动程序driver_e根据调用函数e的输入类型将符号值分配给e的输入变量,然后调用函数e;执行后继函数g时,将其替换为符号存根stub_g以使返回值具有符号意义;
对扩展单元进行concolic单元测试,以探索与目标函数f相关的崩溃性错误,在此执行期间,为测试驱动程序driver_e的每一条执行路径生成一组输入,并在遇到崩溃错误时记录执行路径及该路径的约束条件。
进一步地,所述使用目标驱动的搜索策略验证潜在错误是否在全局存在,包括:
分析整个程序,以构建控制流程图CFG和函数调用图CG,使用潜在错误作为目标在生成的CFG和CG中进行标记,以获得包含潜在目标标记节点的控制流程图;
在系统级的concolic测试阶段,使用选定的输入和目标驱动的搜索策略来快速定位局部错误在全局是否存在,并得到全局路径的输入和相关的崩溃报告。
进一步地,所述目标驱动的搜索策略包括:
当执行路径运行到潜在的目标地址时,使用求解器来确定潜在错误的局部输入是否满足系统级路径约束;如果满足则继续运行此路径,直到触发全局崩溃并输出全局测试用例;如果执行路径无法在所有潜在错误中找到满足路径约束的解决方案,则丢弃该路径,并继续查找下一个能够触发单元测试条目的系统级输入。
一种采用上述方法的基于目标驱动的软件测试装置,其包括:
扩展单元构建模块,用于收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;
单元测试模块,用于在扩展单元中使用单元测试发现潜在错误;
系统级错误验证模块,用于使用目标驱动的搜索策略验证潜在错误是否在全局存在。
本发明的优点和有益效果如下:
由于单一目标函数的单元测试往往缺少变量相关的上下文,因此这种单元测试发现的局部错误中绝大部分都是误报,要在这些包含大量误报的潜在错误预警中发现真正的错误,需要现场的测试工程师完成大量的手动测试等工作,效率极其低。而本发明将单一的目标函数,通过计算函数依赖关系的方式,将目标函数拓展为一组测试单元,由于这组测试单元包含了与其依赖关系较为紧密的函数信息,这就使由于缺少上下文带来的误报大大降低。另一方面,由于系统级的concolic执行需要在被测程序中进行全局搜索,而现实世界中的程序较为复杂,又面临着路径爆炸问题,要在这样的条件下找到目标函数中存在的错误较为困难。而本发明通过先在局部进行错误搜索,再将潜在错误信息放入到系统级的concolic执行中进行验证,就降低了对目标函数进行测试的难度,且提高了测试的准确度。
附图说明
图1是TDCT总体框图。
图2是示例函数f7的拓展单元示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步详细说明。
为了充分利用单元测试和concolic测试的优势,本发明开发了一种自动测试系统TDCT(基于目标驱动的concolic测试)。TDCT通过使用函数的相关性来构建扩展单元,并使用单元测试快速识别扩展单元中的潜在错误。此外,TDCT还专注于验证这些潜在的错误,并在系统级concolic测试中生成系统级测试输入。TDCT的工作方式是在有限的时间内执行系统级的concolic测试,以收集函数之间的调用关系,并通过与目标函数的相关性来构建扩展单元。然后在扩展单元中使用单元测试来发现潜在的错误。最后,在系统级别的concolic测试中使用目标驱动的搜索策略来快速验证局部潜在错误是否在全局存在。
1.整体流程
TDCT的总体框架图见图1,包括三个模块:构建扩展单元、使用扩展单元的单元测试、系统级的错误验证。
(1)构建扩展单元:TDCT以待测的目标程序和一组系统级测试初始值为输入开始执行,并根据实际情况设置时间阈值(如1小时等),这一个阶段concolic引擎以获取尽可能多的系统级路径为目的,一旦到达设定的时间阈值就停止运行,在此过程中同时需要收集已运行路径上函数的调用关系(即函数之间的调用频次)。TDCT使用获得的函数调用频次计算函数相关性,并根据实际情况预设函数相关性阈值,从而选择满足要求的相关函数,以构建出测试单元。
(2)使用扩展单元的单元测试:TDCT为步骤(1)中构建出的测试单元生成测试驱动程序和符号存根函数,并对其运行concolic单元测试,以探索单元内存在的可疑错误,并报告单元中潜在的错误。这一步中的测试单元通过利用函数调用的相关性对测试目标进行了扩展,已经能够很好的降低单元测试的误报率。
(3)系统级的错误验证:虽然步骤(2)已经显著降低了单元测试的误报,但由于缺少全局的上下文信息,误报仍然存在,因此TDCT最终采用系统级的concolic测试,以步骤(2)报告的潜在错误为目标,实施基于目标的concolic测试,以进一步确认真实存在的错误,从而减少测试人员需要完成的大量人工操作。
2.具体实施步骤
步骤1:构建扩展单元
(1)计算函数相关性
TDCT以待测的目标程序和一组系统级测试初始值为输入开始concolic执行,并根据实际情况设置时间阈值(如1小时),这一个阶段concolic引擎以获取尽可能多的系统级路径为目的,一旦到达设定的时间阈值就停止运行,在此过程中同时需要收集已运行路径上函数的调用关系(即函数之间的调用频次),从而利用观测到的函数调用频率,通过计算条件概率来确定函数间的依赖性。通常,如果两个函数频繁地相互调用,则它们被认为具有较高的相互依赖性。如果TDCT在此处经常观察到函数f1调用f2或f2调用f1,则TDCT将f1和f2标记为高度相关。
应该注意的是,运行时间越长(设置的时间阈值越长),可能会使所获得的函数相关性越准确,但是通过实验发现,concolic测试的初始阶段对代码覆盖率的增加贡献最大,一段时间后,代码覆盖率的增加速度将急剧减小。因此,测试工程师有必要在时间成本和准确性之间取得平衡。另外,初始输入通常由开发人员提供,尽可能将可能达到目标函数的输入包括在初始输入集中,能够更准确地反映目标函数与其附近函数之间的相关性。
TDCT运行concolic执行以获取尽可能多的系统级路径,并计算函数间的调用频率。例如,假设目标是对被测程序P中的f7完成测试,并获得关于该函数错误的全局测试用例,为了尽可能减少误报以及现场测试人员的手动操作,TDCT对被测程序P进行一定时间的concolic执行,并在此过程中记录函数间的调用频次,如图2所示在concolic执行结束后存在以下测试路径:
P1:main→f1→f3→f6→f8→f10
P2:main→f1→f4→f7→f8→f10
P3:main→f1→f4→f7→f9→f11
P4:main→f2→f7→f8→f10
P5:main→f2→f7→f9→f11
P6:main→f2→f5→f7→f8→f10
P7:main→f2→f5→f7→f9→f11
P8:main→f2→f5→f9→f11
因此,如果要计算f7和f9函数间的调用频次,则计算方法是计算f7和f9在所有路径总出现的次数,即F(f7)=6,F(f9)=4,同时,计算f7和f9间的调用次数,也就是f7调用f9和f9调用f7的次数总和,即F(f7,f9)=3。
获得函数间的调用频次后,可以通过以下公式计算两个函数x和y之间的相关性R:
其中,F(x,y)表示函数x调用函数y的次数与函数y调用函数x的次数之和,F(x)表示函数x在所有路径中出现的次数,F(y)表示函数y在所有路径中出现的次数。
(2)扩展单元的构建
由于缺少上下文信息,因此单元测试通常会带来很多误报,为了过滤掉一些误报,TDCT将测试对象从单个函数扩展到通过计算函数相关性获得的一组测试单元。在具有函数之间的相关性后,TDCT将根据实际情况设置函数的相关性阈值,然后根据该值来构造被测试目标相关的扩展单元。对于每个目标函数f,TDCT构造一组扩展单元,其中包括f本身,满足相关性阈值的调用者e,及其满足相关性阈值的后继g。
对于后继者g,函数f高度依赖于从f到g的路径上的所有函数节点。也就是说,在从f到g的路径上直接相互调用的所有函数之间的依赖关系超过了阈值。例如,假设目标函数是f7且设置的相关性阈值为0.7,在图2中,R(f7,f8)的相关性是0.8,R(f7,f9)是0.9,R(f8,f10)是0.9,R(f9,f11)为0.3。因此,除了f7函数本身外,函数f8,f9和f10将被添加到f7的扩展单元中。
对于调用者e,TDCT从函数f本身开始,搜索向上的调用者函数,直到遇到函数e,该函数的调用者与函数e的相关性低于预设的相关性阈值。函数e的数量将决定下一阶段单元测试的扩展单元数。例如,图2表示出了目标f(函数f7)的两个调用者e(即函数f1和f2),因此将会生成2组扩展单元{f1,f4,f7,f8,f10,f9}和{f2,f7,f8,f10,f9}。
值得注意的是,相关性阈值与扩展单元的范围密切相关。当阈值较高时,扩展单元将变小,直到在极端情况下成为单个目标函数;当阈值较低时,更多函数将添加到扩展单元,直到极限情况下是整个程序。换句话说,相关性阈值一方面会影响单元测试的误报率,另一方面,它也会影响性能,甚至导致大量误报(由于函数数量的增加,扩展单元的复杂性增加了,这使得在单元测试中很难完全覆盖所有路径)。
步骤2:使用扩展单元的单元测试
Concolic测试是一种程序分析技术,可以系统地探索程序中的路径。TDCT使用concolic测试对扩展单元进行全面的探索。对于被测程序P中和目标函数相关的每一组扩展单元,TDCT会为其自动生成扩展单元的测试驱动程序driver_e和符号存根stub_g。
在构造了执行的单元之后,TDCT为入口函数e生成符号单元测试驱动器driver_e以启动单元测试,并为后继函数g生成符号存根stub_g。测试驱动程序根据调用函数e的输入类型将符号值分配给e的输入变量,然后调用函数e。执行函数g时,将其替换为符号存根stub_g以使返回值具有符号意义。为了简单起见,符号存根仅返回符号值,而不更新全局变量和输出。测试驱动程序和符号存根通常会使函数f的实际环境过逼近,并导致出现不可行的扩展单元路径,引起误报,但相比起仅对目标函数f单独进行单元测试,TDCT的误报已被显著降低。
表1为TDCT自动生成一个扩展单元的测试驱动程序driver_e和符号存根stub_g。函数driver_e利用在函数make_symbolic中生成的符号变量str调用函数e,函数stub_g利用在函数make_symbolic中生成的符号变量str返回符号值,而不是具体值。所有调用函数g的地方都需要替换为stub_g,以使其返回值具有符号性。
表1.测试驱动程序和符号存根的示例
由于缺少变量相关的上下文信息,因此单元测试通常会带来大量的误报。为了滤除大多数误报,TDCT通过在一段时间段内运行程序来计算函数之间的相关性,并将测试对象扩展到多个函数组成的扩展单元。在构造了扩展单元之后,它为入口函数e生成测试驱动程序driver_e,为后继函数g生成符号存根stub_g,并以此开始对构建的扩展单元进行单元测试。TDCT对扩展单元进行concolic单元测试,以探索与函数f相关的崩溃性错误。在此执行期间,TDCT将为测试驱动程序driver_e的每一条执行路径生成一组输入,并在遇到崩溃错误时记录执行路径及该路径的约束条件。
一方面,与单个目标函数的单元测试相比,由于增加了与目标函数依赖性较强的函数,因此TDCT的误报率较低,也就是说,将相关函数的前驱约束条件添加到扩展单元。另一方面,与系统级concolic测试相比(即以整个程序为单元的特殊单元测试),TDCT在确保准确性的同时,减少了搜索空间,并专注于目标函数附近代码的测试。
步骤3:系统级的错误验证
在第2步中TDCT获得了被测程序中目标函数在局部的崩溃性错误相关信息,如错误发生的局部输入和路径约束等,TDCT通过使用与崩溃相关的输入和路径约束来探究是否存在可能导致局部崩溃的系统级输入,以验证步骤2中发现的潜在崩溃是否是真实存在的。
(1)状态分叉
使用IDA Pro之类的工具静态分析整个程序,以构建控制流程图(CFG)和函数调用图(CG)。使用步骤2中的潜在错误作为目标,在生成的CFG和CG中进行标记,以获得包含潜在目标标记节点的控制流程图。
(2)系统级的concolic测试
在系统级别的concolic测试阶段,TDCT使用选定的输入和基于目标的搜索策略来快速定位局部错误在全局是否存在,并得到全局路径的输入和相关的崩溃报告。
一条路径在执行过程中,会在条件分支所在的位置生成新状态,TDCT将这些新状态映射到下一个块地址,并将它们放入候选池(或称候选列表)中,当前状态执行完成后,TDCT将根据基于目标的路径选择算法从候选池中选择适当的路径。特别地,当执行路径运行到潜在的目标地址时,即当路径运行到单元测试条目e时,TDCT将使用求解器来确定潜在错误的局部输入是否满足系统级路径约束。如果可以满足,它将继续运行此路径,直到触发全局崩溃并输出全局测试用例;如果执行路径无法在所有潜在错误中找到满足路径约束的解决方案,它将丢弃该路径,并继续查找下一个可以触发单元测试条目的系统级输入。
本发明的目标驱动的搜索策略,具体可以采用以下步骤实现:
当一条路径执行结束后,确定候选列表中新状态的下一条指令地址是否命中目标函数,即补丁所在的函数;如果命中,则为所有命中的新状态分配最高优先级,在最高优先级的新状态中选择最接近核心目标的一条路径以继续运行,该路径执行后,将继续在最高优先级的新状态中选择执行路径;如果没有命中,或最高优先级的新状态全部执行完成,则结合控制流图CFG和函数调用图CG查找目标函数的上层调用函数,并确认候选列表中是否存在新状态命中该上层调用函数;在命中该上层调用函数的新状态中选择最接近调用点的一个新状态继续执行。注意:除针对命中目标函数的新状态外,其它新状态均不含有优先权。由于已经确认先前生成的新状态是否命中目标函数或其调用者,因此优先考虑从当前运行状态派生的新状态,以确认它们是否命中目标函数。
可以使用公式Di=|statei_addr-target_addr|计算新状态与所述目标之间的距离,选择距离最接近目标的新状态。其中Di表示距离,statei_addr表示新状态的下一条指令地址,target_addr表示目标地址。对于target_addr,它首先是在运行程序之前确定的补丁行的地址,在没有新状态命中目标函数时,它是目标函数的调用链中函数调用行的地址。
此后,继续为下一条核心目标代码执行上述所有步骤。运行命中目标函数的所有新状态(即运行全部最高优先级新状态)的目的是在补丁附近尽可能多地测试代码。因为对于补丁程序的安全性测试,仅关注补丁代码本身覆盖的路径通常无法满足要求,补丁附近的代码通常与补丁相关联,因此有必要对补丁所在的函数进行更加全面的测试。
本发明的TDCT使用被测软件中的函数依赖关系来确定单元测试的范围,利用concolic执行对被测试单元进行单元测试,以快速识别局部的错误。结合concolic执行的单元测试能够快速识别被测单元中的可疑错误,但由于缺少全局的上下文信息,它必然带来大量的误报。此外,TDCT还专注于验证这些潜在的错误,并在系统级concolic测试中生成系统级测试输入。通过这种方法TDCT没有探索大量的符号搜索空间,而是着重于将局部错误扩展到系统级路径,从而在系统级concolic测试中准确地找到错误并输出系统级测试用例。TDCT具有较高的系统级错误检测能力和较高的检测精度。
本发明的关键点主要包括:
第一个关键点是提出了计算函数调用相关性的方法,即步骤1中的内容。
第二个关键点是提出了利用函数相关性构造测试单元的方法,即步骤1中的内容。
第三个关键点是提出了利用concolic测试对扩展单元进行单元测试的方法,即步骤2中的内容。
第四个关键点是提出了采用基于目标驱动的concolic的测试来对步骤2中的潜在错误进行验证的方法,即步骤3中的内容。
上述方法的步骤1中计算函数的相关性部分,本发明采用系统级的concolic测试的方法来获取函数调用频次。也可通过其他有效的测试方法来获取该数据。
上述方法的步骤1中计算函数相关性部分,本发明采用条件概率来计算依赖关系。也可采用其他有效的计算公式获得该依赖关系。
上述方法的步骤2中获得局部潜在错误部分,本发明采用基于concolic测试的单元测试来发现潜在错误。也可采用其他有效的测试方法获得。
基于同一发明构思,本发明的另一个实施例提供一种采用上述方法的基于目标驱动的软件测试装置,其包括:
扩展单元构建模块,用于收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;
单元测试模块,用于在扩展单元中使用单元测试发现潜在错误;
系统级错误验证模块,用于使用目标驱动的搜索策略验证潜在错误是否在全局存在。
基于同一发明构思,本发明的另一实施例提供一种电子装置(计算机、服务器、智能手机等),其包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行本发明方法中各步骤的指令。
基于同一发明构思,本发明的另一实施例提供一种计算机可读存储介质(如ROM/RAM、磁盘、光盘),所述计算机可读存储介质存储计算机程序,所述计算机程序被计算机执行时,实现本发明方法的各个步骤。
以上公开的本发明的具体实施例,其目的在于帮助理解本发明的内容并据以实施,本领域的普通技术人员可以理解,在不脱离本发明的精神和范围内,各种替换、变化和修改都是可能的。本发明不应局限于本说明书的实施例所公开的内容,本发明的保护范围以权利要求书界定的范围为准。
Claims (10)
1.一种基于目标驱动的软件测试方法,其特征在于,包括以下步骤:
收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;
在扩展单元中使用单元测试发现潜在错误;
使用目标驱动的搜索策略验证潜在错误是否在全局存在。
2.根据权利要求1所述的方法,其特征在于,所述收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,包括:
以待测的目标程序和一组系统级测试初始值为输入开始concolic执行,并根据实际情况设置时间阈值;concolic引擎以获取尽可能多的系统级路径为目的,一旦到达设定的时间阈值就停止运行;同时收集已运行路径上函数的调用关系,利用函数间的调用频次,通过计算条件概率来确定函数间的相关性。
4.根据权利要求1所述的方法,其特征在于,所述通过函数的相关性构建扩展单元,包括:
根据实际情况预设函数相关性阈值,根据函数相关性阈值选择满足要求的相关函数,以构建出扩展单元;对于每个目标函数f,构造一组扩展单元,其中包括f本身,满足函数相关性阈值的调用者e,及其满足函数相关性阈值的后继g。
5.根据权利要求1所述的方法,其特征在于,所述在扩展单元中使用单元测试发现潜在错误,包括:
对于被测程序P中和目标函数相关的每一组扩展单元,自动生成扩展单元的测试驱动程序driver_e和符号存根stub_g;
测试驱动程序driver_e根据调用函数e的输入类型将符号值分配给e的输入变量,然后调用函数e;执行后继函数g时,将其替换为符号存根stub_g以使返回值具有符号意义;
对扩展单元进行concolic单元测试,以探索与目标函数f相关的崩溃性错误,在此执行期间,为测试驱动程序driver_e的每一条执行路径生成一组输入,并在遇到崩溃错误时记录执行路径及该路径的约束条件。
6.根据权利要求1所述的方法,其特征在于,所述使用目标驱动的搜索策略验证潜在错误是否在全局存在,包括:
分析整个程序,以构建控制流程图CFG和函数调用图CG,使用潜在错误作为目标在生成的CFG和CG中进行标记,以获得包含潜在目标标记节点的控制流程图;
在系统级的concolic测试阶段,使用选定的输入和目标驱动的搜索策略来快速定位局部错误在全局是否存在,并得到全局路径的输入和相关的崩溃报告。
7.根据权利要求6所述的方法,其特征在于,所述目标驱动的搜索策略包括:
当执行路径运行到潜在的目标地址时,使用求解器来确定潜在错误的局部输入是否满足系统级路径约束;如果满足则继续运行此路径,直到触发全局崩溃并输出全局测试用例;如果执行路径无法在所有潜在错误中找到满足路径约束的解决方案,则丢弃该路径,并继续查找下一个能够触发单元测试条目的系统级输入。
8.一种采用权利要求1~7中任一权利要求所述方法的基于目标驱动的软件测试装置,其特征在于,包括:
扩展单元构建模块,用于收集函数之间的调用关系,利用函数之间的调用关系计算函数的相关性,通过函数的相关性构建扩展单元;
单元测试模块,用于在扩展单元中使用单元测试发现潜在错误;
系统级错误验证模块,用于使用目标驱动的搜索策略验证潜在错误是否在全局存在。
9.一种电子装置,其特征在于,包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行权利要求1~7中任一权利要求所述方法的指令。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储计算机程序,所述计算机程序被计算机执行时,实现权利要求1~7中任一权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110479754.XA CN113297069A (zh) | 2021-04-30 | 2021-04-30 | 一种基于目标驱动的软件测试方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110479754.XA CN113297069A (zh) | 2021-04-30 | 2021-04-30 | 一种基于目标驱动的软件测试方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113297069A true CN113297069A (zh) | 2021-08-24 |
Family
ID=77320635
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110479754.XA Pending CN113297069A (zh) | 2021-04-30 | 2021-04-30 | 一种基于目标驱动的软件测试方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113297069A (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103116540A (zh) * | 2013-01-23 | 2013-05-22 | 电子科技大学 | 基于全局超级块支配图的动态符号执行方法及其装置 |
CN104899147A (zh) * | 2015-06-19 | 2015-09-09 | 北京理工大学 | 一种面向安全检查的代码静态分析方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN106294169A (zh) * | 2016-08-17 | 2017-01-04 | 华中科技大学 | 一种基于符号执行虚拟机的数据竞争检测与重放方法 |
CN106354630A (zh) * | 2016-08-23 | 2017-01-25 | 电子科技大学 | 一种基于动态符号执行的软件缺陷检测方法 |
CN109117364A (zh) * | 2018-07-03 | 2019-01-01 | 中国科学院信息工程研究所 | 一种面向目标的测试用例生成方法及系统 |
-
2021
- 2021-04-30 CN CN202110479754.XA patent/CN113297069A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103116540A (zh) * | 2013-01-23 | 2013-05-22 | 电子科技大学 | 基于全局超级块支配图的动态符号执行方法及其装置 |
CN104899147A (zh) * | 2015-06-19 | 2015-09-09 | 北京理工大学 | 一种面向安全检查的代码静态分析方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN106294169A (zh) * | 2016-08-17 | 2017-01-04 | 华中科技大学 | 一种基于符号执行虚拟机的数据竞争检测与重放方法 |
CN106354630A (zh) * | 2016-08-23 | 2017-01-25 | 电子科技大学 | 一种基于动态符号执行的软件缺陷检测方法 |
CN109117364A (zh) * | 2018-07-03 | 2019-01-01 | 中国科学院信息工程研究所 | 一种面向目标的测试用例生成方法及系统 |
Non-Patent Citations (4)
Title |
---|
QIXING DONG ET AL.: "A Search Strategy Guided by Uncovered Branches for Concolic Testing", 2013 13TH INTERNATIONAL CONFERENCE ON QUALITY SOFTWARE, 23 September 2013 (2013-09-23), pages 21 - 24 * |
张玉清 等: "Android安全漏洞挖掘技术综述", 计算机研究与发展, vol. 52, no. 10, 31 October 2015 (2015-10-31), pages 2167 - 2177 * |
柳晓龙 等: "基于前向探针的符号执行路径搜索算法", 信息工程大学学报, vol. 20, no. 04, 31 August 2019 (2019-08-31), pages 427 - 431 * |
谢肖飞 等: "基于符号执行与模糊测试的混合测试方法", 软件学报, vol. 30, no. 10, 31 October 2019 (2019-10-31), pages 3071 - 3089 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6859449B2 (ja) | テストケースを利用してテストを遂行する方法および装置 | |
CN111274126B (zh) | 测试用例筛选方法、装置及介质 | |
US10437702B2 (en) | Data-augmented software diagnosis method and a diagnoser therefor | |
Amla et al. | Experimental analysis of different techniques for bounded model checking | |
US8397104B2 (en) | Creation of test plans | |
US20130091495A1 (en) | Feedback-directed random class unit test generation using symbolic execution | |
US8898649B2 (en) | Application program analysis method, analysis system and recording medium for identifying a contributing factor for an invalid operation of an application program | |
CN111832026B (zh) | 一种漏洞利用定位方法、系统、装置及介质 | |
Levin et al. | The co-evolution of test maintenance and code maintenance through the lens of fine-grained semantic changes | |
CN111104335A (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
JP6245006B2 (ja) | テストケース生成装置、方法、及びプログラム | |
CN115062570B (zh) | 一种形式验证方法、装置、设备及计算机存储介质 | |
US20150234978A1 (en) | Cell Internal Defect Diagnosis | |
WO2016133607A1 (en) | Small scale integration test generation | |
CN112783513A (zh) | 一种代码风险检查方法、装置及设备 | |
US6792581B2 (en) | Method and apparatus for cut-point frontier selection and for counter-example generation in formal equivalence verification | |
US10546080B1 (en) | Method and system for identifying potential causes of failure in simulation runs using machine learning | |
US8015523B2 (en) | Method and system for sequential netlist reduction through trace-containment | |
CN113297069A (zh) | 一种基于目标驱动的软件测试方法和装置 | |
Rapos et al. | SimPact: Impact analysis for simulink models | |
US10234502B1 (en) | Circuit defect diagnosis based on sink cell fault models | |
CN114138669A (zh) | 一种基于函数级选择符号化混合执行的软件自动测试方法 | |
JP2017041196A (ja) | スタブ化対象判定装置、方法、及びプログラム | |
CN113688403A (zh) | 一种基于符号执行验证的智能合约漏洞检测方法及装置 | |
CN112699376A (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 |