angular 指定components的路径_通过路径相关性分析自动进行循环汇总

73fd2b8fb5a7dd822746f2d89f33c0f6.png

引用:X. Xie, B. Chen, L. Zou, Y. Liu, W. Le and X. Li, "Automatic Loop Summarization via Path Dependency Analysis," in IEEE Transactions on Software Engineering, vol. 45, no. 6, pp. 537-557, 1 June 2019, doi: 10.1109/TSE.2017.2788018.

摘要

对于各种软件工程任务,例如错误检测、测试用例生成和程序优化,分析循环都非常重要。但是,循环对于程序分析来说是一种非常具有挑战性的结构,尤其是(嵌套的)循环包含具有复杂交错关系的多个路径时。在本文中,我们提出了使用路径依赖自动机(PDA)来捕获循环中多个路径之间的依赖。基于 PDA,我们首先提出一个循环分类,以了解循环汇总的复杂性。然后,我们提出了一个名为 Proteus 的循环分析框架,该框架以一个循环程序和一组感兴趣的变量为输入,然后总结出感兴趣变量的路径敏感循环效应(即析取循环摘要)。我们提出了遍历 PDA 的算法,以总结循环中所有可能执行的效果。我们使用来自五个开源项目的循环和两个众所周知的基准对 Proteus 进行了评估,并将分离式循环摘要应用于以下三个应用程序:循环边界分析、程序验证和测试用例生成。评估结果表明,Proteus 可以比现有的循环边界分析技术计算出更精确的边界。 Proteus 可以大大优于最新的循环程序验证工具; Proteus 可以在一秒钟内为深层循环生成测试用例,而符号执行工具 KLEE 和 Pex 则需要更多时间甚至执行失败。

1 简介

1.1 挑战

我们已经提出了几种循环总结技术,但是,对于多路径循环(包含分支的循环)以及多路径之间的交错执行仍然存在挑战。嵌套循环具有挑战性,因为 1)嵌套循环都是多路径循环,因为在外部循环和内部循环中有多个路径;2)由于内部循环和外部循环之间的嵌套,嵌套循环通常在路径之间交错执行。因此,现有方法要么不能处理多径环路,要么不考虑交织模式。本文的目的是推理嵌套或未嵌套循环中多个路径的交织,并为此类多路径循环生成析取循环摘要(DLS)。例如,图 1a 中的 while 循环包含 if else 分支,这使其成为多路径循环。与其他类型的循环摘要相比,DLS 考虑了可能的交织模式,并且具有更清晰的细粒度。

6685bfa699855e936df10dc58126c65f.png

图 1 非嵌套循环

1.2 建议的方法

本文完成了三种先进的回路分析任务。首先,我们提出了路径依赖自动机(PDA),以建模未嵌套和嵌套循环的多个路径之间的关系。其次,我们提出了一种分类方法,以了解循环总结的难度。循环分类定义了我们可以精确处理的多路径循环类型,可以近似处理的多路径循环类型,以及尚无法处理的多路径循环类型。最后,我们开发了一个名为 Proteus 的循环分析框架,以总结基于 PDA 的每种循环类型的循环效果。Proteus 将循环代码片段和一组感兴趣的变量作为输入来计算 DLS。DLS 是一组对变量感兴趣的路径敏感回路效应的分解。

1.3 贡献

总之,这项工作的主要贡献是:

1)我们提出了一种路径依赖自动机,以捕获多路径循环中路径的依赖和交织;

2)我们提出了四种类型的多路径(嵌套)循环的分类,以了解循环汇总的复杂性;

3)我们提出了一个循环分析框架 Proteus,用基于路径依赖自动机来计算析取循环摘要;

4)我们进行了评估,以证明析取循环摘要在三个重要应用中的有用性。

2 循环建模

2.1 初步假设

c5b453e8f92461be0f0eb0e641394a5f.png

令 wp 为基于 Hoare Logic 的最弱前提条件运算符。wp 将指令 s 和后置条件 Q 作为输入,并返回 s 相对于 Q 的最弱前提,表示为 wp(s,Q)。在本文中,我们使用赋值和序列规则来计算最弱前提条件:

b4ac5e04932ff13b22f3954a55d35c6f.png
089790316e25eb86a401d01d3897716e.png

图 2 嵌套循环

2.2 路径依赖自动机

57c57169ac7a62f30047d441f010c28a.png
ca4c0eb6ac417d48b8e30567d1b5a9b1.png

3 循环分析

3.1 循环汇总

5658c716b62e27d89308e8ddd06d1e53.png

基于以上分析,总结多路径循环取决于 1)路径条件中值变化的模式,即变量是归纳还是非归纳,以及 2)每条迹线中路径交织的模式,即非循环执行或循环执行。

3.2 循环分类

0c13245a8c756b49e00c3f5c7b854e05.png

路径条件是多个原子条件的结合。 每个原子条件都是

6c9e697c44d9789ce12b457a163e2728.png

的形式,为了便于表述,我们使用

51e2034fd725b478b907b66a7585bb35.png

作为变量。条件可以分为两种类型:

  • IV 条件。如果条件是原子条件 e ~ b 且路径中的 e 是 MIV,则条件为 IV 条件。例如,图 1b 中的条件 x
  • NIV 条件。如果 e 不是 MIV,则条件为 NIV 条件。

路径交织的模式。 给定

d0e61fc76e4700d4b6172cfca1bdbfb2.png

循环,我们将循环执行分为三种类型:

  • 顺序执行。每个迹线中没有周期。
  • 定期执行。 如果每个跟踪中的所有循环都是规则的和周期性的(可以使用该周期来抽象该循环),则循环执行为周期性执行;否则,循环执行为周期性执行。 否则,它是非定期执行。
  • 不规则执行。如果有一些包含非周期性循环的迹线,则循环执行是不规则执行。 对于不规则执行,我们无法静态确定循环的执行模式,因为循环是非周期性的。 因此,我们无法计算每个路径的执行次数。

提议的循环分类。 根据路径条件的值变化模式和路径交织模式,我们定义了循环分类,如表 1 所示。第一行表示我们根据路径中的每个原子条件是否对多路径循环进行了分类。 循环的条件是 IV 条件(类型 1 和 2)或存在一些 NIV 条件(类型 3 和 4)。 第一列显示路径交织模式的标准,即,循环的所有可行执行是顺序的还是周期性的(类型 1 和 3),或者是否存在一些不规则的循环执行(类型 2 和 4)。 这种循环分类有助于理解循环汇总的难度,即可以精确地概括哪些循环,可以近似地概括哪些循环以及难以概括的循环。

与整数算术相关的循环通常属于类型 1;而整数则属于 1 类。遍历数据结构的循环通常属于类型 3 和 4,因为循环迭代取决于数据结构的内容。直观地讲,具有 NIV 条件的循环(例如与复杂数据结构相关的循环)往往具有不规则的执行方式,因为路径交织取决于非归纳变量,非归纳变量具有不规则的值变化,并且经常导致非周期性变量之间的非周期性循环。

3.3 循环分析框架

图 3 显示了 Proteus 的工作流程。它以循环和一组感兴趣的变量作为输入,并报告感兴趣变量的循环摘要。 感兴趣的变量由使用循环摘要的客户端分析给出。在感兴趣的变量的指导下,Proteus 可以进一步简化循环,从而更有效地生成摘要。如果未指定感兴趣的变量,Proteus 将尝试为循环中的所有变量生成摘要。

b35c2ad26911584189740aa92a3d5870.png

图 3 Proteus 框架图概览

Proteus 包含四个步骤来总结一个循环。 步骤 1 使用感兴趣的变量作为切片标准执行程序切片,并为切片循环程序构建控制流图。

从 CFG,我们可以根据循环条件直接确定循环的类型。如果循环中的所有条件都是 IV 条件,则该循环属于类型 1 或 2; 否则,该循环属于类型 3 或 4。由于不确定的值变化而对 NIV 进行汇总非常具有挑战性,因此我们提供了一些近似技术(步骤 2)将类型 3 和 4 的循环转换为类型 1 或 2。近似值可能会导致不精确的汇总,但在特定应用中可能仍然有用且有效。

在步骤 3 中,Proteus 提取路径条件并分析任何两条路径之间的依赖性。我们为类型 1 和类型 2 循环构造 PDA,以捕获路径的执行顺序和路径交织模式。我们可以为 1 型和 2 型回路构造 PDA。

在第 4 步中,我们在 PDA 上执行路径枚举过程,以检查 PDA 中每条迹线的可行性并总结其影响。循环摘要是所有可行跟踪摘要的分离。

4 构建 PDA

4.1 循环切片

循环切片可删除不相关的指令,从而减少构造的 CFG 中的不相关路径。因此,它使摘要更加有效。循环切片基于程序依赖图(PDG),该程序将控制流依赖关系和数据流依赖关系相结合。考虑到两种类型的依赖关系,我们从分配标准中确定了相关的指令。我们用实例 6 来说明确定相关指令的基本思想。

4.2 计算循环路径中的第 n 项数字

序列的第 n 项计算是一个经典的数学问题,可以使用序列和序列中的领域知识进行计算。 在这里,我们考虑以下顺序。

  • 基本顺序。 算术序列(xn=x0+cn),几何序列(xn=x0cn)和常数序列(xn=c)是基本序列,其中 c 是常数。我们可以通过定义轻松地计算第 n 个项。
  • 相关序列。 如果一个序列依赖于另一个序列,例如 xn=xn-1+yn,xn=yn 或 xn=xn-1*yn,其中 yn 是一个已知序列,则它是一个从属序列,我们可以计算其第 n 个项。

基于这两种序列,我们可以在循环中执行 n 次路径后计算变量的值。例如,在循环迭代期间,如果在路径的一次执行中将 x 更新为 x:=x+c,则 x 的值是算术序列,在一次执行的 a 中将 x 更新为 x:=xc 时,x 的值是几何序列。路径,以及一个常数序列(如果 x 在路径的一次执行中更新为 x:=c,其中 c 是常数)。如果在路径的一次执行中 x 更新为 x:=x+y,并且 y 是路径中的已知序列,则我们可以计算具有相关序列的第 n 个项。在图 2 中,变量 σ 的值是一个从属序列,因为我们可以在 σ2 中找到 m:=m+(i-j),而 i-j 是一个算术序列。因此,我们可以计算出 mn=m0+n(2i0-2j0-n+1)/2。请注意,通过对路径中的语句序列执行数据流分析来推断变量的更新。

如果在循环迭代期间无法计算 x 的第 n 个项,则将其视为 NIV。请注意,第 n 个项的计算与我们的循环摘要正交,并且可以使用更高级的算法进行扩展。

4.3 构造 PDA

5f30bbe4a51796685699188cd0bc371f.png

5 型循环概述

5.1 非循环 PDA 的概述

cc2ab7dac366d7cb2fa4b0b630abb50c.png
5a1ab393a56fb0b6c87f7690db009f4e.png
bb586954e877ae95fc763b07114e133f.png

5.2 具有简单周期的 PDA 的汇总

对于算法 2,对包含周期的轨迹进行汇总具有挑战性,因为周期的执行计数不确定,这可能会导致算法无法终止。

18e40005a3731e620eed70cfce3585a0.png
31ae2b2fd200c9a2c0fbfb732656f63b.png
fecb1db8470217883fe3a224e11e8339.png
77d9d99724e82eb428ab5351498f7fbd.png

图 4 PDA 的不同结构 图 5 周期循环执行

31c72d5fd71d6472600681e7db40c945.png
5d4a838e061dde03f355961221c3cc41.png
4c56938e877d634218053e3b128494c5.png

5.3 具有连接周期的 PDA 的总结

由于周期之间的交错,总结具有连接周期的 PDA 并非易事。例如,在图 4c 中,一个跟踪可以执行

884c87d64bb4a623e12158ca2a1eea95.png
1954f98af224858650ec4427dd5ea3e5.png

。该迹线不仅包含状态之间的交织(例如 q1 和 q2),还包含周期之间的交织(例如(q1,q2),(q2,q3)和(q3,q1))。由于周期之间的交错,迹线的长度是不确定的。为了降低复杂度,我们可以尝试计算循环的依赖性,这与路径依赖性相似。如果我们可以推断出在某些前提下循环的执行是顺序的(即循环之间没有交织),那么我们可以通过汇总 PDA 中的一系列简单循环来总结循环。

实际上,嵌套循环的 PDA 通常包含连接的循环,因为可以连接来自外部循环和内部循环的循环。 但是,许多连接的循环通常是连续的(例如,对于普通的矩形环和三角形环)。 即使对于某些复杂的嵌套循环,在某些前提条件下,它们的连接循环也可以是连续的。

算法 4 给出了处理连接循环的主要过程。给定一个具有连接周期的 PDA,我们使用算法 2 从状态 q 遍历它,并遍历每条迹线 tr(第 1 行)。在遍历期间,如果检测到一个循环,则我们检查它是否已在之前的跟踪中汇总(第 3 行)。如果循环出现在前面,表示循环之间存在交错,则我们无法处理这种情况(第 4 行)。否则,我们用算法 3(第 6 行)总结每个简单周期 c,然后继续总结 c 的每个后继(第 8 行)。

5.4 健全性

508d8016a20ab7c540cdb23c06750293.png

6 类型 2、3 和 4 循环的摘要

精确总结类型 2、3 和 4 的循环并非易事,因为它们包含 NIV 条件,不规则执行或两者。 我们为 Proteus 引入了几种近似技术,以利于汇总,这将使摘要过于近似,这可能会导致发现错误的缺陷,但对于其他应用仍然有效,例如证明安全性,终止分析和边界分析。

NIV 条件。由于非归纳变量的值变化不可预测,因此很难概括 NIV 条件。算法 2 无法汇总具有非归纳变量的循环,因为我们无法计算其第 n 个项(在算法 2 的第 7 行),也无法为每两个状态之间的状态计数器(即 k)限制范围。我们介绍了以下三种策略来计算摘要。

1)对于非归纳变量,我们应用区间近似来使用不等式计算变量的汇总。

2)对于某些特定的 NIV 条件,例如可以使路径执行一次的模运算或布尔变量,我们还可以总结这些循环。

3)对于 NIV 条件(假设是 p),其值取决于输入或上下文,但不依赖于循环执行,我们将 p 和 p 抽象为 true,这也是一个过度逼近的情况。 然后,我们无需计算其第 n 个项。 例如,在 NIV 条件下 a[i]> 3,a[i]的值取决于数组 a 的值而不是循环迭代,因此我们认为 a[i]

> 3 和 a[i]<3 为真因为它们都可以满足。

3c452505dbb6b6e7d72340ad36159f9b.png

不规则执行。对于具有不规则路径执行的循环(例如,算法 4 无法处理的连接循环),无法确定交织模式。因此,我们不知道每个路径的迭代次数。在这种情况下,我们不考虑任何过渡中的交织顺序,而是通过为每个路径 σi 引入路径计数器 ki≥0 来考虑整个循环执行期间每个路径的总影响。ki 执行后,每个路径计数器 ki 可用于计算 IV 的值。在这里,我们假设每个变量是一个 IV,其序列是算术序列,其输出不依赖于路径的执行顺序。

定理 3 (终止)汇总算法始终终止。

7 评估

7.1 在环界分析中的应用

5fedc18c115fb71f370c85acc43b7ceb.png
26eeba798f17ab903489c989319100b6.png

表 2 实际循环的循环分类表 表 3 实际循环的循环边界分析结果

在这里,我们选择了五个开源项目。在表 2 中,正在研究的程序在第一列中列出。通过手动研究这些循环,我们发现当多路径循环包含 NIV 条件时,循环执行通常是不规则的(类型 4 循环);当循环的条件仅是 IV 条件时,循环执行可以是顺序执行或周期性执行(类型 1 循环)。NIV 条件与不定期执行之间通常存在关联。基于这些切片循环程序,我们可以计算项目中 3,096(35.3%)个循环的界限。表 3 提供了每个基准测试的详细结果。

通常,我们的方法具有三个优点:1)当一条路径中的变量未增加或减少 1 时,我们可以计算出比它们更精确的界限。2)我们的方法可以使用析取摘要为每条迹线定义更细粒度的边界。 3)我们的方法不仅可以计算循环的边界,而且可以计算每个路径的边界。

7.2 在程序验证中的应用

通过析取循环摘要,我们可以证明程序中的属性(表示为

18edfea421402ad9d4416f8e55c14759.png

)。 具体来说,有两种情况。

  • 选中的属性在循环之后。
  • 检查的属性在循环内部。
58e30bf843f0c6204545a4a1301a0439.png

表 4 将 Proteus 与最新工具进行比较时基准循环的程序验证结果

表 4 显示了这些技术的验证结果以及循环分类和汇总统计信息。结果表明,我们的技术在有效性方面略胜于这些顶级工具,而在性能方面则明显优于它们。总之,与现有工具相比,使用 DLS,Proteus 可以用更少的时间开销正确地验证更多程序,以解决我们可以总结的那些未嵌套和嵌套的循环。 因此,我们的循环摘要可以有效地补充现有工具。

7.3 在测试用例生成中的应用

在本实验中,我们展示了循环摘要在测试用例生成中的有效性。我们使用 loop-acc 将我们的技术与符号执行工具 KLEE 和 Pex 的性能进行了比较,这些程序包含深层循环(具有较大的循环迭代)。

02d7930fb395fab6d3a68aa6de7adbc5.png

表 5 将 Proteus 与符号执行工具 KLEE 和 Pex 进行比较时,测试用例生成结果

表 5 显示了七个程序的结果。前四个程序来自 loop-acc,而我们添加的 if 分支中的条件来自于程序中的断言。结果表明,即使对于简单的循环,KLEE 对于三个程序也会超时,而对于三个程序则要花费更多的时间。Pex 无法为四个程序生成测试用例,并为一个程序超时。相反,Proteus 在不到一秒钟的时间内为所有程序生成了测试用例。

结论和未来工作:

在本文中,我们提出了路径依赖自动机,以对多路径循环中每两个路径之间的依赖进行建模。 基于 PDA,我们提出了一种多路径循环的分类方法,以了解循环汇总的难度,并提出了一种循环分析框架 Proteus 来计算不同类型循环的分离循环摘要。将来,我们计划在三个方面继续进行这一研究:1)我们计划扩展 PDA 以进行递归功能汇总。2)我们希望对类型 2、3 和 4 的循环提出系统的总结。3)我们计划将循环摘要应用于软件工程和安全任务,例如漏洞检测,编译器优化和程序调试。

致谢

本文由南京大学软件学院 2020 级硕士王旭翻译转述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值