EdSketch: Execution-Driven Sketching for Java ( ISSTA ‘17) 论文笔记

EdSketch是一种执行驱动的程序草图合成方法,专注于Java语言,用于填充用户编写的部分程序中的漏洞。它使用反例引导的归纳综合,通过测试套件验证候选程序并进行回溯搜索。EdSketch引入了有效的剪枝策略,减少了搜索空间,支持高级语法如反射和本地调用。相比于基于SAT的工具,EdSketch在处理复杂结构的程序时表现出更好的效果。

EdSketch: Execution-Driven Sketching for Java ( ISSTA '17)

info


summary

关注填洞规则是,有类型则只找这个,没有类型就随机生成;比基于SAT的方法效果好
评分/5⭐⭐⭐⭐
总结对于sketch上的hole,会生成一个list,然后补全所有的hole之后,利用单元测试的方法来验证是否满足意图。如果不满足,回溯到上一个hole然后访问list的其他代码片段。然后还有一些基于java语法的剪枝策略。
亮点hole包括了if和while的condition, 表达式语句,赋值语句。语句生成根据返回类型从list中选择,如果不是赋值,就随机选;支持java的高级语法,一些reflection, 本地调用等
缺憾sketch的hole需要由用户指定一些详细信息才行;sketch也是用户提供的,不是自动得到的

metadata

Hua, Jinru; Khurshid, Sarfraz (2017): EdSketch: execution-driven sketching for Java. In Hakan Erdogmus (Ed.): Proceedings of the 24th ACM SIGSOFT International SPIN Symposium on Model Checking of Software. ISSTA '17: International Symposium on Software Testing and Analysis. Santa Barbara CA USA, 13 07 2017 14 07 2017. New York, NY: ACM, pp. 162–171.

下面是论文内容节选。

1 INTRODUCTION


程序草图[26]是一种程序综合的方法[1, 7, 19, 29],允许用户编写有 "漏洞 "的部分程序,并让综合工具填补这些漏洞,使完成的程序满足给定的测试线束或参考实现。现有的草图方法[15, 26]将部分程序翻译成命题可满足性公式,并利用反例引导的归纳综合(CEGIS),在现成的求解器基础上生成具有期望功能的程序。 虽然这些基于翻译的方法在一系列的程序上显示了它们的有效性,但它们有一个关键的限制:当应用于具有复杂库的实际应用时,这些 基于翻译的方法需要翻译所有直接或间接被给定草图调用的库,或者创建这些库的模型,这可能导致不实际的SAT问题。

本文介绍了EdSketch,这是一种新颖的方法,使用软件模型检查器中常用的反追踪深度优先搜索,执行执行驱动的草图来合成Java程序。我们工作的关键创新之处在于引入了有效的剪枝策略,以减少可能解决方案的搜索空间,并有效地探索存在库的实际程序行为。EdSketch提供了一个实用的解决方案,用于勾画现实世界中具有复杂结构(如反射或本地调用)的小部分应用程序。

作为输入,EdSketch需要一个带有使用Java语法编写的漏洞的草图(部分程序),以及一个描述正确性规范的测试套件。EdSketch基本上支持三种类型的漏洞:布尔条件(例如,对于一个while循环),表达式(例如,字段解读),以及赋值语句块。 EdSketch利用给定的草图在程序中引入非决定性,这使得回溯搜索可以探索候选程序的空间。EdSketch针对插桩的程序执行测试套件,并在遇到失败(运行时失败或测试断言失败)时进行回溯搜索。 当候选程序的空间被耗尽或找到满足所有测试的完整程序时,EdSketch就会终止。
为了初始化搜索,EdSketch根据用户给出的目标类型为表达孔生成候选表达式。候选表达式是根据用户提供的可见变量或变量来计算的。例如,使用最多两个字段的转引,从代表单链表中一个条目的变量e派生出的Entry类型的表达式应该是{e, e.next, e.next.next},其中字段next代表链表的下一个条目。也就是所谓的根据表达式返回类型生成表达式!

EdSketch引入了两个关键的修剪策略来优化草图的完成。 这些策略对赋值语句块和条件表达式的冗余候选者进行修剪。

  1. 对于赋值语句块的草图,我们定义了一套基于Java语义的剪裁规则。
  2. 对于条件草图,我们引入了一个值分组策略,根据当前执行点的值(真和假),将所有条件候选者分成两组。 条件候选者是通过将表达式候选者与条件运算符结合起来产生的。 我们为非原始表达式定义了两个条件运算符"==“和”!=",为原始类型定义了六个运算符{==、!=、>、<、>=、<=}。 使用值分组策略,EdSketch在评估一个条件时只考虑两个选择,即所有评估为真的条件候选者将被视为一个候选者。 一组候选条件可以被分割成更小的集合,例如,候选条件e != null在循环的第一次迭代中可能为真,而在下一次迭代中为假,其中e是单链表的一个条目对象。 这个候选条件将在第一次迭代中被放入trueSet,在第二次迭代中被放入falseSet。

本文有以下贡献:

  1. 执行驱动的草图。我们为使用测试的程序草图引入了一种执行驱动的方法;
  2. 修剪策略。我们引入了修剪策略,以减少对候选表达式、条件和语句的探索选择;
  3. 体现。我们将EdSketch体现在两个原型中:一个是基于有状态的模型检查器JPF[31],另一个是基于VeriSoft模型检查器[10]的精神,使用重新执行的专用无状态搜索;
  4. 评估。我们提出了一个实验性评估,将EdSketch与基于SAT的Sketch工具进行比较,并证明EdSketch可以处理复杂的结构。

2 MOTIVATING EXAMPLE


在这里插入图片描述

用户可以指定在while块中勾画的语句数量;默认情况下,EdSketch每次递增一个赋值,直到找到第一个解决方案或达到预设的赋值上限。EdSketch先生成代码,然后如果不通过,就不断回溯搜。

3 APPROACH


我们将在本节中描述执行驱动的草图。如图2所示,EdSketch首先基于程序草图P和字段解引用b的默认边界(章节3.2)在表达式级别构造所有候选对象。然后EdSketch对程序进行检测,使其能够动态地为“孔”选择候选者(章节3.3)。第3.4节描述了我们在通过测试执行(T)评估候选对象时应用于草图分配和条件的修剪策略。第3.5节讨论了我们用于有状态原型(EdSketch-JPF)和无状态原型(EdSketch-JVM)的回溯引擎。按照hole来生成其中的每个表达式
在这里插入图片描述

3.1 Partial Expression Syntax

为了合成不确定空洞,EdSketch需要为表达式空洞指定表达式类型,或者为条件语句块和赋值语句块指定左右两边表达式类型。
用户需要提供的:

  1. 为表达式空洞指定表达式类型,或者为条件语句块和赋值语句块指定左右两边表达式类型
  2. 为每个洞分配一个唯一的标识符,以区分不同的洞
  3. 提供在合成中使用的根变量的名称和引用。名称用于打印解决方案,引用用于使用反射生成候选表达式

例子:

Entry.hole_type(?不确定可能是那类型, index, variable_name, variable_reference)
  1. Condition Hole
EdSketch.COND(Entry.class, 0, new String[]{ “head", “ln1", “ln2", “ln3"}), new Object[]{head, ln1, ln2, ln3});
  1. Block Hole
EdSketch. BLOCK(Entry.class, 0, new String[]{“head", “ln1", “ln2", “ln3"}), new Object[]{head, ln1, ln2, ln3}).
  1. Expression Hole
Entry ln2 = (Entry) EdSketch.EXP(Entry.class, 0, new String[]{“head", “ln1", “ln2", “ln3"}), new Object[]{head, ln1, ln2, ln3}).

3.2 Expression Candidate Generation

在这里插入图片描述

所以他是先随机生成,然后按照表达式的类型,来筛选那些满足类型的生成片段。
每个洞都会有个list,如果没有通过测试用例,在回溯时会从这里list里选择list的其他元素。

3.3 Program Instrumentation

为了在程序中引入不确定性,并允许回溯搜索以探索候选程序的空间,我们基于候选表达式对程序进行插装。接下来,我们将描述如何对用户给出的原始草图进行插装,并将其转换为可执行程序,以通过测试套件进行验证。图3展示了激励示例的插装程序,并使用“+”信号突出显示了新插装的代码。

==循环会限制最长迭代次数,这个参数用户可以自行配置。对于接下来的赋值表达式生成,先用for循环遍历list中的表达式作为等式的右侧,==然后根据“hole”的候选标识符选择左边的表达式,左右联合写等号就构成了赋值表达式。 只会为可以赋值的变量和字段访问生成case语句,但不会为这个对象生成case语句,如array等不可修改的字段。长度,以及默认候选值,如null、−1或0。

3.4 Pruning Strategies

3.4.1 Assignment Pruning.

基于Java语法和程序同构分析,定义了4条剪枝规则。

源表达式剪枝后
e1 = e1省略
v1 = v2;v2 = v1v1=v2
v1 = v2;v1 = v3v1 = v3
v3 = v1;v2 = v1, while id(v3) > id(v2)." v2 = v1;v3 = v1 “和” v3 = v1;v2 = v1 "视为同构解

3.4.2 Condition Pruning.

Condition Candidate Generation.。在第一次访问条件草图时,EdSketch通过将表达式候选项与条件操作符相结合来生成所有条件候选项。我们定义了两个条件运算符{==,!=}用于非基本类型,6个用于基本类型的条件运算符{==, ! =, >, <, >=,<=}.。基本类型操作符也适用于相应的包装类,如Integer。
我们只需要考虑组合e1 op e2其中id(e1)<Id (e2)的程序对称性。假设e1和e2是两个候选非基元表达式,且e1的候选标识符小于e2,我们只需要考虑条件e1 == e2和e1!= e2,因为e2 = e1和e2!= e1与前两个候选值相等。例如,假设我们有5个基本类型为int的候选表达式,EdSketch将使用6个条件操作符将每个候选表达式与具有更大标识符的候选表达式组合,从而生成60 (6 ×(4 + 3 + 2 + 1))个条件候选表达式。完全性还包括两个布尔值true和false (e1 == e1和e1!= e1)。

Condition Value Grouping.根据求值结果,生成的候选条件被进一步划分为两个集合,如算法2中的第9 ~ 13行所示。如果它不是第一次访问,EdSketch将重新评估集合中的每个候选条件,并根据新执行中每个条件候选条件的评估值划分候选集。如果EdSketch在上一次执行中选择了布尔值true,那么trueSet会在这次执行中被分割。例如,激励例子中的条件候选ln1 != null在一次迭代中可能为true,而在下一次迭代中它的值可能变为false。因此,条件候选ln1 != null在第一次迭代时被放入trueSet,在下一次迭代时被移动到faleset。
EdSketch在每次调用结束时根据两个候选集的大小选择一个布尔值,如算法2中的第26 ~ 31行所示。如果没有被评估为true的候选项,EdSketch将在算法2的第27行选择false,表示为1。如果被评估为false的候选集为空,EdSketch将选择true表示为0。getCondition方法返回选中的布尔值以及两个候选集。如果选择的值不满足测试断言,EdSketch将回溯到之前的选择,并选择一个不同的(不确定的)值。

在这里插入图片描述

3.5 Execution-Driven Sketching

如算法3所示,EdSketch执行所有测试用例,每当遇到运行时异常或测试失败时,它都会回溯并获取下一个选择,直到它已经探索了整个搜索空间或找到一个满足正确性标准的解决方案。

在这里插入图片描述

我们基于两个不同的回溯引擎构建了两个原型:一个基于Java PathFinder[31]的有状态原型和一个基于重新执行的无状态原型。

3.5.1 使用Java PathFinder的有状态原型

Java PathFinder(JPF)[31]是一个成熟的模型检查器,实现了一个定制的JVM。**JPF是一个通用的有状态模型检查器,它提供了现代软件模型检查器所支持的所有常见操作,包括对多线程程序的检查。它提供了一个默认的深度优先搜索,可以有效地存储和恢复程序状态。使用JPF作为后端来实现回溯搜索是很直接的。虽然JPF可以处理Java字节码,但它只能处理有限的本地调用,**这就限制了它在现实世界应用中的合成适用性。

3.5.2 使用重新执行的无状态原型

我们的第二个原型是基于一个专门的无状态搜索[10],使用重新执行[5]。由于这个原型在标准的JVM上执行,它**允许在开源项目的背景下进行合成,具有高级功能,如反射、I/O和本地调用。**然而,实现一个用于回溯的重新执行引擎需要精心设计,**以撤销某些状态的更新,例如对静态变量的更新,或者恢复控制搜索和剪枝的变量的值。**我们目前的实现使用启发式方法来提高效率,可能会跳过一些正确的候选者,但只输出通过所有测试的解决方案。注意,我们的有状态原型不需要对回溯进行任何特殊处理,因为JPF已经支持它了。

4 EVALUATION

我们在一个小型但复杂的数据结构基准上对EdSketch进行了评估,并说明了EdSketch绘制具有高级功能的真实世界Java代码的能力。
我们在评估中解决了以下研究问题。
与基于SAT的合成器相比,EdSketch在勾画小而复杂的主题方面的效果如何?
修剪策略是如何影响草图的搜索空间的?
EdSketch能否勾勒出具有高级语言特征的真实世界的Java程序?

为了研究EdSketch在勾画小而复杂的数据结构方面的功效,我们从java.util的源代码和算法书中选择了10个主题[4]。如表1所示,这些题目是:。二进制搜索树插入(BSTAS和BSTCD)、寻找中值(MEDAS和MEDCD)、红黑树插入(RBTAS和RBTCD)、单链表反转(LLREV)、双链表先加(DL-LAF)、双链表后加(DLLAL)和红黑树移除(RBTRM)。

图4表示EdSketch-JVM、EdSketch-JPF和Sketch synthesizer绘制不同数量任务的绘制性能时间。这是每个任务都单独画了一张图。

图5展示了三种工具在勾画条件方面的表现,包括if条件和while条件。
在这里插入图片描述在这里插入图片描述

5 RELATEDWORK

Angelic Programming.。与我们的方法类似,天使编程[2]利用了不确定性回溯算法[8]。Barman等人[2]将angelic choice构造嵌入到Scala编程语言中,并构建了一个并行回溯求解器来探索他们的回溯求解器的可扩展性。由于没有任何剪枝策略,该方法比Sketch合成器的扩展速度快得多。实验表明,所提出的剪枝策略是有效的,EdSketch在该数据集上的性能与基于sat的合成器相当,甚至更快。

6 CONCLUSION

本文提出了一种新的执行驱动的草图方法,它使用回溯搜索来合成Java程序。我们的关键见解是引入有效的剪枝策略,以减少解决方案的搜索空间,并通过执行给定的测试套件探索实际的程序行为。EdSketch可以合成现实世界中的Java代码,这些代码可能使用命令式语言的复杂结构,如反射和本地调用。我们的实验表明,在我们的数据集上,我们的方法与基于SAT的合成器相当,甚至更快,并且可以应用于具有高级语言特征的开源项目。我们相信,我们的执行驱动方法是解决各类合成问题的实用和可扩展的关键,包括那些在程序修复中出现的与测试案例有关的实词缺陷。

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 ### 批处理脚本实现指定文件夹内所有文件与子目录的移除 #### 简介 在Windows系统环境下,批处理脚本是一种极具价值的应用工具,它能够协助用户执行一系列预先设定好的指令,达成自动化处理的目的。本说明着重阐述如何借助批处理脚本移除特定文件夹内的全部文件及子文件夹,并对几种常用技巧的效果进行剖析。 #### 批处理脚本的基础知识 批处理脚本是一种基于DOS命令行环境构建的文本性文档,其文件后缀为`.bat`。借助编写批处理脚本,使用者可以完成复杂任务流程的自动化,例如文件复制、移动、清除等动作。 #### 第一种方法:运用`RD`指令 `RD`指令专用于移除目录(即文件夹)。该指令的标准格式如下所示: ```batch RD [drive:]path [parameters] ``` 其中,`[drive:]path`代表待清除的目录路径,`[parameters]`为若干可选参数,常用的包括: - `/S`:递归式地移除目录及其所有嵌套子目录。 - `/Q`:执行静默模式,不进行确认提示。 ##### 示例1:直接运用`RD`指令 若采用`RD /S /Q c:\temp`指令来移除`C:\temp`目录中的所有文件及子文件夹,将连同`temp`目录本体一同被清除。 ```batch rd /s /q c:\temp ``` #### 第二种方法:灵活运用`RD`指令 为防止误删`temp`目录本身,可以通过先利用`RD`指令清空`temp`目录内的所有内容,随后重新构建`temp`目录的技巧来实现。 ##### 示例2:灵活运用`RD`指令 ```batch rd ...
内容概要:本文系统阐述了物理信息神经网络(PINNs)在求解布洛赫-托雷(Bloch-Torrey)方程中的具体应用,结合PyTorch框架提供了完整的Python代码实现。该方法通过将偏微分方程的物理规律嵌入神经网络的损失函数中,使模型在训练过程中同时满足初始条件、边界条件和控制方程,从而实现对复杂物理系统的高精度数值求解。文中详细介绍了网络架构设计、物理约束的数学表达与损失项构建、训练流程优化及求解结果的可视化分析,充分展现了PINNs在处理传统数值方法难以应对的高维、非线性及复杂几何域问题上的强大能力与独特优势。; 适合人群:具备深度学习理论基础与偏微分方程求解背景的研究生、科研人员及工程技术人员,尤其适合熟悉Python编程语言和PyTorch深度学习框架的学习者。; 使用场景及目标:①为求解布洛赫-托雷方程等复杂物理场问题提供一种高效、灵活的替代方案,克服传统有限元或有限差分法在网格划分和高维计算上的局限;②作为PINNs在传质、扩散-反应、医学成像等科学计算领域的典型应用案例,为相关研究提供技术参考;③推动数据驱动方法与第一性原理物理模型深度融合的科学研究范式发展。; 阅读建议:建议读者结合提供的代码进行逐模块运行与调试,重点理解如何将物理定律精确地转化为可微分的损失函数项,并鼓励尝试将其迁移至其他类似的偏微分方程求解任务中,以深化对PINNs核心思想与实现技巧的掌握。
内容概要:本文围绕基于双阀值区间扰动观察法与带预测模型模糊PID控制法的光伏MPPT(最大功率点跟踪)控制策略展开研究,旨在提升光伏发电系统在复杂环境下的动态响应速度与稳态精度。通过Simulink搭建完整的控制系统仿真模型,融合传统扰动观察法的快速性与模糊PID控制的自适应能力,引入双阀值区间机制有效抑制光照突变时的功率振荡,增强系统鲁棒性。研究详细分析了双阀值设定原则、模糊规则库构建方法以及预测模型在控制决策中的作用,并在多种工况下验证了该复合控制策略相较于传统方法在追踪效率、稳定性及抗干扰能力方面的优越性,具有较强的工程应用价值。; 适合人群:具备电力电子、自动控制理论及MATLAB/Simulink仿真基础,从事新能源发电、光伏逆变器开发、智能控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高性能光伏MPPT控制器的设计与优化;②为复合智能控制策略(如模糊控制+扰动观察法)在可再生能源系统中的应用提供理论依据与仿真范例;③支撑科研项目开发、高水平论文撰写或先进算法的复现与改进。; 阅读建议:建议结合文中所述仿真模型进行动手实践,重点探究双阀值参数整定与模糊推理机制对系统性能的影响,进一步可在多变环境(如快速阴影遮挡、温度波动)下开展鲁棒性测试,深化对智能MPPT控制机理的理解。
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 AT命令(Attention command)是一系列用于控制调制解调器及其他通信设备的文本指令,这些指令通过串行接口发送至目标设备。CME(Command Mode Extensions)错误是在使用AT命令集与GSM模块进行通信时可能遇到的一种错误响应类型。在"+CME ERROR"标识之后,通常会附带一个错误代码,该代码能够指示出具体的错误状况,从而帮助开发者识别并处理相关故障。在深入探讨"+CME ERROR"的细节之前,有必要先熟悉一些基本概念。AT命令集最初由Hayes公司开发用于Smartmodem通信指令集,随后发展成为行业标准,并在GSM模块和电话设备中得到广泛采纳。AT命令集以"AT"(Attention)作为前缀,后面跟随具体指令,比如ATD用于发起通话,ATH用于终止通话等。 在AT命令集的框架内,CME错误属于扩展错误报告(+CEER)的一种形式。此类错误信息通常在模块无法执行某个特定指令,或者在执行指令过程中遭遇障碍时被返回。开发者可以通过参考模块的AT命令手册来获取错误代码的详细说明。 "CME ERROR"是由模块发出的错误信号,其含义为“移动设备错误”。这类错误信息对于从事移动硬件开发的人员来说至关重要,因为它们直接影响设备与模块之间的通信效率。开发者可以通过分析错误信息来优化代码,确保AT命令能够被准确执行。 文档中所提及的AT命令手册是针对固件版本4.33及以上版本的接口使用指南。手册内容涵盖了命令的概览、功能说明、信息反馈以及结果代码等。手册中的每一个AT命令都有其特定的用途,例如配置线路、请求SIM卡详情、控制电话功能、管理电话簿、报...
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 标题《Arduino编程语言参考大全(官方网站)》表明了这份文档是官方提供的关于Arduino编程语言的详尽参考资料。Arduino是一种基于简单易用的硬件和软件平台,在电子原型设计和交互式项目领域得到了广泛的应用。文档阐述了Arduino程序由三大部分构成:结构(Structure)、值(变量和常量)以及函数(Functions)。 在结构(Structure)部分,文档列举了控制结构,比如setup()和loop()函数,它们构成了Arduino程序的基础框架。setup()函数在程序启动时仅执行一次,主要承担初始化设置的任务;loop()函数在setup()函数执行完成后开始连续循环执行。控制结构还包括条件语句(例如if-else、switch-case)和循环语句(比如for、while、do-while)。此外,还包含了跳转语句(如break、continue、return、goto)以及语法元素(如分号、大括号、注释、宏定义等)。还提到了算术运算符、关系运算符、比较运算符、布尔运算符、指针访问运算符、位运算符、复合运算符,这些都是编程中用于数据操作和控制流的常用工具。 在值(变量和常量)部分,文档介绍了常量(如HIGH、LOW、INPUT、OUTPUT等)、数据类型(如void、boolean、char、int、word、long、float、double、String等)。其中,数据类型决定了变量可以存储的数据大小和类型,Arduino语言支持多种基本数据类型以及String对象。另外,还提到了变量作用域与限定符、类型转换函数以及一些工具函数。 函数(Funct...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值