《Targeted Test Input Generation Using Symbolic-Concrete Backward Execution 》

提出一种名为Symcretic执行的方法,该方法结合了符号后向执行和具体前向执行,用于生成针对特定目标的有效测试输入。这种方法能有效地处理复杂的算术约束、外部方法调用和数据依赖循环等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:Targeted Test Input Generation Using Symbolic-Concrete Backward Execution
作者:Peter Dinges, Gul Agha
单位:University of lllinois Urbana-Champaign, USA
问题
在调试和回归测试中,能够拿到覆盖程序特定分支或语句的输入是很有用的,很自然的方法就是SBE(symbolic backward execution),但SBE方法受阻于现实世界程序中的复杂算数运算、外部方法调用以及数据依赖的循环(data-dependent loops)。

方案
提出symcretic execution方法,将SBE和前向具体执行(concrete forward execution)结合起来,高效地发现针对性的输入,而不受这些问题的影响。结合该方法可使得测试用例生成工具填补覆盖率缺口,使静态bug检测器用具体测试用例验证候选bug。

贡献
描述了symcretic execution算法来发现有针对性的程序输入。symcretic execution是目前他们所知道的第一个采用具体执行来缓解SBE中不确定的或不可计算的约束、外部调用、数据依赖的循环等问题的算法,
将symcretic execution和相关的技术进行比较并在一个小程序库上评估算法的实现。该方法在生成有针对性的输入方面是可行的且比混合执行更高效。

原理

1.生成有针对性的输入:
1) 是有需求的:

比如给一个已报告出的bug分类,或者验证一个可疑的指令模式都是很实际的问题,或者添加一个测试用例来覆盖一个特定的代码改变。
2)和混合执行的不同:

混合执行以及其他自动化测试用例生成技术的目标不是覆盖一个特定的目标,而是达到整体的该覆盖率,尽量多地探索给定的程序以发现bug,或者尽量完整地生成测试用例集。而本文的目标是覆盖程序中特定的、相关的目标,任何对该目标没有贡献的程序部分都是不相关的,探索就是浪费资源。
3) SBE方法:
很自然的方法就是SBE,按照和通常执行顺序相反的方向后向探索一个程序。
从一个特定的目标语句开始探索,直到到达一个入口点,因此只考虑了能到达该目标的执行路径。
探索期间收集一个约束集(路径条件),为探索的路径构建一个符号化的特征。路径条件类似于一个最弱前置条件,求解该条件可以得到一个输入,该输入可以驱动程序沿着该路径向下执行到目标。
3) SBE方法的挑战:
1.因为路径条件可能包含任意整型约束,可能是不确定的或者求解它们是无法计算的,这种情况下查询约束的可满足性时,可能的回复是unknown
2.符号化判定程序无法处理外部方法,比如Java中的native方法
3.数据依赖的循环可以要求任意次数的迭代来发现一个可满足的路径条件,导致无限的搜索空间
2.symcretic execution:
两个阶段:
Phase 1:用SBE方法找到一条从给定的目标到程序任意一个入口点的可达路径。后向探索程序的控制流图,用抽象解释器构建路径条件。遇到分支时(比如有多个入口的语句或虚方法调用点等)用深度有限探索,每一步探索后用符号化判定程序检查当前路径条件的可满足性。如果可满足则继续探索,如果不可满足则回溯,如果无法回答则移除最近加入的约束,看作潜在的可满足的,把求解延迟到第二阶段。(和之前的方法不同的是,symcretic execution略过符号化判定程序不确定的那些约束,把它们的求解延迟到第二阶段)
同时构建了一个沿着该路径的trace,每一步探索后用当前语句预测trace,不管它有没有被从路径条件中移除。对于被移除的语句,算法会进一步加一个调用语句调用change()方法,表示这个语句的结果需要在第二阶段进行调整。
因为只沿着一条执行路径探索,所以if语句和其他条件语句不是直接加到trace中的,而是加一个调用fit()方法,标志探索沿着哪个分支。
Phase 2:当SBE到达一个程序入口点时开始前向具体执行。沿着这个被发现的路径计算的trace,这一阶段用启发式搜索发现满足Phase 1忽略的约束的输入。
特别地,算法重复地用输入值评估程序trace,确定离trace中的分支条件被满足有多接近,然后改变输入中的一些值使得离完整的解决方案更近。symcretic execution不规定用什么启发式搜索算法,可能的选择包括遗传算法(genetic algorithms)以及
集成具体执行使得symcretic execution能够求解一系列对于符号化判定程序难以解决的算数约束,且有效处理外部方法。如果一个循环要求太多次符号化遍历,symcretic execution把它看作一个外部loop方法调用,把找到正确的迭代次数的问题委托给了开销更小的具体执行阶段。该调用的方法体是循环体,返回值是循环中被写入的值。

讨论
和混合执行对比

和混合执行类似的是symcretic执行比混合执行有更强的利用具体执行缓解求解器局限的能力
和混合执行不同的是symcretic执行避免探索无关路径
混合执行探索不可达方法是从顶端开始的,一旦执行通过了初始计算,该路径可能是很长的包含很多分支的,按照通常的策略,会反转最后一个约束得到新的输入集合,然而如果条件不可达就要重复尝试直到约束集合\PhiΦ所有的约束都被试过了,这样在不可达方法前就要尝试2^{|\Phi|}2∣Φ∣个无关路径才能放弃。
一些情况下,通过数据依赖引导混合执行可以减少放弃前探索的路径数,然而,数量还是很多。

和后向切片对比

一个程序在根据一个切片标准得到的后向切片中包含该标准依赖的所有程序中的语句。因此,切片中的路径和symcretic执行收集的路径很相似。
和动态切片相似的是trace都是沿着一条执行路径。 和切片不同的是,trace不是由程序输入修正的,而是路径条件,能够一次性表示该路径所有程序输入的类;更重要的区别是切片是部分程序,而trace是语句的直线序列,其中展开了所有控制流。
目前symcretic执行不对程序进行切片,但切片可以通过减少路径探索数目加速symcretic执行。

和基于搜索的软件测试对比:

基于搜索的软件测试(SBST)找满足一个覆盖率要求的测试输入是根据一个适应度函数迭代地选择看起来更接近解决方案的输入。和本文关注与原始值相对比,SBST的输入可以改变粒度,从原始到为了构建对象的方法序列。
为了找到更好的输入的常见的启发式方法有通用的算法,还有Alternating Variable Method。
symcretic执行中具体阶段可以看作将SBST引用到程序切片中的一个特殊实例。

实现

工具Cilocnoc实现symcretic执行,依赖于WALA处理类文件,用Z3求解原始约束,用一个定制的求解器处理object-shape约束。搜索策略是Concolic Walk算法。

评估

和Symbolic PathFinder(SPF)以及jCUTE对比,为了对比有效性和效率,为一个小程序集定义了目标语句(实验中Table1),并统计每个工具在发现到达目标的输入或者放弃之前要搜索多少歩。
jCUTE和SPFCW都是为JAVA程序生成高覆盖率的测试集的工具,因为目标是高覆盖率,所以两者都没有实现引导到目标语句的探索方法。
jCUTE:经典的混合测试生成器,依赖于线性约束求解器 SPF-CW是SPF的一个变种,解决复杂的算数路径条件,包括外部方法调用,也是用Concolic Walk算法
所有的工具采用深度优先搜索算法,没有深度限制,但有20秒的时间限制。
在输入生成期间,统计执行路径段(execution path segment)的数目。一个段是执行路径中两个分支点之间的线性语句序列。选择这个评估指标因为相比于执行时间做度量更少地依赖实现上的选择。

有效性

Cilocnoc为所有可达的目标找到了输入,证明其有效性。
jCUTE产生的输入到达了trityp程序三个目标中的一个以及easy-loop程序中的那一个目标,其他的程序的目标都没覆盖。
SPF比jCUTE好一些,除jCUTE覆盖的之外还覆盖了dart程序中的那两个目标。

效率

symcretic执行比混合执行和符号执行更高效。
除了trityp之外的所有目标,Cilocnoc探索的路径都比另外两个工具少,而且还发现了所有想要的输入。
在unreach程序中,Cilocnoc受益于发现不可达分支的能力,仅用0.4秒就停止了探索,而jCUTE探索了1287个段,SPF-CW探索了766个段才停止。
在循环方面也是很快就找到了结果,而另外两个做了非常多次循环。
实验中体现出了混合执行相较于纯符号执行的优点,SPF-CW和Cilocnoc支持回溯机制,在到达目标前如果遇到了路径不可达情况会转变最后一个约束在搜索树中探索另一个分支,而jCUTE则要再从程序开始处重新执行完整的程序。

相关工作

后向执行:

后向执行是数据流分析中的一个常见技术,在IFDS数据流框架上构建,Chandra 在Snugglebug: a powerful approach to weakest preconditions. In PLDI, 2009. 工作中开发了Snugglebug后向分析工具,符号化地计算一个目标语句的在程序入口处的最弱前置条件。Snugglebug关注于通过惰性构建调用图缩减搜索空间。
本文工作中用Snugglebug搜索空间缩减的能力加速Cilocnoc,用symcretic执行使Snugglebug能够处理复杂的算数约束、外部方法调用以及长数据依赖循环等。
后向分析还是引导前向符号执行的到达目的语句的一些启发式策略的基础。

待改进工作:

1.集成切片技术
2.为了加速搜索发现潜在可达路径,集成驱动朝向入口点搜索的启发式方法:支持冲突驱动的后向跳转(conflict-driven back-jumping)、惰性展开被调方法。
3.完成对对象(objects)的支持、增加对数组和静态域(static fields)的支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值