向着Concolic测试的最优策略迈进-Towards Optimal Concolic Testing-wcventure译

Towards Optimal Concolic Testing

Towards Optimal Concolic Testing. In ICSE ‘18: ICSE ‘18: 40th. International Conference on Software Engineering , May 27-June 3, 2018,.

这篇文章主要是解决Concolic Testing的最优策略的问题,即如何在具体执行(随机测试)和符号执行之间切换以实现最佳性能?随机测试的优势主要是成本低,如果某个程序路径的概率非常低,则必须对大量测试输入进行采样以覆盖程序路径。符号执行的优势就是,理想情况下覆盖程序路径的概率是1,符号执行的问题主要在于约束求解的开销很大。所以Concolic Testing要做的就是在即时在随机测试和符号执行之间切换以实现最佳性能。

作者首先定义什么是Concolic testing的最优策略,主要是根据程序路径的概率和约束求解的成本来定义最优策略。定义了最优策略后就是找出最优策略,也就是成本要低,收益要高。那这个问题可以简化为具有成本的马尔可夫决策过程的问题。最后作者提出一种近似最优策略的贪婪算法。

Q1: 给出一个程序,concolic测试的最优策略是什么?
A1: 最优策略可以看作是马尔科夫决策的策略,其具有最小的预期成本。

Q2: 我们能否有效地计算出最优策略?
A2: 识别最优策略的复杂性是DP中状态数的强多项式,而P中的控制位置数量则呈指数关系。

Q3: 现有策略是否是最佳策略的良好近似值?
A3: 现有启发式算法可以改进

Q4: 是否有可能设计出一种实用的算法来逼近最优策略?
A4: 设计一种近似最优策略的实用算法是可行的。

Q5: 如果RQ4的答案是肯定的,那么该算法与现有的启发式算法相比如何?
A5: 本文的贪婪算法优于KLEE中现有的启发式算法。

ABSTRACT

Concolic测试集成了具体执行(例如,随机测试)和符号执行,可用于测试用例的生成。它有时比随机测试或符号执行更具成本效益。一个concolic测试策略应该是函数,该函数为决定何时应用随机测试或符号执行(如果是后一种情况,则是一个符号执行的程序路径)。关于concolic测试的策略,目前已经有许多研究提出了基于启发式的策略,但什么才是最佳的concolic测试策略仍然是一个悬而未决的问题。在本文的研究工作中,作者为解决这个问题主要做出了两点贡献。
(1)作者表明可以根据“程序路径的概率”和“约束求解的成本”来定义最优策略。然后将识别最优策略的问题简化为具有成本的马尔可夫决策过程的模型检查问题。
(2)由于识别最优策略的复杂性很高,作者设计了一种贪婪算法,用于近似最优策略。
作者还进行了两组实验。一种是基于随机生成的模型,另一种是基于一组C程序。结果表明,现有的启发式方法还有很大的提升空间,本文提出的贪婪算法往往优于现有的启发式算法。

1. INTRODUCTION

Concolic测试,也称为动态符号执行,是具体执行(测试)与符号执行的集成。具体执行和符号执行相互补充。 一方面,具体执行在计算上很代价较低。 也就是说,我们根据所有测试输入的先前概率分布继续对测试输入进行采样,并且具体地执行具有测试输入的程序,直到满足某些测试覆盖标准。问题在于,如果某个程序路径的概率非常低,则必须对大量测试输入进行采样以覆盖程序路径。另一方面,符号执行通过识别必须满足的约束来解决该问题,以便覆盖程序路径并解决约束以获得测试输入。 换句话说,理想情况下用符号执行覆盖程序路径的概率是1。问题是符号执行通常在计算上很昂贵。 直观地说,有效的分析测试策略应该是利用符号执行执行那些低概率执行的程序路径,而具体执行应该执行那些路径条件难以求解的程序路径。

关于什么是concolic testing的最优策略仍然是一个悬而未决的问题。 在目前的文献中,已经有多种尝试来解决这个问题。例如,已经由研究工作提出了几种启发式方法来回答这个问题。此外,现有工作在很大程度上忽略了问题的其他关键部分,即我们如何在具体执行和符号执行之间切换以实现最佳性能?

在这项工作中,我们的目标是开发一个框架,使我们能够定义和计算最佳的分析测试策略。也就是说,我们的目标是系统地回答何时应用具体执行,何时应用符号执行以及将符号执行应用于哪个程序路径。特别是,我们做出以下技术贡献。

  • 作者表明可以基于程序行为的概率抽象来定义最优的测试策略。
  • 我们证明了识别最优策略的问题可以简化为具有成本的马尔可夫决策过程的模型检验问题。因此,我们可以重用现有的工具和算法来解决问题。
  • 作者使用一组模拟实验来验证现有的启发式算法,并表明它们有很大的改进空间。
  • 鉴于计算最优策略的高度复杂性,作者提出了一种近似最优策略的贪婪算法。我们根据模拟实验和C程序实验对贪婪算法进行了实证评估,并证明它比KLEE中现有的启发式算法获得更好的性能。

2. PROBLEM DEFINITION

本文对一个程序(e.g., Java/C) 的形式化定义如下:
Definition2.1

图1显示了一个简单的Java程序。 转换系统包含8个控制位置,对应于程序中的8个编号行。 为简单起见,我们假设每条线都是原子线。 初始条件φ是x∈Int∧y∈Int其中Int是所有整数的集合。
Fig1
为简单起见,假设目标是生成测试用例,以便相应的具体执行覆盖所有可到达的控制位置(即100%语句覆盖率)。本文专注于两种生成测试用例的方法,即随机测试和符号执行。

此处先认识并分析一次随机测试和符号执行:

  • 随机测试是随机生成x和y的值,然后具体执行程序。 为了进行随机测试,在所有测试用例中修复了先验分布μ,然后每次根据μ随机抽样测试用例。 之后,使用抽样测试用例执行程序,直到完成执行。就时间而言,随机测试的成本通常很小。 在这项工作中,我们简单地假设成本是1个时间单位。 假设每个测试用例都与μ中的某些非零概率相关联,最终显示我们可以通过随机测试枚举所有测试用例并覆盖所有可到达的控制位置,这是微不足道的。 不幸的是,在实践中我们的时间和预算有限,因此我们可能无法用有限数量的随机测试案例覆盖某些控制位置。 例如,对于x和yl的所有可能值中的均匀概率分布,平均需要2 ^ 32个随机测试案例来覆盖图1中的第2行。
  • 生成测试用例的另一种方法是符号执行。给定程序路径,使用约束求解器来检查路径条件的可满足性,并且如果它是可满足的,则构造测试用例。然后,我们使用测试用例执行程序,直到它完成执行。符号执行有时可能比随机测试更具成本效益。例如,使用约束求解器Z3,我们可以很容易地解决图1中访问第2行的路径条件(即x==y),以生成所需的测试用例。但是,符号执行可能并不总是具有成本效益。例如,为了获得覆盖线4的测试,我们可以应用符号执行来解决包括第3行条件的路径条件。由于非线性约束,它可能是非平凡的。相比之下,生成随机测试用例以满足第3行的条件要容易得多,即平均需要5个随机测试用例。通常,符号执行的成本远远大于随机测试的成本,因为约束求解可能非常耗时。

此外,当应用符号执行来生成覆盖某个控制位置的测试用例时,我们可以求解以控制位置结束的路径的路径条件或其前缀的路径条件。 例如,为了覆盖第7行,我们可以求解由第1,3,5,6和7行组成的路径,或者由第1,3,5和6行(一次或多次)组成的路径来生成 测试用例。 后者可能更具成本效益,因为要解决的约束条款较少。 在这个特定的例子中,解决后者一次就足以覆盖第7行。

在本文的工作中,定义了一种策略,用于在Concolic测试中生成在随机测试或符号执行(在某个路径上)之间的选择,直到覆盖测试目标的所有路径。两个极端的是:(1)始终应用随机测试,以及(2)对每个程序路径应用符号执行。 有许多替代品。 现有的复杂测试引擎(例如,KLEE,Pex和JDart)已采用多种策略。 如上所示,对于某些程序,一种策略可能比其他策略更具成本效益。例如,对于图1所示的示例,“更好”策略将符号执行应用于由第1行和第2行组成的路径(以覆盖第2行),将符号执行应用于由1,3,5和 6(覆盖第7行),并应用随机测试来覆盖其余的路径。 那么问题是如何比较不同的策略。 本文研究了不同的策略测试策略的有效性,并回答了以下开放性问题。

  • Q1: 给出一个程序,concolic测试的最优策略是什么?
  • Q2: 我们能否有效地计算出最优策略?
  • Q3: 现有策略是否是最佳策略的良好近似值?
  • Q4: 是否有可能设计出一种实用的算法来逼近最优策略?
  • Q5: 如果RQ4的答案是肯定的,那么该算法与现有的启发式算法相比如何?

3. OPTIMAL STRATEGY

在本节中,我们展示了可以基于程序路径的概率和约束求解的成本来定义最优的共存测试策略。 此外,它可以通过“模型检查”来计算。

3.1 Markov Chain Abstraction

为了回答RQ1,我们首先以Markov链的形式开发一个程序抽象
D3.1

在下文中,本文开发了DTMC对程序的解释,这是后续讨论的基础。
D3.2

注意,在上面的定义中,除了初始概率分布μ之外,每个一步转换具有概率1或0。 我们的最优类型测试策略是基于M{P}的一个特定抽象来定义的,即抽象出变量估值的抽象,定义如下。
D3.3

直观地,Pra(l,l’)是访问l并且紧接着l’的概率,超过达到l的概率。 例如,图1右侧所示的DTMC是左侧程序的数据抽象DTMC解释,其中程序中的每个控制位置成为DTMC中的状态,并且两个控制位置之间的每个控制流与 相应的条件概率。 例如,标记有从状态1到2的转换的概率1 232表明在状态1之后访问状态2的概率是1/2^32(如果我们假设所有测试输入之间的均匀分布)。

以下命题表明到达控制位置l的概率保留在M {P}中。
P3.4

3.2 Optimal Strategy

回想一下,一个concllic测试策略是不同测试用例生成方法之间的一系列选择。 在这项工作中,我们定义了选择的空间:
{ RT } ∪ { SE(p) | p ∈ path(p) }
为了比较不同选择的成本,我们需要一种衡量它们的方法。 这项工作专注于时间成本。为简单起见,生成随机测试用例的时间成本设置为1个单位。 时间成本 SE(p) 包括编码/求解路径条件的时间成本。

我们用程序中覆盖一组状态的概率来衡量选择的有效性。
PR(X)

在这项工作中,假设可以根据某些状态是否已被覆盖来做出选择。 这是直观的,因为如果路径上的所有状态都已被覆盖,那么最好不要将符号执行应用于该路径。 因此,策略是一种函数,它将关于程序中中的每个控制位置是否已被覆盖的输入信息,并返回测试用例生成方法的选择。 为了系统地比较不同的分析测试策略,我们以具有成本的马尔可夫决策过程(MDP)的形式构建以下模型。

定义马尔可夫决策过程
D3.5

我们可以得到图2左边所示的数据抽象马尔可夫链模型,右边显示相应的马尔科夫决策过程。 initial的初始状态是∅,即没有覆盖任何状态。 在初始状态下应用随机测试,我们可以得到一个概率分布,即概率为0.5达到状态{1,2,4}(即覆盖状态1,2和4),概率为0.5达到状态{1,3,4}。 如果相反,在路径⟨1,2⟩上进行符号执行(即SE(12)),我们有达到状态{1,2,4}的概率为1。 注意,如果我们在状态{1,2,4}的路径⟨1,2⟩上应用符号执行,我们再次以概率1到达{1,2,4},这由状态{的自循环过渡表示{ 1,2,4}。 假设cost(RT)= 1,cost(SE(12))=cost(SE(13))= 2 而 cost(SE(124))=cost(SE(134))= 3,我们可以计算出 基于每种选择的累积成本的预期成本。 例如,总是应用RT的预期成本是2,而应用SE(12)然后SE(13)的预期成本是4。

Answer to RQ1: The optimal strategy is the policy of Dp which has the minimum expected cost.

例如,在图2所示的示例中,最优策略是始终应用RT的策略(具有预期成本2)。 因此,找到最优策略的问题被解决为找到具有最小预期成本的策略的问题,这可以使用诸如值迭代,策略迭代或解决线性编程问题的现有方法来解决。 因此,找到最优策略的计算复杂性受到识别最优策略的复杂性的限制。
Fig2

Answer to RQ2: The complexity of identifying the optimal strategy is strongly polynomial in the number of states in DP, which in turn is exponential in the number of control locations in P.
3.3 Evaluating Existing Heuristics

T1

Answer to RQ3: Existing heuristics could be improved.

4. APPROXIMATING OPTIMALITY

基于第3节中的讨论,很明显,由于其高度复杂性以及识别程序路径概率和符号执行成本的困难,在实践中确定最优策略是不可行的。 在下文中,我们提出了一种在实践中近似最优策略的方法。 我们的提议包括一种近似M的方法,一种近似函数(cost)的方法,以及一种用于识别最优策略的贪婪算法。

4.1 Estimating MaP and Function cost()

我们应用轻量级方法,即,我们基于已经获得的测试案例估计Pr()。 我们想要解决的基本问题是:如果我们观察到某些事件(即覆盖某些程序路径的测试用例),我们如何估计所见事件的概率和那些看不见的事件(即覆盖的测试用例) 其他程序路径)的概率?

假设我们已经获得了一组测试执行X,我们可以如下估计Pr。拉普拉斯估计
D4.1

估计函数cost(),即约束求解的成本,由于像Z3这样的约束求解器所采用的复杂约束求解技术,因此非常重要。 它本身就是一个研究课题。估计函数cost(),即约束求解的成本,由于像Z3这样的约束求解器所采用的复杂约束求解技术,因此非常重要。 它本身就是一个研究课题。在这项工作中,我们采用[29](Liu Jingde, Chen Zhenbang, and Wang Ji. Solving cost prediction based search in symbolic execution. Journal of Computer Research and Development, pages 1086,1094, 2016.)中的方法,其工作原理如下。 首先,作者收集了解决通过符号执行分析一组真实世界程序所产生的约束的时间成本。 假设约束求解的代价是约束中基元运算的加权和,则它们通过函数拟合估计每个基本运算类型的权重。然后,给定约束c,将其求解成本估计为c中所有基本运算的加权和.例如,如果c是a*b > 0,则其求解成本是乘法的加权成本与大于比较的加权成本之和。

4.2 A Greedy Algorithm

下文提出了一种复杂程度低得多的贪婪算法。 这个想法是在运行中估计Map并应用测试用例生成方法,该方法基于估计最具成本效益的方式改进测试覆盖。
Algorithm

直观地,我们将测试生成方法的“奖励”定义为预期将由新生成的测试用例覆盖的未覆盖状态的数量,并选择具有每单位成本的最大预期奖励的方法。
RS
接下来,我们将随机测试的预期奖励与符号执行的预期奖励进行比较。 理想情况下,我们会计算符号执行每条路径的成本以及相应的奖励,然后选择最有利可图的成本。 然而,这种路径的数量通常很大(即,如果存在循环则无限大)。因此,我们启发式地关注除了结束状态之外不包含未覆盖状态的路径。 这样,如果应用符号执行,则保证访问至少1个未访问状态。将符号执行应用于以状态S结束的路径的预期奖励表示为(RS),其可以使用上面讨论的相同的方程系统来获得。

Fig3

在下文中,我们将说明该算法如何适用于图1所示的程序。为了便于说明,我们假设求解线性相等或它们的连接具有时间成本4,求解非线性等式的成本为10; 并且求解非线性等式的布尔组合的成本为50。最初,由于我们还没有测试执行,估计M显示在图3的左侧,其中未覆盖的状态是短划线的。 请注意,来自相同状态的所有传出转换具有相同的概率。 基于这种估计,我们通过求解以下方程系统来计算随机测试的预期回报。

One

随机测试的预期回报是 μ(s1)*R1,即4.875。 由于所有状态都是未访问的,因此我们为符号执行选择的候选路径是仅包含状态1的路径。由于路径条件为真,因此对此路径应用符号执行与随机测试相同。 请注意,这意味着我们总是从随机测试开始。请注意,这意味着我们总是从随机测试开始。 假设我们生成的随机测试用例覆盖控制位置1,3,5和8.然后更新估计,如图3中间所示。接下来,我们通过求解以下方程系统来计算随机测试的预期回报。

Two

我们有R1 = 1,R2 = 5/3,R4 = 1和R6 = 1.5。 符号执行的候选路径包括从1到2的路径,从1,3到4的路径,以及从1,3,5到6的路径。成本分别为4,50和50。 预期奖励分别为5 3,1和1.5。 因此,所选择的方法是随机测试。 为简单起见,假设前8个随机测试执行全部覆盖1,3,5和8.结果,M更新如图3右侧所示。随机测试的预期奖励计算为0.335,而 解决从1到2的路径的预期回报是1.235。 因此,我们得出结论,后者更具成本效益(每个成本奖励0.30875),因此将符号执行应用于路径。 直观地说,我们只有在覆盖路径需要大量随机测试用例时才会从随机测试切换到解决某些程序路径,这将花费比符号执行更多的成本。

算法1的复杂性是合理的。 为了选择正确的测试用例生成方法,在每一轮中,我们付出解决方程系统的代价,方程系统的变量数等于程序中控制位置的数量。 现代方程系统求解器通常相当有效并且开销是合理的。 我们可以进一步优化求解方程组的算法,因为只有当푠能够达到新覆盖的状态时,Rs才会在一次迭代后发生变化。

Answer to RQ4: It is possible to design a practical algorithm to approximate the optimal strategy.

5. EVALUATION

Fig4

Answer to RQ5: Our greedy algorithm outperforms existing heuristics in KLEE.

6. CONCLUSION

在这项工作中,本文提出了一个框架来推导出最优的共存测试策略,在此基础上我们分析现有的启发式算法,并提出一种新算法来近似最优策略。 对随机生成的模型和一组真实C程序的评估表明,我们的算法经常优于大多数现有的基于启发式的算法。 对于未来的工作,我们希望研究估算概率和解决程序路径成本的替代方法。 此外,我们希望将我们的框架扩展到其他测试用例生成方法。

局限性:考虑的是顶点而不是边。例如图3如果随机测试全走了123,13将不会执行符号执行。(因为策略是如果路径上的所有状态都已被覆盖,那么最好不要将符号执行应用于该路径。)

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值