跳到主要内容
研究论文
开放式访问

JMLKelinci+:使用Coverage-guided模糊化和运行时断言检查检测语义错误并使用有效输入覆盖分支

出版:2024年3月20日出版历史

跳过抽象节

摘要

测试来检测语义错误是至关重要的,尤其是对于关键系统。Coverage-guided fuzzing(CGF)和runtime assertion checking(RAC)是检测语义错误的两种众所周知的方法。CGF旨在生成代码覆盖率高的测试输入。然而,虽然CGF工具可以配备消毒剂来检测一组固定的语义错误,但它们只能检测导致崩溃的错误。因此,我们要解决的第一个问题是如何帮助模糊器检测以前未知的语义错误,这些错误不会导致崩溃。此外,CGF工具可能不一定使用有效输入覆盖所有分支,尽管无效输入对于检测语义错误是无用的。因此,第二个问题是如何引导模糊器仅使用有效输入来最大化覆盖范围。然而,RAC动态监视程序的预期行为,并且仅当有效的测试输入显示程序不满足其规范时,才能检测到语义错误。因此,第三个问题是如何为可能触发潜在错误的RAC提供高质量的测试输入。CGF工具和RAC的结合解决了这些问题,可以用有效的输入覆盖分支并有效地检测语义错误。我们的研究使用RAC来确保只有有效的输入才能通过程序的指定前提条件到达测试程序,并且它还使用RAC通过指定的后置条件检测语义错误。为此研究开发了一个原型工具,名为JMLKelinci+。我们的结果表明,将CGF工具与RAC相结合将导致只使用有效输入执行测试程序,并且该技术可以有效地检测语义错误。此外,这个想法改进了对CGF工具的反馈,使其能够在具有非平凡前提条件的程序中更快地覆盖所有分支。1

跳过1介绍和动机部分

1简介与动机

检测软件错误是一个耗时且具有挑战性的过程。它对关键系统尤其重要;例如,在区块链系统中发现了重要的错误[40]OpenSSH协议的实现[42,133]. 此外,在错误修复的程序中也会发现软件错误,例如在由自动程序修复工具生成的修复程序中[75,99,103,120]. 有几种方法被用于检测软件错误;在这项研究中,我们使用了运行时断言检查[31,72,84,87]和覆盖引导起毛[85,86,95,134].

运行时断言检查(RAC)在程序测试(或其他运行)期间检查正式规范,以检测违反程序指定行为的情况。然而,正式规范是有条件的;只有当输入满足程序的前提条件时,运行程序并通过检查程序的后条件来检查语义错误才有意义。因此,a语义错误在满足程序前提条件的输入状态下启动时,程序行为无法满足程序的后置条件(没有必要使程序崩溃)。这就是为什么必须为程序的输入方法提供有效的输入。然而,RAC是不完整的,因为它只能在测试期间发现错误。因此,我们首先讨论如何生成有效的输入测试,以帮助RAC工具检测语义错误。

创建高质量输入测试(也用于检测程序崩溃)的一种方法是使用覆盖引导的模糊化工具,如AFL[132].模糊是生成随机输入以检测程序崩溃的过程。覆盖引导模糊(CGF)使用测试运行的反馈来生成可能增加代码覆盖率的输入。然而,CGF工具只能检测导致崩溃的程序错误。此外,CGF工具可能会生成许多无效的输入,这些输入对于检测语义错误毫无用处。此外,使用无效输入运行程序有时非常耗时,可能导致无限循环(从而导致超时)。

早期研究[39,69,76,106]确认并强调了提供有效输入以帮助CGF并使测试过程更加高效的重要性。大多数CGF工具都使用一个驱动程序,该驱动程序将模糊器生成的输入数据转换为程序所需的类型作为输入。此外,驱动程序可以使用该输入数据为程序生成有效输入。然而,这些驱动程序并不能保证所有输入都有效。因此,我们要解决的第二个问题是如何使用CGF工具,以便它只运行测试中的程序(PUT)使用有效输入。已经提出了不同的方法来过滤来自模糊器的无效输入,例如使用污点分析[118]和机器学习[51]. 然而,这些技术并不能保证它们会捕获并忽略所有无效输入。

回想一下,模糊器(包括CGF工具)只能检测程序崩溃,无法检测不会导致崩溃的语义错误。因此,我们要解决的第三个问题是CGF工具在检测不会导致程序崩溃的语义错误方面的局限性。漏洞缓解和消毒剂是模糊化用于检测安全漏洞漏洞的两种方法[121]. 这些方法主要用于预防和检测安全漏洞,如内存安全违规和指针问题。尽管我们使用正式规范和RAC,但消毒剂方法激发了我们检测语义错误的方法。

为了解决这些问题,我们建议以互补的方式将CGF工具和RAC结合起来。使用形式化前提条件和RAC可以确保只使用有效输入运行PUT;这将有助于CGF有效地生成更好的测试,从而解决第二个问题。此外,通过仅使用有效输入运行PUT,并在运行程序期间监控代码覆盖率以增加它,并向CGF提供反馈,CGF工具可以提供有效且高质量的测试来解决第一个问题。此外,CGF工具和RAC的结合允许检查后置条件和内部形式断言,以检测所有类型的语义错误模式,而不仅仅是导致程序崩溃的模式,这解决了第三个问题。我们通过结合Hoare风格来证明这一想法[2,59,93]形式行为规范语言Java建模语言(JML)[17,77,78,79,80,81,82,83],及其RAC工具[26,34]使用名为Kelinci的CGF工具[69,105]检测语义错误并在Java程序中仅使用有效输入覆盖分支。我们将此组合称为JMLKelinci+,因为它使用JML的RAC[33,34,35]测试程序的形式规范和Kelinci[69]生成输入测试。虽然本文使用JML指定前置条件和后置条件,并使用Kelinci作为CGF工具,但我们的想法可以用RAC工具和其他CGF工具支持的其他形式规范语言实现。因此,JMLKelinci+可以分为灰盒测试或白盒测试,因为带有规范的源代码,或者至少输入/输出行为规范必须是可访问的。

给定一个程序P(P)及其前提条件,之前,输入是有效期至P(P)如果输入满足之前; 否则,它就是无效.如果通过运行P(P)如果输入有效,则输出不满足程序的后置条件,岗位,这意味着P(P)有一个语义错误。例如,让F类是一个阶乘程序,前提是输入应该在0和20之间(包括0和20)。因此,6是有效的输入,而21是无效的。假设6是输入F类的后置条件表示结果必须是输入的阶乘。然后RAC检测到语义错误,除非结果是720。

我们的想法是通过使用RAC检查每个生成的输入来帮助CGF。这是通过将所有无效输入定向到程序驱动程序中的一个分支来完成的;因此,当CGF工具试图覆盖所有分支时,它将尝试避免此类无效输入。此工具组合仅在有效输入上执行程序;因此,它就像一个只生成有效输入的CGF工具。此外,当使用有效输入运行PUT并使用RAC检查后置条件时,此组合可以检测语义错误。

如果有正式的行为规范可用,那么可以使用静态验证工具而不是CGF工具来检测语义错误。然而,成功地使用了静态验证工具,例如JML的扩展静态检查器[22,33,34,36]与使用RAC所需的规范相比,需要付出更多的努力,包括编写更详细的规范。例如,对于正式验证,需要编写循环不变量,而成功使用RAC并不需要这些不变量。此外,编写前置和后置条件比编写静态验证所需的所有规范要简单得多。事实上,使用JMLKelinci+,只需为被测试程序的入口方法(以及任何所需的构造函数)编写一个前置条件和后置条件。因此,PUT中的所有方法都不需要正式规范。这种需要正式规范的方法数量的减少和对内部规范(如循环不变量)的需求的减少都减少了将RAC与CGF工具一起使用所需的工作量。

我们的结果表明,JMLKelinci+只使用有效输入覆盖PUT的所有分支,这是利用RAC和CGF工具的优点检测语义错误的第一步。此外,标准的Kelinci本身并不能覆盖非平凡项目的所有分支2前提条件。由于运行无效测试可能非常耗时,对于一些具有重要前提条件的程序,JMLKelinci+比标准Kelinci更快地覆盖分支。在我们的实验中,JMLKelinci+使用有效输入检测数据集中的所有语义错误;然而,标准的Kelinci只检测到导致程序崩溃的语义错误。找到显示错误的有效输入对调试很有用;这种技术还可以提高自动化程序修复工具的效率[53,101,102].

跳过2相关工作部分

2相关工作

回想一下,我们的研究解决的问题是(1)用有效输入覆盖程序的分支,(2)检测语义错误。在本节中,我们将讨论解决这些问题的早期工作。

2.1用有效输入覆盖分支

不同的作者提出了生成有效输入的方法。在基于语法的模糊化中[43,49,60,66]例如,使用生成器(基于某些语法或类似模型)生成具有特定结构的有效输入。还可以为几个网络协议模糊器提供输入结构的规范或语法,包括SNOOZE[6]和TFuzz[67]. 一些内核API模糊器提供了指定输入参数数量和类型的模板,如syzkaller[52].

此外,使用符号执行是收集PUT中分支信息的常用方法[5,70]. 符号执行的结果可用于生成(通过使用SMT解算器)新的有效输入测试,以覆盖新的分支。然而,本研究关注能够满足前提条件的有效输入。此外,符号执行通常比模糊化产生更大的计算开销,在测试广泛或复杂的软件系统时可能会限制其可伸缩性。符号执行还需要准确建模软件环境,包括库和API。准确构建此类模型可能是一项具有挑战性的任务;相反,在本文中,我们只需要先决条件就可以用entry方法的有效输入覆盖分支。

此外,一些模糊器是为特定语言设计的,语言及其类型的模型内置于模糊器中,用于生成有效的输入,如funfuzz[73]用于JavaScript。相比之下,我们的想法不仅限于特定的输入结构格式或语言,而且可以与任何可以为RAC指定前提条件的编程语言一起工作。

还使用了其他几种技术来提高生成有效输入的概率。Godefroid等人。[51]使用机器学习为PUT构造语法,并使用基于语法的模糊器创建有效输入。Rajpal等人。[116]建议使用深度学习来预测选定输入的哪些字节应该变异以创建有效输入。TaintScope(泰恩显微镜)[126]使用污点分析绕过无效输入。然而,虽然这些方法增加了生成有效输入的概率,但它们不能保证发送到PUT的所有输入都是有效的。

几个工程[27,113,129,135]使用RAC来决定测试是否通过,但要求用户生成自己的测试数据或提供(少量)测试数据。然而,这些工作并没有试图实现代码覆盖。

其他一些工具[,7,15,16,18,48,50,92,124]使用符号执行和/或模型检查(基于模型的测试)来生成输入测试。然而,他们不使用分支覆盖率指标;因为这些工具使用模型检查,它们的执行时间取决于PUT的大小,所以它们的可伸缩性有限。

科拉特[13,94]与我们的工作类似,它使用JML先决条件验证输入。然而,虽然Korat可以自动创建复杂数据结构的输入,但Korat不会测量分支覆盖率或尝试增加它。此外,Korat的可扩展性有限。未来的工作可以考虑将Korat的技术与我们的技术相结合,或许可以实现更自动的测试复杂输入的合成。

一些研究[20,106,107,122,123,125]将模糊处理与符号执行相结合。这些工作添加了一些使用符号执行生成的有效测试,以及变异语料库的符号方法所使用的前提条件,以指导模糊器生成更好的测试。然而,它们不能保证所有生成的输入都是有效的(通过模糊器生成有效输入并不是此类模糊器的主要目标)。

以下工具测量代码覆盖率,并尝试在生成测试套件时改进代码覆盖率:EvoSuite[45,46,47]、兰多普[109,110]和TSTL[54,55,63]. 然而,它们不能保证只有有效的输入被传递到PUT。TSTL允许指定在测试期间必须保持的不变属性,但不允许指定先决条件。Randoop可以用断言记录程序行为,但不基于用户特定的前提条件过滤输入,这将保证只有有效的输入被传递到PUT。

2.2检测语义错误

已经使用了几种静态和动态方法来检测语义错误,一些密切相关的方法使用模糊器。

2.2.1静态方法。

静态形式验证技术是检测错误和证明PUT正确性的黄金标准[8,12,41]. 当形式验证技术不能证明程序的正确性时,它们通常会提供一个反例来证明PUT中存在的错误[10,30,56,100]. 符号执行和模型检查是最常用的验证技术,用于验证程序和检测错误[14,25,32,96,117,130]. 然而,为程序中的每种方法提供完整的行为规范,这是使用模块化静态分析技术所必需的,被认为是昂贵的(尽管这可能是一个神话[57]). 因此形式验证主要用于证明安全协议和关键系统的正确性[4,28,38,58,61,119,128].

机器学习和深度学习是用于检测和预测软件错误的新技术[23,24,89,115]. 错误检测是一个二进制分类问题,在这些研究中,分类器被训练来区分正确程序和错误程序。这些技术可以有效地检测有缺陷的程序。然而,他们不能保证他们对程序的错误或正确分类是准确的。

2.2.2动态方法。

RAC公司[31,72,84,87]是一种检测语义错误的动态方法,具有与测试相同的错误检测能力。RAC工具有三个用于检测语义错误的输入:(1)PUT,(2)抽象描述PUT行为的轻量级形式规范,以及(3)有效的输入测试。RAC工具通常无法证明程序的正确性(即使没有输入测试导致断言冲突),因为输入测试通常是不完整的,程序通常具有无限的有效输入域。然而,当违反PUT规范时,RAC可以明确地检测错误。因此,RAC检测语义错误的强度取决于PUT的规范和输入测试。我们的工具通过使用CGF工具来满足输入测试的需求。

一些工具结合使用了RAC和输入测试生成[27,113,129]. 然而,这些工具只提供了一小部分输入测试,它们并不寻求通过监视测试执行来增加代码覆盖率。

基于性能的测试(PBT)[44,112]是另一种尝试通过生成随机测试来提供违反属性的测试用例的方法。Haskell的快速检查[29]是一种著名的PBT工具。PBT和我们的方法之间的主要区别在于,它们随机生成测试,并不试图增加分支覆盖率。下一小节将讨论将PBT与CGF工具相结合的一些工作。

2.2.3使用模糊器的方法。

最密切相关的工作是那些使用模糊器检测错误的工作。虽然一般来说,模糊器只适合检测导致崩溃的错误,但最近的工作试图提高模糊器检测更多类型错误的能力。利用漏洞缓解[11,21]和消毒剂[65,88,108]是两种检测更多错误的方法[121]特别是用于检测安全漏洞。在这些方法中,如果PUT行为不正确,那么PUT就会抛出导致崩溃的异常;因此,如果fuzzer生成一个导致程序崩溃的输入测试(可能无效),这些方法就会发现一个bug。这个想法启发了我们将RAC与CGF结合使用的方法。在我们的方法中,当RAC检测到后条件冲突时,它会将输入保存为反例,这由组合(CGF和RAC)工具记录。然而,一个主要区别是我们的方法只对有效输入运行PUT;因此,当检测到后置条件冲突时,该工具确实发现了语义错误。此外,消毒剂中的断言冲突会导致程序崩溃,但在我们使用CGF和RAC的方法中,它只会保存生成的测试而不会崩溃。

然而,我们的方法引导模糊器以受先前工作启发的方式增加生成有效输入的概率;也就是说,在我们的方法中,无效的输入会导致程序遍历PUT中的单个分支,然后CGF工具会尝试避免这种情况。此外,当使用我们的方法时,用户只需要为程序的输入方法(以及任何必需的构造函数)编写前置和后置条件,这些条件可以记录在辅助规范文件中;然而,要使用消毒剂,必须编写内部断言来检测不需要的状态。

其他相关工作是将CGF工具与基于属性的测试算法相结合的工具,以生成结构化输入并检测错误[74,111]. 这些算法根据提供的属性进行测试,然后使用CGF检查程序,以增加代码覆盖率并检测错误。主要区别在于,我们的技术使用后置条件(以及潜在的内联断言)来检测语义错误,而使用基于属性的测试技术的工具依赖模糊器来检测导致崩溃的错误。

跳过3BACKGROUND部分

背景

本节介绍JML及其OpenJML工具,作为正式规范语言和RAC工具的示例。此外,我们还介绍了Kelinci,这是一个CGF工具,以及用无效输入覆盖分支的问题。

3.1Java建模语言与OpenJML

JML公司[78,82]是一种用于Java的Hoare-style形式化行为接口规范语言,已用于研究[81],教育[19,114]和实际工作[38,71]. JML是一种演绎规范语言,它使用前置和后置条件指定Java方法和类的预期行为。此外,它还提供了用于编写内联断言和循环不变量的注释。

前提条件是在调用方法(或构造函数)时应该满足的断言。同样,后置条件是应该在方法(或构造函数)的出口点满足的断言。内联断言是在代码的语句之间编写的,当执行到达它们时,它们应该得到满足。此外,循环不变式是一种内联断言,应该在每个循环迭代的开始时保持。

有几个工具使用JML,包括OpenJML[22,33,34,36]和KeY[1,9]. KeY支持静态验证。OpenJML支持静态验证和RAC。要验证程序,工具需要对使用的所有方法(包括被调用的库方法)进行前置和后置条件,并对开始验证的方法中的所有循环使用循环不变量。然而,RAC只需要被测试方法的方法规范,尽管它可以使用内联断言来监视测试运行中的断言冲突。

1显示了AddLoop方法及其JML规范;这个程序是Java+JML数据集中的一个重要程序[64,103]. JML规范是作为特殊的Java注释编写的,来自“//@“到一行的末尾。在JML中要求确保子句分别指定方法的前置条件和后置条件。基于该方法的前提条件x个不应大于Java的最大整数值(以避免溢出)。此外,它们的总和应该不小于Java的最小整数值(以避免下溢)。后置条件表示返回值,\结果,等于x+y. The维护子句指定循环不变量减少子句循环变体;循环变量表示n个必须在每次迭代期间减少。

图1。

图1。Java+JML数据集中的一种重要方法。请注意,在JML规范中,x+y等算术被解释为数学加法,因此前提条件是总和既不会导致下溢,也不会导致上溢。

3.2凯林奇

凯林奇[69]是一个灰盒CGF工具,旨在增加分支覆盖率并检测Java程序中的错误。Kelinci建立在著名的AFL工具之上[132]并将所有输入执行中继到JVM,以启用Java程序的模糊化。事实上,JMLKelinci+使用了另一个版本的Kelinci-WCA。Kelinci-WCA有三个主要选项。第一个选项使其像Kelinci一样工作,以尽量扩大分支覆盖范围。第二个选项使其尝试找到最大化执行时间的输入。4第三个选项的目的是找到最大化Java程序使用内存的输入。请注意,在所有三个选项中,Kelinci-WCA与Kelinci一样保存导致崩溃的输入,这表明程序中存在错误。

对于使用Kelinci(或Kelinci-WCA),用户至少需要提供一个驱动程序,用于将模糊器生成的输入数据字节(这些字节本身由Kelinchi内的AFL实例提供)转换为运行PUT所需的输入类型。此外,Kelinci至少需要一个种子输入,以便通过变异种子来提供输入数据类型。

Kelinci(以及几乎所有的模糊器)的问题之一是,与驱动程序结合使用时,它可能会生成无效的输入。因此,Kelinci可能会用无效输入覆盖分支。例如,在图1,如果模糊器生成x个值的总和超过Java的最大整数值,则当驱动程序运行添加循环方法,程序的分支将被无效输入覆盖,而Kelinci将保存这些无效输入,因为它们覆盖了一个新的分支。在此之后,如果Kelinci要生成覆盖该分支的新有效输入,则Kelinchi不会保存它们(因为它们不会覆盖新分支)。

跳过4JMLKELINCI+部分

4JMLKELINCI公司+

本节讨论演示我们想法的JMLKelinci+工具。章节4.1讨论了该工具的体系结构和主要功能,以及第节4.2讨论了JMLKelinci+实现的更多细节。

4.1JMLKelinci+概述

为了说明我们的想法,我们开发了一个原型工具JMLKelinci+,它结合了CGF工具Kelinci[69]和OpenJML的RAC工具[33,34,35]. JMLKelinci+的作用类似于CGF工具,但只生成有效的输入并使用RAC检查后置条件。如图所示2,该原型工具的输入是一个Java程序,具有在JML中指定的前置和后置条件以及种子输入(如图中的突变语料库所示);种子输入是变异语料库中唯一允许的无效输入。然后,Kelinci(使用AFL)生成输入数据,对变异语料库中的输入进行变异。然后,驱动程序(由用户编写)获取输入数据并将其转换为PUT所需的输入类型(即程序参数)。然后JMLKelinci+使用RAC运行PUT。如果转换的输入不满足指定的前提条件,则驱动程序捕获RAC引发的前提条件冲突异常(丢弃输入)并返回(通常)。因此,这种前提条件检查可以保证没有无效的输入被传递到PUT。此外,所有先决条件的违反都会导致程序在一个分支下运行,因此Kelinci在寻求更高的分支覆盖率时试图避免这种情况。然后,如果RAC在运行PUT(使用有效输入)时检测到任何断言冲突,那么JMLKelinci+会将生成的输入保存为反例,以显示错误的存在。如图所示2,此原型工具在使用每个输入运行时监视PUT的执行。JMLKelinci+尝试使用有效输入达到最高的分支覆盖率(并查找导致未捕获异常或其他崩溃的输入数据)。生成的导致新分支(或崩溃)的输入数据保存在变异语料库中。5JMLKelinci+中的AFL实例在其遗传算法中使用此类保存的输入来帮助生成其他此类输入数据。

图2。

图2。JMLKelinci+的体系结构。

与标准Kelinci工具相比,我们的想法为模糊化提供了以下好处:

(1)

它可以通过在测试中使用有效输入的RAC检查后置条件来检测语义错误。

(2)

它使测试更加高效,因为它在运行PUT之前捕获并绕过无效输入。Kelinci存在的问题之一(以及几乎所有的CGF工具)是,它可能会用无效输入覆盖分支。Kelinci(不检查前提条件)可以运行图中的“AddLoop”方法1两个值的和大于最大整数值,因此可能会用无效输入覆盖分支。此外,如果一个分支被无效输入覆盖,然后Kelinci提供覆盖同一分支的有效输入,那么Kelinchi将不会保存有效输入,因为它们不覆盖新的分支。

(3)

它可以找到由有效输入导致的程序崩溃。

(4)

早期的研究表明,在突变语料库中有有效输入将增加生成更多有效输入的概率;这可能导致使用有效输入更有效地实现PUT的分支覆盖[127,131]. 由于变异语料库测试由有效输入组成(种子输入可能除外),因此Kelinci使用的遗传算法生成更多有效输入的概率增加。更多证据来自混合模糊工具的研究;这种混合模糊工具使用符号执行和程序的前置条件[20,106,107,122,123,125]生成有效的输入,以帮助CGF生成更好的输入数据。这些研究表明,有效的种子输入增加了模糊化过程中生成更多有效输入的概率。

JMLKelinci+可以被视为灰盒或白盒模糊器。如果该工具只能访问PUT的前置和后置条件,那么JMLKelinci+将像灰色框模糊器一样工作。然而,如果它可以访问代码,并且用户向更多方法添加前置和后置条件,那么它将像白盒模糊器一样工作。6

与其他CGF工具一样,使用JMLKelinci+,测试人员必须编写一个驱动程序,将模糊器中的字节流转换为程序的预期输入类型。那么,为什么不仅要将字节转换为有效输入呢?有几个原因:

  • 手写驱动程序可能没有正确考虑PUT的前提条件,因此使用这种驱动程序的CGF工具可能仍然使用无效输入运行PUT。

  • 将生成正确类型输入的任务与编写前提条件的任务分开,可以使每个任务更有可能正确执行。

由于JMLKelinci+使用前置条件检查,因此可以保证PUT始终使用有效输入执行。

此外,正如我们将在下一节中显示的那样,当驱动程序总是为PUT生成有效参数时,检查前提条件不会显著影响PUT的执行时间。此外,使用RAC检查前提条件将缩短PUT的执行时间,因为当违反前提条件时,PUT根本不会运行。

4.2JMLKelinci+详情

要将OpenJML的RAC工具与Kelinci结合起来,需要提供一个连接这两个工具的接口。在JMLKelinci+中,这种连接是通过调用驱动程序中的两个shell脚本来提供的,这些脚本必须编写才能使用Kelinci。第一个调用OpenJML的RAC来检查条目方法的前提条件,第二个使用RAC运行PUT来检测语义错误。因此,在运行JMLKelinci+之前,必须使用OpenJML的RAC编译器将PUT编译两次,输出将进入两个不同的目录。第一次编译是使用OpenJML前提条件编译标志完成的。7第二次使用OpenJML的RAC默认编译模式进行编译。为了编译PUT以检查前提条件,只需要具有入口方法和JML前提条件的接口。如果我们用OpenJML的RAC编译整个PUT,那么OpenJML中的RAC将根据其JML规范检测所有程序方法中的任何违规行为。然而,为了检查Kelinci生成的输入测试的有效性,只需检查输入方法(和构造函数)的前提条件。虽然深层方法调用中的前提条件冲突可能有助于定位错误,但不需要检查这些前提条件来验证输入。此外,必须使用Kelinci编译PUT,并且生成的对象文件必须保存在单独的目录中(即,与OpenJML的RAC编译输出的目录不同)。

图中显示了使用JMLKelinci+运行“AddLoop”方法时必须提供的驱动程序.8在运行JMLKelinci+期间,驱动程序首先将Kelinci生成的字节转换为输入参数。“AddLoop”方法有两个整数类型参数,命名为数字1数量2在驱动程序中。图中的驱动程序将生成的随机字节转换为两个整数值使用ByteBuffer.wrap(字节).getInt()并将其分配给数字1数量2.

图3。

图3。用于转换生成的字节并为“AddLoop”方法调用OpenJML的RAC的驱动程序。

然后,JMLKelinci+通过调用第一个shell脚本来检查前提条件。驱动程序(如图所示)通过使用参数调用“RunRAC”方法检查前提条件检查Post设置为。“RunRac”的参数为数字1数量2,通过随机生成的输入,以及作为检查Post参数。“RunRac”方法调用用于运行OpenJML的RAC的shell脚本,通过运行以下代码检查前提条件:

用于检查前提条件的shell脚本运行另一个驱动程序,如图所示4。为了只检查前提条件,可以调用带有所有规范的整个程序(例如,图中的整个“AddLoop”程序1)并使用OpenJML标志“-racPreconditionEntry”,该标志只检查输入方法的前置条件。然而,我们的实验使用了不同的方法,即提供一个只检查PUT的前提条件和输入参数的PUT版本(图5显示了这种方法)。后一种方法节省了运行OpenJML的RAC的时间,我们也将其用于我们的研究。如果发生前置条件冲突,那么它不会运行PUT,JMLKelinci+中的AFL模糊器会生成更多随机字节输入。

图4。

图4。驱动程序运行OpenJML的RAC来检查先决条件,然后检查带有后决条件的整个程序。

图5。

图5。“AddLoop”方法的抽象模型,用于检查其前提条件。

图中的驱动程序,在测试时检测到前提条件冲突如果 (前提条件)失败。在这种情况下添加。添加循环(num1,num2)将不会运行。因此,JMLKelinci+中的AFL实例将不会执行以进行监视。相反,AFL将生成更多输入,JMLKelinci+将重新运行驱动程序。

然而,如果没有违反前提条件,那么在驱动程序中真的分配给检查Post变量(见图). 在此之后RunRac(运行赛车)方法的值为数字1数量2、和真的作为检查Post参数。在这种情况下RunRac(运行赛车)运行第二个脚本,即

这将检查程序中的所有断言,包括后置条件。如果OpenJML的RAC发生了违规,那么JMLKelinci+会将生成的反例保存为显示错误存在的测试。之后,JMLKelinci+运行Kelinci编译的PUT版本,Kelinci监控PUT的执行,检查是否有任何程序崩溃或新的分支被覆盖;导致这些行为的输入被Kelinci保存在其变异语料库中。

JMLKelinci+假设PUT是确定性的,因为它在相同的输入上运行两次PUT(一次由Kelinci监控,一次由RAC监控),并期望PUT在两次执行中采用相同的路径。在构建用于同时监视分支和断言的工具中,可以放宽此假设。9

跳过5个实验研究部分

5实验研究

本节描述了我们的实验及其结果。在节中5.1对JMLKelinci+和标准Kelinci进行比较,以确定只包含有效输入的分支。在节中5.2对JMLKelinci+和标准Kelinci进行了比较,以检测语义错误。最后,在第节5.3讨论了对本实验研究有效性的威胁。

在这项研究中,使用了运行在3.40 GHz、15 GB RAM的Intel i7-3770 CPU,以及Java 8。10

5.1有效输入的分行覆盖率

为了确定我们的方法是否适用于仅使用有效输入覆盖分支,我们将JMLKelinci+与标准Kelinci进行比较,测量(1)有效输入覆盖的分支的百分比,以及(2)实现100%分支覆盖所需的时间。我们使用OpenJML的RAC和JaCoCo来测量有效性[62]以测量分支覆盖范围。

测试的程序是28个(正确的)用Java+JML数据集中的JML前提条件注释的程序[64,98,99,103]. 虽然这个数据集的程序不太大,但之所以选择它们,是因为它们已经有JML规范。在这项研究中,标准Kelinci和JMLKelinci+使用了相同的初始种子输入,这要求我们使用标准Kelinchi找到不会导致程序崩溃的初始种子。此外,我们没有使用JML来指定程序入口方法的异常行为;指定前提条件是为了确保没有抛出异常。

在本研究中,这两个工具在每个程序上运行五次,并计算平均执行时间和覆盖的分支。

1显示了数据集中14个具有重要前提条件的程序的结果。在本表中JK公司+K(K)分别代表JMLKelinci+和标准Kelinci。“Best K Valid Coverage”(最佳K有效覆盖率)列给出了使用标准Kelinci在每个程序的单个运行中通过有效输入实现的最高分支覆盖率。此外,“Avg.K Valid Coverage”和“Avg.JK+Valid Cover”列分别是使用Kelinci和JMLKelinci+的有效输入的每个程序的平均分支覆盖率。每个程序五次运行的时间和覆盖率平均值四舍五入到小数点后一位。分支覆盖基于正常行为,不包括引发异常的路径。

表1。
程序名称平均JK+有效覆盖范围平均JK+时间(秒)平均K有效覆盖范围平均K时间(秒)最佳K有效覆盖范围
添加循环100%26.836.6%2150%
银行账户100%10606.299.5%26181100%
二进制搜索100%349.210%119.610%
计算器100%10720.876.6%12681.883%
组合排列100%364.66.6%94933%
CopyArray(复制阵列)100%8704.20%100%
阶乘100%59.225%179.625%
查找第一个排序的100%1110.26%224.230%
按排序查找100%1007.40%50%
闰年100%32.289.8%38.6100%
周长100%5730.48.6%581.829%
PrimeCheck公司100%2175%5.275%
学生注册100%98.283.3%84.489.5%
时间100%8434.25.8%1998129.1%
平均100%337637.3%4361.646.7%
  • “JK+”代表JMLKelinci+,“K”代表Kelinci。

表1。非平凡程序

  • “JK+”代表JMLKelinci+,“K”代表Kelinci。

表中的结果1显示了JMLKelinci+生成的测试,正如预期的那样,覆盖了这14个非平凡程序中只有有效输入的所有分支。11然而,标准Kelinci生成的测试并没有用有效的输入覆盖所有分支,因为当Kelinchi达到100%的分支覆盖率时,我们停止了运行,尽管一些分支可能已经被无效的输入覆盖。请注意,标准Kelinci和JMLKelinci+仅在PUT中首次覆盖分支时保存输入;然而,标准的Kelinci无法区分有效输入和无效输入,可能是覆盖新分支的第一个输入无效。结果表明,标准Kelinci平均覆盖了非平凡项目中约37.3%的分支12使用有效输入(相比之下,JMLKelinci+的分支覆盖率为100%)。此外,标准Kelinci对每个项目实现的有效输入的最大覆盖率平均约为46.7%。

在非平凡的程序中,JMLKelinci+覆盖了所有具有有效输入的分支,比标准Kelinci覆盖的分支(可能具有无效输入)快22.5%。然而,与JMLKelinci+相比,标准Kelinci在九个程序中覆盖分支的速度更快(尽管一些分支被无效输入覆盖)。此外,在一些程序中,如“BinarySearch”、“FindInSorted”和“FindFirstSorted“,标准的Kelinci覆盖分支的速度要快得多,因为JMLKelinci+强制要求必须使用排序数组作为输入;因此,JMLKelinci+必须检查许多生成的输入,直到找到一个表示排序数组的输入。在这些示例中,由标准Kelinci生成的未排序数组覆盖了所有分支,即使它们不是有效的输入。此外,在这三个示例中,标准Kelinci的有效输入覆盖了不到10%的分支。然而,在五个程序中,如“Factorial”、“CombinationPermutation”和“Time”,JMLKelinci+使用有效输入覆盖分支的速度大约是标准Kelinci的三倍(即使标准Kelinchi可以使用无效输入覆盖分支)。这是因为当生成的输入无效时,这三个程序的执行时间可能非常长。此外,这些程序的有效输入范围很小。例如,“Factorial”中的输入范围被限制为0到20,以避免(长)整数溢出,但这样的有效输入也可以更快地完成。

2指示14个具有琐碎前提条件的程序的结果。如果一个程序的前提条件对几乎所有可能的输入都是真的,那么它是微不足道的。例如,“Absolute”有一个简单的前提条件,因为几乎所有的整数输入都是有效的(除了最小Java整数值)。

表2。
程序名称平均JK+有效覆盖范围平均JK时间(秒)平均K有效覆盖范围平均K时间(秒)
绝对的100%6100%6
字母100%20053.8100%13822.2
冒泡排序冒泡排序100%5100%5
斐波那契100%155.6100%322.4
查找第一个零100%765.6100%605.6
查找InArray100%5100%5
GCD公司100%1674.8100%2185.8
反向100%748.2100%650.8
生命周期管理100%1524.6100%3558.4
线性搜索100%16.2100%10.2
奇偶100%5100%5
最小的100%400.6100%485.6
Str回文100%5100%5
转座100%5100%5
平均100%1812.2100%1548
  • “JK+”代表JMLKelinci+,“K”代表Kelinci。

表2。琐碎的节目

  • “JK+”代表JMLKelinci+,“K”代表Kelinci。

表中的结果2显示了“平均K有效覆盖”和“平均JK+有效覆盖”,这是使用Kelinci和JMLKelinci+的有效输入在五次运行中的平均分支覆盖率,分别为所有普通程序的100%。因此,JMLKelinci+和Kelinci都使用预期的有效输入覆盖了所有分支。平均而言,使用标准Kelinci覆盖所有分支的时间比JMLKelincis快14.5%左右;结果四舍五入到小数点后一位。虽然在六个项目中,这两个项目覆盖分支的时间大致相同,但在四个项目中JMLKelinci+覆盖分支的速度更快。在这些程序中,几乎所有输入都有效。因此,标准Kelinci生成的输入通常是有效的,并且浪费时间的无效输入很少。然而,在一些程序中,如“斐波那契”,所有输入都是有效的,因为当输入太大或太小时,程序会抛出异常(内部捕获)。对于这样的程序,JMLKelinci+大约快了两倍,因为我们指定了JML前提条件,以避免抛出异常(并在PUT内部捕获)的情况。

5.2检测语义错误

在第二项研究中,我们通过使用RAC和检查PUT的内联断言和后置条件来评估JMLKelinci+检测语义错误的能力,并将其与标准Kelinci进行比较。这项研究使用了来自有缺陷的Java+JML数据集中的112个有缺陷的程序[99,103]. Java+JML数据集中的每个正确程序都有由变异工具PITest生成的各种有缺陷的程序版本[37]. 这项实验研究使用了28个程序中每一个程序的前四个错误版本,因此包括112个错误程序;每个有bug的程序版本都有一个bug。

这项工作比较了使用标准Kelinci和JMLKelinci+工具检测到的错误程序数量。对于标准的Kelinci,当检测到一个有效的输入使程序崩溃时,13然后我们认为该工具检测到了错误。此外,当JMLKelinci+将输入保存为反例时,我们知道它会检测到带有有效输入的错误。在本研究中,JMLKelinci+和标准Kelinci使用相同的驱动程序,将生成的字节数据转换为这112个错误程序中每个程序的PUT参数类型。此外,这两个工具使用了相同的初始种子输入,这要求我们使用标准Kelinci找到一个不会使程序崩溃的初始种子。然而,在极少数情况下,有bug的程序会发生程序崩溃,其初始种子表明存在bug。因此,在那些有缺陷的程序中,我们并没有寻找一个不会使程序崩溃的新初始种子。此外,在这项实验研究中,JMLKelinci+在每个错误程序上运行,直到它检测到至少一个显示错误存在的反例。对每个错误程序进行模糊处理的最长时间是48小时,如果没有检测到错误,则在此时间之后终止模糊处理程序。然而,JMLKelinci+在不到14小时的时间内成功地识别了数据集中的所有错误,并且在不到一小时的时间里检测到了大多数程序中的错误。此外,标准的Kelinci在数据集中所有有错误的程序上运行,直到程序崩溃显示存在具有有效输入的错误。与JMLKelinci+类似,每个bug程序允许的最大模糊时间为48小时。

我们的结果表明,JMLKelinci+在所有112个有缺陷的程序中检测到了语义错误,并且可以找到至少一个反例来显示每个程序的语义错误。然而,标准的Kelinci工具只能检测到39个导致程序崩溃的错误程序(近35%)。在26个案例中,程序崩溃是因为“ArrayIndexOutOfBoundsException”,两个bug崩溃是由于“StringIndexOutofBounds异常”,三个案例是“ArithmeticException:/by zero”。此外,在八个案例中发生了“java.lang.IllegalArgumentException“崩溃,这是由于错误程序抛出异常。在这项实验研究中,当一个if-statement的测试在边界条件下有一个bug,并且if-state的其他部分抛出异常时,标准Kelinci无法在四种情况下检测到bug。例如,图6显示了Fibonacci程序第二版的错误方法,该程序来自有错误的Java+JML数据集,尽管运行了允许的48小时,但标准Kelinci工具无法检测到该数据集。JML规范作为特殊注释(在“/*@“和”@*/”). 这个公共常态行为显示程序正常终止(即没有引发异常)时程序的正常行为公众例外行为显示程序应抛出异常时程序的预期行为。这个要求确保子句分别为正常和异常行为的每个情况指定方法的前提和后置条件。根据规范,当参数大小为93,呼叫有效;14然而,Java代码中的错误是,当大小等于93,则将执行引发异常的分支。因此,只有当输入等于93时,该程序的错误才会被发现。每当JMLKelinci+生成使大小值等于93的输入数据时,它都可以使用RAC检测错误,并将其保存为反例(我们的研究中就是这样)。然而,标准Kelinci仅在发现新程序崩溃或新分支时保存输入。在这个例子中,标准Kelinci可以用任何其他值(例如,大于93的值)覆盖这个程序分支,并且当稍后标准Kelinci生成输入93时,它可能没有覆盖新的分支(如果这个分支已经被大于93的值覆盖),因此93的输入可能不会保存在突变语料库中。因此,虽然标准的Kelinci工具在39个案例中检测到错误,因为它们可能导致崩溃,但它没有检测到四个可能导致崩溃的错误程序。请注意,标准的Kelinci无法在其他69个有缺陷的程序中找到错误,因为它们不会导致程序崩溃。

图6。

图6。来自有缺陷的Java+JML数据集的有缺陷的方法。

可以获得正确程序和有错误程序的所有实验结果以及重现JMLKelinci+实验的说明[97].

5.3对有效性的威胁

在这项研究中,我们没有使用像Defects4J这样真正正确或有错误的程序的数据集[68,91]; 然而,Defects4J和其他数据集没有正式规范。相比之下,我们使用了Java+JML数据集和有缺陷的Java+JML数据集[99,103]Java程序配备了JML规范。因此,这项研究的结果可能无法推广到现实世界的程序中。

本研究中的一个威胁是如何比较JMLKelinci+和标准Kelinci来检测程序错误,这可能不合适。因为JMLKelinci+检查正式的后置条件以检测语义错误,而标准的Kelinci只检查崩溃。然而,我们的目的之一是表明仅检测崩溃不足以检测语义错误。

所有CGF工具发现的结果的有效性面临的威胁之一是其驱动程序的编写方式。拥有驱动程序的主要原因是将模糊器中随机生成的字节数据转换为PUT所需的输入类型。然而,更好的驾驶员也可以考虑生成有效输入的前提条件。例如,如果一个参数应该总是一个正整数,那么驱动程序可以被写为否定任何随机生成的负数;然后驱动程序将始终生成有效的输入。在这项实验研究中,我们提供的驱动程序只会将AFL(它是Kelinci的一部分)随机生成的字节转换为所需的输入类型,而无需检查前提条件。

CGF研究表明,使用足够的种子将有助于模糊器覆盖分支并更有效地检测错误(对于非平凡的程序)[127,131]. 在这篇文章中,我们没有使用任何技术来保证使用足够的种子,比如混合打毛机[20,106,107,125]为此目的使用符号执行的。我们对所有项目都使用了相同的种子。15选择另一个种子可能会影响结果,尽管这种影响可能不会发生在我们的小程序数据集上。

跳过6讨论和限制部分

6讨论和限制

本节讨论了将RAC与CGF工具相结合以检测语义错误的一些主要限制。在节中6.1,我们讨论了从RAC继承的限制,并在第节6.2,我们讨论了模糊工具的局限性。

6.1RAC限制

使用RAC的困难与编写正式规范的困难有关。然而,与静态验证不同,RAC只需要一个轻量级规范,而不需要一个完整的正式规范(正式验证程序的正确性所需的规范)。此外,要使用JMLKelinci+检查方法,只需要为该方法(以及使用的任何构造函数)指定一个轻量级规范;对于程序中的其他方法,甚至没有必要使用轻量级规范。

与RAC一样,我们的方法确实需要测试方法的先决条件,以充分表征程序的有效输入。如果指定的前提条件太弱,那么PUT中的分支可能会被无效输入覆盖,因此该工具的结果可能不是真正的错误。然而,如果指定的前提条件太强,那么该工具可能无法覆盖PUT的所有分支,这些分支可以通过有效的输入到达,因此可能会漏掉一些错误的检测。

类似地,对于RAC检测错误,指定的后置条件必须充分描述PUT的预期行为。不幸的是,无法将设计者的意图与正式规范进行比较。

6.2模糊限制

JMLKelinci+共享的所有模糊工具的一个限制是,如果工具无法检测到错误,那么它仍然无法保证程序没有错误。一般来说,模糊化与测试一样是不完整的,而JMLKelinci+与其他动态测试方法一样,只能显示错误的存在(当断言冲突发生时),而不能显示PUT中没有错误。然而,模糊测试可以帮助提高程序几乎没有错误的信心。

此外,可以使用消毒剂技术来检测语义错误,方法是插入Java断言,并在Java断言不满足时使程序崩溃,而不是使用RAC和正式规范。然后,模糊器可以在程序崩溃时检测这些语义错误。然而,通过使用RAC,只需要访问PUT主方法的前置和后置条件,16而使用消毒剂时,需要访问PUT的源代码才能在PUT中插入Java断言。此外,使用RAC,我们可以确保PUT仅通过使用前置条件的有效输入执行,而使用消毒剂时,程序可能会因无效输入而崩溃。此外,在JMLKelinci+中,所有生成的无效输入都将遍历PUT中的一个分支,CGF工具试图避免该分支,这鼓励JMLKellici+生成有效测试。此外,JMLKelinci+变异语料库中保存的所有输入都是有效的输入,可以帮助模糊器更快地找到更多有效的测试。

所有模糊工具的另一个问题是覆盖所有分支和检测错误所需的运行时间不明确。与其他模糊化工具一样,给工具更多的时间来执行PUT将增加覆盖更多分支和检测更多潜在错误的概率。一般来说,模糊器需要更多的时间来覆盖具有更多分支的大型程序中的所有分支和潜在错误,特别是当一个分支只能由一小组输入域覆盖时。然而,我们实验结果中使用的方法之一是使用第三种工具(JaCoCo[62])使用保存的输入计算PUT中的分支覆盖率。只有在达到一定的分支覆盖率后,我们才停止模糊处理。

跳过7结论和未来工作部分

7结论和未来工作

我们描述了一种结合RAC和CGF来检测语义错误的方法,以及一个实现这种思想的原型工具JMLKelinci+[97]. JMLKelinci+使用RAC检查前提条件,并仅使用有效输入执行测试中的程序,使测试更有效地覆盖具有有效输入的分支,并通过使用RAC来检查后置条件来检测语义错误。此外,RAC与CGF的结合有助于CGF工具生成比标准Kelinci更好的输入测试。因为JMLKelinci+在单个分支中捕获前提条件冲突,所以CGF工具试图避免它,只保存变异语料库中的有效输入;这为JMLKelinci+提供了更好的输入测试数据,用于变异和生成新测试。

我们的实验表明,JMLKelinci+可以用有效的输入覆盖程序的所有分支,这在使用自己的CGF工具时是不会发生的。此外,我们的结果表明,结合RAC和CGF对于检测语义错误非常有效;在我们的实验中,JMLKelinci+检测所有112个有缺陷的程序。相比之下,标准模糊器Kelinci只能检测到大约35%的错误程序。

对于未来的工作,可以使用另外两种方法来开发模糊化工具:(1)将输入保存在突变语料库中;(2)当在新分支中检测到错误时,向CGF工具提供额外的反馈和反馈,以引导模糊器检测到更多的错误。(目前,JMLKelinci+没有告诉fuzzer将输入测试保存在变异语料库中。)此外,设计一个CGF工具直接使用前提条件生成有效输入,而不是过滤出无效输入,这可能具有优势。

未来的另一项工作将是更彻底地结合RAC和CGF工具,以便PUT不需要运行两次(一次用于监视分支覆盖,一次用于检查后置条件);这也将消除JMLKelinci+关于PUT具有确定性的假设。

最后,应该注意的是,RAC和CGF工具的组合不仅限于JML、Java或Kelinci,而且可以应用于任何带有RAC和CGF工具的语言。

鸣谢

感谢Franck van Breugel、Pavel Parízek和所有谷歌代码之夏参与者(Java PathFinder组织在2021年支持他们)的讨论。我们还感谢Shirin Nilizadeh讨论了这项工作的初步想法。

脚注

  1. 1 本文是出现在TAP 2021年[104]. 此版本使用后置条件自动检测语义错误。

  2. 2 前提是琐碎的如果这总是真的。

    脚注
  3. 在Kelinci-WCA这个名字中,WCA的意思是“最坏情况分析”[105],但Kelinci-WCA的这一方面对本文来说并不重要。

    脚注
  4. 4 Kelinci-WCA中的第二和第三个选项可用于检测副通道漏洞。

    脚注
  5. 5 一些作者将变异语料库称为“有趣的输入”库[104].

    脚注
  6. 6 JMLKelinci+永远不会像黑盒模糊器那样工作,因为它需要一些关于PUT的预期输入/输出行为的信息,并且该工具的Kelinci部分将监视分支覆盖率。

    脚注
  7. 7 OpenJML标志-racPreconditionEntry(rac预处理条目)检查输入方法的前提条件。

    脚注
  8. 8 驱动程序如图所示简化了实验研究中使用的方法以节省空间。

    脚注
  9. 9 不幸的是,我们不得不将RAC和CGF集成到一个单一的工具中,以便在将来的工作中只运行一次程序。

    脚注
  10. 10 而OpenJML的RAC支持Java 16[35]和Java 17,Kelinci仅支持Java 8。对于我们的实验,我们使用OpenJML 8.52和JDK版本1.8.0_312。

    脚注
  11. 11 在这些示例中,涵盖了所有分支。如果程序有死代码,那么最好使用不可行的分支检测技术[90].

    脚注
  12. 12 所谓“非平凡程序”,我们指的是前提条件是非平凡的程序。相反,“平凡的程序”有一个平凡的前提条件。

    脚注
  13. 13 Standard Kelinci将所有生成的导致程序崩溃的输入保存在一个唯一的目录中。

    脚注
  14. 14 值为93的斐波那契的结果在Java中的整数值范围内。然而,值为94的Fibonacci结果大于标准Java支持的最大整数值。

    脚注
  15. 15 作为种子,我们使用了一个包含文本“JMLKelinci+”的文本文件。如前所述,在某些情况下,如果此种子导致Kelinci崩溃,我们使用其他随机种子。

    脚注
  16. 16 拥有内部形式断言以及所有方法的前置和后置条件有助于检测错误的准确位置,但对于检测语义错误的存在则没有必要。此外,在JML中,可以通过使用.jml文件文件夹。

    脚注

参考文献

  1. [1]阿伦特·沃尔夫冈,贝克特·伯恩哈德,布贝尔·理查德,哈恩勒·雷纳,施密特·彼得·H。、和乌尔布里希·马蒂亚斯.2016.演绎软件验证-关键手册.英寸计算机科学课堂讲稿(2016).谷歌学者谷歌学者
  2. [2]Krzysztof R.公寓。Olderog Ernst-Rüdiger公司.2019.霍尔50年的逻辑.表Asp。计算。 31,6(12月。2019),751807.谷歌学者谷歌学者数字图书馆数字图书馆
  3. [3]阿瑟·西里尔,巴林格·霍华德,戈德堡·艾伦,哈维伦德·克劳斯,库尔希德·萨夫拉兹(Khurshid Sarfraz),劳里·迈克,帕萨雷努·科里纳,罗什·格里戈尔,森·库什克,维塞尔·威廉姆,等.2005.结合测试用例生成和运行时验证.西奥。计算。科学。 336,2–3(2005),209234.谷歌学者谷歌学者数字图书馆数字图书馆
  4. [4]阿瓦尔·马特奥,皮隆蒂·阿尔弗雷多、和西斯托·里卡多.2014.安全协议实现的形式化验证:一项调查.表Asp。计算。 26,1(简。2014),99123.谷歌学者谷歌学者数字图书馆数字图书馆
  5. [5]巴多尼·罗伯托,埃米利奥杯,迪莉亚·丹尼尔·科诺,德米特里斯库·卡米尔、和菲诺奇·艾琳.2018.符号执行技术综述.ACM计算。Surv公司。 51,(2018),139.谷歌学者谷歌学者数字图书馆数字图书馆
  6. [6]银行格雷格,科瓦·马科,维多利亚费尔梅斯盖尔,阿尔梅罗·凯文,凯默勒·理查德、和维格纳·乔瓦尼.2006.SNOOZE:走向有状态的NetwOrk prOtocol fuzZEr.英寸国际信息安全会议施普林格,343358.谷歌学者谷歌学者数字图书馆数字图书馆
  7. [7]巴丁·塞巴斯蒂安,科马托夫·尼古莱,玛丽·布鲁诺,曼特雷·戴维、和威廉斯·尼基.2018.使用生成测试用例PathCrawler/L测试:如何自动化工业测试过程.英寸利用形式方法应用国际研讨会.施普林格,104120.谷歌学者谷歌学者
  8. [8]巴纳·沙龙,格拉兹贝格·齐夫、和拉比诺维茨·伊斯海.2005.Wolf–使用形式化方法的并发软件缺陷搜索器.英寸计算机辅助验证国际会议.施普林格,153157.谷歌学者谷歌学者
  9. [9]贝克特·伯恩哈德,哈恩勒·雷纳、和施密特-彼得H。.2007.面向对象软件的验证:KeY方法第卷。4334.施普林格.谷歌学者谷歌学者数字图书馆数字图书馆
  10. [10]拜尔·德克,丹格尔·马提亚斯,伦伯格·托马斯、和陶奇尼格·迈克尔.2018.证人的测试.英寸测试和证明,杜布瓦·凯瑟琳沃尔夫·布尔克哈特(编辑)。施普林格国际出版公司,查姆,23.谷歌学者谷歌学者交叉引用交叉引用
  11. [11]巴塔卡·桑迪普,杜瓦尔尼·丹尼尔·C。、和塞卡·罗恩.2003.地址混淆:一种有效的方法来对抗广泛的内存错误利用.英寸USENIX安全研讨会会议记录,291301.谷歌学者谷歌学者
  12. [12]鲍文·乔纳森·P。Hinchey Michael G。.1995.形式方法十诫.计算机 28,4(1995),5663.谷歌学者谷歌学者数字图书馆数字图书馆
  13. [13]博亚帕蒂·钱德拉塞卡,库尔希德·萨夫拉兹(Khurshid Sarfraz)、和马里诺夫·达科.2002.Korat:基于Java谓词的自动化测试.ACM SIGSOFT软件。工程不是。 27,4(2002),123133.谷歌学者谷歌学者数字图书馆数字图书馆
  14. [14]博伊尔·罗伯特·S。,埃尔斯帕·伯纳德、和莱维特·卡尔。.1975.SELECT是一种通过符号执行测试和调试程序的正式系统.ACM SIGPLAN非。 10,6(1975),234245.谷歌学者谷歌学者数字图书馆数字图书馆
  15. [15]布鲁克·阿希姆·D·。Wolff Burkhart公司.2004.基本递归函数的符号测试用例生成.英寸软件测试正式方法国际研讨会.施普林格,1632.谷歌学者谷歌学者
  16. [16]伯德克·约翰内斯,洛豪·马尔特,鲍雷格·斯特凡,霍尔泽·安德烈亚斯,莱茵·亚历山大·冯,阿佩尔·斯文、和拜尔·德克.2015.促进软件产品线多目标测试套件生成中的重用.英寸软件工程基本方法国际会议.施普林格,8499.谷歌学者谷歌学者
  17. [17]伯迪·莉莲,Cheon Yoonsik公司,柯克·大卫·R。,恩斯特·迈克尔·D。,基尼里·乔瑟夫(Kiniry Joeseph R.)。,利文斯·加里·T。,莱诺·K·鲁斯坦·M。、和波尔·埃里克.2005.JML工具和应用程序概述.国际期刊软件。技术工具。Transf公司。 7,(6月。2005),212232.谷歌学者谷歌学者数字图书馆数字图书馆
  18. [18]卡达尔·克里斯蒂安,戈德弗里德·帕特里斯,库尔希德·萨夫拉兹(Khurshid Sarfraz),Pasareanu Corina S公司,森·库什克,蒂尔曼·尼古拉、和维塞尔·威廉姆.2011.实践中软件测试的符号执行:初步评估.英寸第33届国际软件工程会议(ICSE’11)会议记录IEEE标准,10661071.谷歌学者谷歌学者数字图书馆数字图书馆
  19. [19]卡塔诺·内斯特鲁埃达·卡米洛.2009.教授未征服领土的正规方法.英寸国际技术形式方法会议.施普林格,219.谷歌学者谷歌学者
  20. [20]查桑基尔,Avgerinos Thanassis公司,丽贝特·亚历山大、和布鲁姆利·戴维.2012.释放混乱关于二进制码.英寸IEEE安全与隐私研讨会会议记录IEEE标准,380394.谷歌学者谷歌学者数字图书馆数字图书馆
  21. [21]Chakkaravarthy S.锡比,桑吉塔·D·。、和瓦迪希五世。.2019.恶意软件分析与缓解技术综述.计算。科学。版次。 32(2019),123.谷歌学者谷歌学者数字图书馆数字图书馆
  22. [22]查林·帕特里斯,基尼里·约瑟夫·R。,利文斯·加里·T。、和波尔·埃里克.2006.除了断言:高级规范和JML和ESC/Java2验证.英寸组件和对象形式化方法国际研讨会论文集(FMCO'05),计算机科学课堂讲稿第4111卷。Springer-Verlag公司,柏林,342363.https://tinyurl.com/3z2vk55n谷歌学者谷歌学者
  23. [23]Challagulla Venkata Udaya B。,巴斯塔尼·法罗赫B。,甄子丹-凌、和保罗·雷蒙德A。.2008.基于机器学习的软件缺陷预测技术的实证评估.国际J.人工制品。智力。工具 17,02(2008),389400.谷歌学者谷歌学者交叉引用交叉引用
  24. [24]查佩利·蒂莫西,克里斯蒂娜Cifuentes Cristina,克里希南·帕德马纳班、和盖瓦·什洛莫.2017.机器学习查找错误:初步报告.英寸IEEE软件质量评估机器学习技术研讨会论文集(MaLTeSQuE’17)IEEE标准,2126.谷歌学者谷歌学者
  25. [25]陈浩,迪安·德鲁、和瓦格纳·戴维A。.2004.模型检查一百万行C代码.英寸网络与分布式系统安全研讨会论文集(NDSS’04),卷。4.171185.谷歌学者谷歌学者
  26. [26]Cheon Yoonsik公司莱文斯·加里·T。.2002.java建模语言(JML)的运行时断言检查器.英寸软件工程研究与实践国际会议论文集(SERP’02),阿拉布尼亚·哈米德R。门永松(编辑)。CSREA出版社,322328.谷歌学者谷歌学者
  27. [27]Cheon Yoonsik公司利文斯·加里·T。.2002.一种简单实用的单元测试方法:JML和JUnit方法.英寸第16届欧洲面向对象编程会议记录(ECOOP’02),计算机科学课堂讲稿第2374卷,马格努森·鲍里斯(编辑)。Springer-Verlag公司,柏林,231255.谷歌学者谷歌学者数字图书馆数字图书馆
  28. [28]丘德诺夫·安德烈,柯林斯·内森,库克·拜伦,多兹·乔伊,赫夫曼·布赖恩,麦克卡泰格·科尔姆,马吉尔·斯蒂芬,默滕斯·埃里克,马伦·埃里克,塔西兰·塞尔达尔,等.2018.亚马逊s2n持续正式验证.英寸计算机辅助核查国际会议.施普林格,430446.谷歌学者谷歌学者
  29. [29]克莱森·科恩休斯·约翰.2000.QuickCheck:用于随机测试haskell程序的轻量级工具.英寸第五届ACM SIGPLAN函数编程国际会议记录.268279.谷歌学者谷歌学者
  30. [30]克拉克·埃德蒙德维斯·赫尔穆特.2003.重新审视反例:原理、算法、应用.英寸验证:理论与实践.施普林格,208224.谷歌学者谷歌学者
  31. [31]克拉克·洛里A。罗森布鲁姆·大卫·S。.2006.软件开发中运行时断言检查的历史透视.ACM SIGSOFT软件。工程不是。 31,(2006),2537.谷歌学者谷歌学者数字图书馆数字图书馆
  32. [32]小埃德蒙·克拉克,格伦伯格·奥尔纳,科伦·丹尼尔,佩利德·多隆、和维斯·赫尔穆特.2018.模型检查.麻省理工学院出版社.谷歌学者谷歌学者
  33. [33]柯克·大卫·R。.2010.用于调试规范的SMT解算器的可用性和性能得到改进.国际期刊软件。技术工具。Transf公司。 12,6(2010),467481.谷歌学者谷歌学者数字图书馆数字图书馆
  34. [34]科克·戴维·R。.2011.OpenJML:JML for Java 7,通过扩展OpenJDK.英寸NASA正式方法研讨会.施普林格,472479.谷歌学者谷歌学者
  35. [35]科克·戴维·R。.2021.JML和OpenJML for Java 16.英寸第23届ACM类Java程序形式化技术国际研讨会会议记录.6567.谷歌学者谷歌学者数字图书馆数字图书馆
  36. [36]科克·戴维·R。.2021.JML和OpenJML for Java 16.英寸第23届ACM类Java程序正式技术国际研讨会论文集(FTfJP’21).计算机协会,纽约州纽约市,6567.谷歌学者谷歌学者数字图书馆数字图书馆
  37. [37]科尔斯·亨利,劳伦特·托马斯,亨纳德·克里斯托弗,帕帕达基斯·迈克、和文崔斯克·安东尼.2016.PIT:Java实用变异测试工具(演示).英寸第25届软件测试与分析国际研讨会论文集.449452.谷歌学者谷歌学者数字图书馆数字图书馆
  38. [38]库克·拜伦.2018.关于amazon web服务安全性的形式化推理.英寸计算机辅助核查国际会议.施普林格,3847.谷歌学者谷歌学者
  39. [39]科琳娜·杰克,机械师Aravind,萨尔斯·克里斯托弗,肖什塔什维利·严,郝爽,克鲁格尔·克里斯托弗、和维格纳·乔瓦尼.2017.DIFUZE:内核驱动程序的接口感知模糊.英寸ACM SIGSAC计算机和通信安全会议记录.21232138.谷歌学者谷歌学者
  40. [40]Decker Christian公司瓦滕霍夫·罗杰.2014.比特币交易延展性和MtGox.英寸欧洲计算机安全研究研讨会.施普林格,313326.谷歌学者谷歌学者
  41. [41]迪尔·戴维·L。拉什比·约翰.1996.正式方法的接受:硬件设计的经验教训.IEEE计算。 29,4(1996),2324.谷歌学者谷歌学者
  42. [42]杜鲁默里克·扎基尔,李·弗兰克,卡斯滕·詹姆斯,阿曼·约翰纳,比克曼·杰思罗,付款人Mathias,韦弗·尼古拉斯,阿德里安·戴维,帕克森·弗恩,贝利·迈克尔,等.2014.心碎的问题.英寸互联网测量会议记录.475488.谷歌学者谷歌学者数字图书馆数字图书馆
  43. [43]埃伯莱因·马丁,诺勒·亚尼克,沃格尔·托马斯、和格伦斯克·拉尔斯.2020.基于进化文法的模糊化.英寸基于搜索的软件工程国际研讨会.施普林格,105120.谷歌学者谷歌学者
  44. [44]芬克·乔治马特主教.1997.基于属性的测试:一种新的测试方法.ACM SIGSOFT软件。工程不是。 22,4(1997),7480.谷歌学者谷歌学者数字图书馆数字图书馆
  45. [45]弗雷泽·戈登阿库里·安德里亚.2011.EvoSuite:面向对象软件的自动测试套件生成.英寸第19届ACM SIGSOFT研讨会和第13届欧洲软件工程基础会议记录.416419.谷歌学者谷歌学者数字图书馆数字图书馆
  46. [46]弗雷泽·戈登阿库里·安德里亚.2013.EvoSuite:现实世界中测试用例生成的挑战.英寸IEEE第六届软件测试、验证和确认国际会议记录IEEE标准,362369.谷歌学者谷歌学者
  47. [47]弗雷泽·戈登阿库里-安德里亚.2014.使用EvoSuite自动单元测试生成的大规模评估.ACM事务处理。柔和。工程方法。 24,2(2014),142.谷歌学者谷歌学者数字图书馆数字图书馆
  48. [48]英勇的米洛斯,格维罗·蒂霍米尔,贾甘纳斯·维拉斯,库尔希德·萨夫拉兹(Khurshid Sarfraz),昆卡维克多、和马里诺夫·达科.2010.通过UDITA编程生成测试.英寸第32届ACM/IEEE软件工程国际会议论文集——第1卷.225234.谷歌学者谷歌学者
  49. [49]戈德弗里德·帕特里斯,基辅亚当、和莱文·迈克尔·Y。.2008.基于语法的白盒模糊处理.英寸第29届ACM SIGPLAN编程语言设计与实现会议记录.206215.谷歌学者谷歌学者数字图书馆数字图书馆
  50. [50]戈德弗里德·帕特里斯,克拉伦德·尼尔斯、和森库希克.2005.DART:定向自动随机测试.英寸ACM SIGPLAN编程语言设计和实现会议记录.213223.谷歌学者谷歌学者数字图书馆数字图书馆
  51. [51]戈德弗里德·帕特里斯,佩莱格·希拉、和辛格·里沙布.2017.学习和模糊:输入模糊的机器学习.英寸第32届IEEE/ACM自动化软件工程国际会议论文集(ASE’17)IEEE标准,5059.谷歌学者谷歌学者交叉引用交叉引用
  52. [52]谷歌【未注明日期】。谷歌/syzkaller。2023年5月5日检索自https://github.com/google/syzkaller谷歌学者谷歌学者
  53. [53]高斯·克莱尔·勒,普拉德尔·迈克尔、和罗伊乔杜里·阿比克.2019.自动程序修复.Commun公司。ACM公司 62,12(2019),5665.谷歌学者谷歌学者数字图书馆数字图书馆
  54. [54]格罗斯·亚历克斯平托·杰维斯.2015.一种用于测试的小语言.英寸NASA正式方法研讨会.施普林格,204218.谷歌学者谷歌学者
  55. [55]格罗斯·亚历克斯,平托·杰维斯,阿齐米·普里亚、和米塔尔·普兰贾尔.2015.TSTL:一种用于测试的语言和工具.英寸软件测试与分析国际研讨会论文集.414417.谷歌学者谷歌学者
  56. [56]格罗斯·亚历克斯维塞尔·威廉姆.2003.问题所在:解释反例.英寸软件模型检查国际SPIN研讨会.施普林格,121136.谷歌学者谷歌学者
  57. [57]霍尔·安东尼.1990.形式方法的七大误区.IEEE软件。 7,5(九月。1990),1119.谷歌学者谷歌学者数字图书馆数字图书馆
  58. [58]哈克斯豪森-安妮·E。,佩莱斯卡·扬、和金德·塞巴斯蒂安.2011.铁路控制系统构建和验证的形式化方法.表Asp。计算。 23,2(3月。2011),191219.谷歌学者谷歌学者数字图书馆数字图书馆
  59. [59]霍尔·C·A·R。.1969.计算机编程的公理基础.Commun公司。ACM公司 12,10(10月。1969),576–580,583.谷歌学者谷歌学者数字图书馆数字图书馆
  60. [60]霍多瓦恩·雷纳塔,亲吻阿科斯、和吉莫西·提博.2018.语法分析器:一个基于语法的开源模糊器.英寸第九届ACM SIGSOFT自动化测试用例设计、选择和评估国际研讨会会议记录.4548.谷歌学者谷歌学者数字图书馆数字图书馆
  61. [61]霍弗·施米茨·卡塔琳娜斯托亚诺维奇·布兰卡.2020.面向物联网协议的正式验证:综述.计算。Netw公司。 174(2020),107233.谷歌学者谷歌学者交叉引用交叉引用
  62. [62]霍夫曼-马克·R。,曼德里科夫·叶夫根尼、和弗里登哈根·米尔科【未注明日期】。Eclipse的Java代码覆盖率。2023年5月5日检索自https://www.eclema.org/jacoco网站/谷歌学者谷歌学者
  63. [63]福尔摩斯·乔西,格罗斯·亚历克斯,平托·杰维斯,米塔尔·普兰贾尔,阿齐米·普里亚,凯勒·凯文、和奥布莱恩·詹姆斯.2018.TSTL:模板脚本测试语言.国际期刊软件。技术工具。Transf公司。 20,1(2018),5778.谷歌学者谷歌学者数字图书馆数字图书馆
  64. [64]爪哇JML【未注明日期】。爪哇-JML。2023年5月5日检索自https://github.com/Amirfarhad-Nilizadeh/Java-JML谷歌学者谷歌学者
  65. [65]Jeon Yuseok先生,韩武铉,埋葬内森、和付款人Mathias.2020.FuZZan:高效的模糊消毒剂元数据设计.英寸USENIX年度技术会议记录(USENIXATC’20).249263.谷歌学者谷歌学者
  66. [66]Jitsunari Yuma公司Arahori Yoshitaka公司.2019.覆盖引导学习辅助的基于语法的模糊化.英寸IEEE软件测试、验证和确认研讨会国际会议记录(ICSTW’19)IEEE标准,275280.谷歌学者谷歌学者
  67. [67]约翰逊·威廉,斯文森·马丁,拉尔森·乌尔夫·E。,阿尔姆格伦·马格纳斯、和古利萨诺·文森佐.2014.T-Fuzz:用于电信协议鲁棒性测试的基于模型的模糊.英寸IEEE第七届软件测试、验证和确认国际会议记录IEEE标准,323332.谷歌学者谷歌学者
  68. [68]只有勒内,贾拉利·达里奥什、和恩斯特·迈克尔·D。.2014.缺陷4J:一个现有故障数据库,用于支持Java程序的受控测试研究.英寸软件测试与分析国际研讨会论文集.437440.谷歌学者谷歌学者数字图书馆数字图书馆
  69. [69]克尔斯滕·罗迪,勒科夫·卡斯珀、和佩斯·雷努·科琳娜s.2017.海报:使用kelinci对java进行基于AFL的模糊处理.英寸ACM SIGSAC计算机和通信安全会议记录.25112513.谷歌学者谷歌学者
  70. [70]詹姆斯·C·国王。.1976.符号执行和程序测试.Commun公司。ACM公司 19,7(1976),385394.谷歌学者谷歌学者数字图书馆数字图书馆
  71. [71]基尼里·约瑟夫·R。,摩根·艾伦·E。,科克兰·德莫特,费尔迈克尔·芬坦,查林·帕特里斯,奥斯蒂克·马尔蒂恩、和哈伯斯·恩格尔伯特.2006.KOA远程投票系统:迄今为止的工作总结.英寸值得信赖的全球计算国际研讨会.施普林格,244262.谷歌学者谷歌学者
  72. [72]科马托夫·尼古莱,莫里卡·福内南索阿(Maurica Fonenantsoa)、和朱利安先生.2020.高效的运行时断言检查数学数字上的属性.英寸运行时验证国际会议.施普林格,310322.谷歌学者谷歌学者
  73. [73]广加里,鲁德曼·杰西、和卡瑞特·安东尼【未注明日期】。MozillaSecurity/funfuzz检索日期:2023年5月5日,https://github.com/MozillaSecurity/funfuzz谷歌学者谷歌学者
  74. [74]莱昂尼达斯,希克斯·迈克尔、和皮尔斯·本杰明C.2019.覆盖率指导、基于属性的测试.英寸ACM SIGPLAN面向对象编程系统、语言和应用国际会议论文集(OOPSLA’19),129.谷歌学者谷歌学者
  75. [75]乐轩-巴赫D。,鲍凌峰,Lo David(罗·戴维),夏欣,李善平、和科里纳帕萨雷努.2019.补丁正确性评估的可靠性研究.英寸IEEE/ACM第41届软件工程国际会议(ICSE’19)会议记录IEEE标准,524535.谷歌学者谷歌学者数字图书馆数字图书馆
  76. [76]乐轩-巴赫D。,帕萨雷努·科里纳,帕迪·罗汉,Lo David(罗·戴维),维塞尔·威廉姆、和森·库什克.2019.SAFFRON:用于最坏情况分析的自适应基于语法的模糊化.ACM SIGSOFT软件。工程不是。 44,4(2019),1414.谷歌学者谷歌学者数字图书馆数字图书馆
  77. [77]利文斯·加里·T。,贝克·艾伯特。、和鲁比·克莱德.1999.JML:详细设计的符号.英寸业务和系统的行为规范.施普林格,175188.谷歌学者谷歌学者交叉引用交叉引用
  78. [78]莱文斯·加里·T。,贝克·阿尔伯特·L·。、和鲁比·克莱德.2006.Java行为接口规范语言JML的初步设计.ACM SIGSOFT软件。工程不是。 31,(2006),138.谷歌学者谷歌学者数字图书馆数字图书馆
  79. [79]利文斯·加里·T。Cheon Yoonsik公司.2006.与JML签订合同设计。检索自https://www.cs.ucf.edu/leavens/JML/jmldbc.pdf谷歌学者谷歌学者
  80. [80]利文斯·加里·T。,Cheon Yoonsik公司,克利夫顿·柯蒂斯,鲁比·克莱德、和科克·戴维·R。.2005.JML的设计如何兼顾运行时断言检查和形式验证.科学。计算。程序。 55,1–3(2005),185208.谷歌学者谷歌学者数字图书馆数字图书馆
  81. [81]利文斯·加里·T。,科克·戴维·R。、和尼利扎德·阿米尔法哈德.2022.JML项目的进一步经验教训.英寸软件的逻辑。正式方法的品尝菜单:在莱纳·哈内尔60岁生日之际献给他的散文.施普林格,313349.谷歌学者谷歌学者
  82. [82]利文斯·加里·T。,波尔·埃里克,克利夫顿·柯蒂斯,Cheon Yoonsik公司,鲁比·克莱德,科克·戴维,缪勒·彼得,基尼里·约瑟夫,查林·帕特里斯,齐默尔曼·丹尼尔·M。,等.2008.JML参考手册.谷歌学者谷歌学者
  83. [83]利文斯·加里·T。,鲁比·克莱德,莱诺·K·鲁斯坦·M。,波尔·埃里克、和雅各布斯·巴特.2000.支持Java详细设计的JML(海报会话)符号和工具.英寸面向对象编程、系统、语言和应用会议2000年会议记录增编(增编).105106.谷歌学者谷歌学者
  84. [84]勒克·马丁夏尔哈特·克里斯蒂安.2009.运行时验证简介.J.逻辑代数。程序。 78,5(2009),293303.谷歌学者谷歌学者交叉引用交叉引用
  85. [85]李军,赵伯东、和张超.2018.模糊:一项调查.网络安全 1,1(2018),6.谷歌学者谷歌学者交叉引用交叉引用
  86. [86]梁洪亮,裴晓晓,贾晓东,沈武伟、和张健.2018.模糊:最新技术.IEEE传输。Reliabil公司。 67,(2018),11991218.谷歌学者谷歌学者交叉引用交叉引用
  87. [87]李·达拉,科斯马托夫-尼古拉,Loulerge Frédéric餐厅、和朱利安先生.2020.已验证运行时断言检查内存属性.英寸测试和证明,阿伦特·沃尔夫冈韦尔海姆海克(编辑)。施普林格国际出版公司,查姆,100121.谷歌学者谷歌学者交叉引用交叉引用
  88. [88]迈尔·多米尼克,塞德尔·卢卡斯、和Park Shinjo公园.2020.Basesafe:通过仿真实现基带净化模糊.英寸第13届ACM无线和移动网络安全与隐私会议记录.122132.谷歌学者谷歌学者
  89. [89]马尔霍特拉·鲁奇卡.2015.软件故障预测机器学习技术的系统综述.申请。软计算。 27(2015),504518.谷歌学者谷歌学者数字图书馆数字图书馆
  90. [90]马可西·米歇尔,巴丁·塞巴斯蒂安,科马托夫·尼古莱,帕帕达基斯·迈克,普雷沃斯托·维吉尔、和科伦森·洛伊奇.2018.是时候清理测试目标了.英寸第40届国际软件工程会议论文集.456467.谷歌学者谷歌学者数字图书馆数字图书馆
  91. [91]马丁内斯·马蒂亚斯,杜利厄斯·托马斯,索默拉德·罗曼,宣继峰、和蒙佩鲁斯·马丁.2017.Java中真实错误的自动修复:对Defects4j数据集的大规模实验.员工。柔和。工程师。 22,4(2017),19361964.谷歌学者谷歌学者数字图书馆数字图书馆
  92. [92]梅恩克·卡尔信杜·穆达萨A.2013.LBTest:一种基于学习的反应系统测试工具.英寸IEEE第六届软件测试、验证和确认国际会议论文集IEEE标准,447454.谷歌学者谷歌学者
  93. [93]梅耶·贝特朗.1992.应用“合同设计”.计算机 25,10(10月。1992),4051.谷歌学者谷歌学者数字图书馆数字图书馆
  94. [94]米利舍维奇·阿列克桑达,米萨利奥维奇·萨萨,马里诺夫·达科、和库尔希德·萨夫拉兹(Khurshid Sarfraz).2007.Korat:用于生成结构复杂的测试输入的工具.英寸第29届国际软件工程会议记录(ICSE’07)IEEE标准,771774.谷歌学者谷歌学者
  95. [95]纳吉·斯特凡希克斯·马修.2019.全速模糊:通过覆盖引导跟踪减少模糊开销.英寸IEEE安全与隐私研讨会会议记录(SP'19)IEEE标准,787802.谷歌学者谷歌学者
  96. [96]内罗列斯·马修,哈穆·勒哈吉·阿卜杜勒瓦哈卜,塔哈尔·索菲涅、和拉尔森阿尔夫.2017.一种基于定向模型检查和崩溃跟踪的错误再现方法.J.软件:进化。流程 29,(2017),e1789.谷歌学者谷歌学者交叉引用交叉引用
  97. [97]尼利扎德·阿米尔法哈德【未注明日期】。JMLKelinciPlus公司。检索日期:2023年5月5日https://zenodo.org/record/7458704#.Y6CmT1FOk2w谷歌学者谷歌学者
  98. [98]尼利扎德·阿米尔法哈德.2021.测试过度:挑战、方法和测量.技术报告。中佛罗里达大学计算机科学系。谷歌学者谷歌学者
  99. [99]尼利扎德·阿米尔法哈德.2022.自动程序修复和测试过拟合:使用形式化方法的测量和方法.英寸IEEE软件测试、验证和确认会议记录(ICST'22)IEEE中,480482.谷歌学者谷歌学者
  100. [100]尼利扎德·阿米尔法哈德,卡尔沃·马龙,利文斯·加里·T、和科克·大卫·R.2022.从老式验证尝试中以单元测试的形式生成反例.英寸IEEE/ACM第十届软件工程形式化方法国际会议论文集.124128.谷歌学者谷歌学者数字图书馆数字图书馆
  101. [101]尼利扎德·阿米尔法哈德,卡尔沃·马龙,利文斯·加里·T。、和乐轩-巴赫D。.2021.使用反例为动态APR提供更可靠的测试套件.英寸IEEE第32届软件可靠性工程国际研讨会论文集(ISSRE'21).电气与电子工程师协会,208219.谷歌学者谷歌学者
  102. [102]尼利扎德·阿米尔法哈德利文斯·加里·T。.2022.切合实际:自动程序修复是不可判定问题的组合.英寸第三届自动程序修复国际研讨会会议记录.3132.谷歌学者谷歌学者数字图书馆数字图书馆
  103. [103]尼利扎德·阿米尔法哈德,利文斯·加里·T。,乐轩-巴赫D。,佩斯·雷努·科琳娜·s。、和科克·戴维·R。.2021.用形式化方法探讨动态自动程序修复中的真测试过拟合.英寸第14届IEEE软件测试、验证和确认会议(ICST'21)会议记录.电气与电子工程师协会,加利福尼亚州洛斯阿拉米托斯,229240.谷歌学者谷歌学者
  104. [104]尼利扎德·阿米尔法哈德,莱文斯·加里·T。、和佩斯·雷努·科琳娜·s。.2021.使用引导模糊器和前置条件实现有效输入的分支覆盖.英寸测试和证明,Loulerge Frédéric餐厅沃塔瓦·弗兰兹(编辑)。施普林格国际出版公司,查姆,7284.谷歌学者谷歌学者
  105. [105]尼利扎德希林,诺勒·亚尼克、和帕萨雷努·科里纳。.2019.DifFuzz:用于副通道分析的差分模糊.英寸IEEE/ACM第41届软件工程国际会议(ICSE’19)会议记录IEEE标准,176187.谷歌学者谷歌学者数字图书馆数字图书馆
  106. [106]诺勒·亚尼克,克尔斯滕·罗迪、和佩斯·雷努·科琳娜·s。.2018.Badger:模糊化和符号执行的复杂性分析.英寸第27届ACM SIGSOFT国际软件测试与分析研讨会论文集.322332.谷歌学者谷歌学者数字图书馆数字图书馆
  107. [107]诺勒·亚尼克,帕萨雷努·科里纳,伯赫梅·马塞尔,孙友成,阮黄林、和格伦斯克·拉尔斯.2020.HyDiff:混合差速器软件分析.英寸第42届ACM/IEEE软件工程国际会议(ICSE’20)会议记录.12731285.谷歌学者谷歌学者数字图书馆数字图书馆
  108. [108]厄斯特伦德·塞巴斯蒂安,拉扎维·卡维,博斯·赫伯特、和朱弗雷达·克里斯蒂亚诺.2020.帕尔马干酪:消毒剂引导灰盒起毛.英寸第29届USENIX安全研讨会会议记录.22892306.谷歌学者谷歌学者
  109. [109]帕切科·卡洛斯恩斯特·迈克尔·D。.2007.Randoop:面向Java的反馈式随机测试.英寸第22届ACM SIGPLAN面向对象编程系统和应用会议指南.815816.谷歌学者谷歌学者数字图书馆数字图书馆
  110. [110]帕切科·卡洛斯,拉希里·舒文杜(Lahiri Shuvendu K.)。,恩斯特·迈克尔·D。、和鲍尔·托马斯.2007.反馈定向随机测试生成.英寸第29届国际软件工程会议记录(ICSE’07)IEEE标准,7584.谷歌学者谷歌学者数字图书馆数字图书馆
  111. [111]Padhye Rohan女士,莱米尤斯·卡罗琳、和森·库什克.2019.JQF:Java中基于属性的Coverage-guided测试.英寸第28届ACM SIGSOFT软件测试与分析国际研讨会论文集.398401.谷歌学者谷歌学者数字图书馆数字图书馆
  112. [112]Paraskevopoulou佐伊,赫里库特林,邓内斯·马克西姆,莱昂尼达斯、和皮尔斯·本杰明C.2015.基础性能测试.英寸交互式定理证明国际会议.施普林格,325343.谷歌学者谷歌学者交叉引用交叉引用
  113. [113]彼得·丹尼斯帕纳斯·大卫·L·。.1994.从程序文档生成测试预言机:正在进行中.英寸ACM SIGSOFT软件测试和分析国际研讨会会议记录.5865.谷歌学者谷歌学者
  114. [114]波尔·埃里克.2009.使用JML和ESC/Java2进行教学程序规范和验证.英寸国际技术形式方法会议.施普林格,92104.谷歌学者谷歌学者
  115. [115]普拉德尔·迈克尔森·库什克.2018.Deepbugs:基于名称的bug检测的学习方法.英寸美国计算机学会程序设计语言会议录 2,OOPSLA公司(2018),125.谷歌学者谷歌学者数字图书馆数字图书馆
  116. [116]拉贾尔·莫希特,布鲁姆·威廉、和辛格·里沙布.2017.并非所有字节都相等:模糊化的神经字节筛.arXiv:1711.04596。检索自https://arxiv.org/abs/1711.04596谷歌学者谷歌学者
  117. [117]拉莫斯·戴维A。恩格尔·道森.2015.受约束的符号执行:真实代码的正确性检查.英寸第24届USENIX安全研讨会会议记录.4964.谷歌学者谷歌学者
  118. [118]拉瓦特·桑杰,贾恩·维维克,库马尔·阿什什,科乔卡尔·卢西安,朱弗里达·克里斯蒂亚诺、和博斯·赫伯特.2017.VUzzer:应用软件进化模糊。网络与分布式系统安全研讨会论文集(NDSS’17),卷。17.114.谷歌学者谷歌学者
  119. [119]拉什比·约翰·M亨克·弗里德里希·冯.1993.关键系统算法的形式化验证.IEEE传输。柔和。工程师。 19,1(1993),1323.谷歌学者谷歌学者数字图书馆数字图书馆
  120. [120]史密斯爱德华K,巴尔·厄尔·T,古埃斯·克莱尔·勒、和布伦·尤里.2015.治愈比疾病更糟糕吗?自动程序修复中的过度拟合.英寸第十届软件工程基础联席会议记录.ACM公司,532543.谷歌学者谷歌学者数字图书馆数字图书馆
  121. [121]宋多京(Song Dokyung),莱特纳·朱利安,拉贾塞卡兰·帕布,纳·尤尔,沃尔卡特·斯蒂恩,Larsen Per公司、和迈克尔.2019.SoK:安全消毒.英寸IEEE安全与隐私研讨会会议记录(SP'19)IEEE标准,12751295.谷歌学者谷歌学者交叉引用交叉引用
  122. [122]斯蒂芬·尼克,格罗森·约翰,萨尔斯·克里斯托弗,达奇·安德鲁,王若愚,科贝塔·雅科波,肖什塔什维利·严,克鲁格尔·克里斯托弗、和维格纳·乔瓦尼.2016.司钻:通过选择性符号执行增强模糊。.英寸网络与分布式系统安全研讨会论文集(NDSS’16),卷。16.116.谷歌学者谷歌学者交叉引用交叉引用
  123. [123]维塞尔·威廉姆Geldenhuys Jaco公司.2020.COASTAL:结合Java的concolic和fuzzing(竞争贡献).英寸系统构造和分析工具和算法国际会议.施普林格,373377.谷歌学者谷歌学者
  124. [124]维塞尔·威廉姆,佩斯·雷努·科琳娜·s。、和库尔希德·萨夫拉兹(Khurshid Sarfraz).2004.使用Java PathFinder测试输入生成.英寸ACM SIGSOFT软件测试与分析国际研讨会论文集.97107.谷歌学者谷歌学者数字图书馆数字图书馆
  125. [125]王明哲,梁杰,陈元良,姜瑜,焦迅,刘翰,赵锡斌、和孙家光.2018.SAFL:通过符号执行和引导模糊化增加和加速测试覆盖率.英寸第40届软件工程国际会议论文集:伴随程序.6164.谷歌学者谷歌学者数字图书馆数字图书馆
  126. [126]王铁雷,魏涛,顾国飞、和邹伟.2010.TaintScope:用于自动软件漏洞检测的校验和软件导向模糊工具.英寸IEEE安全与隐私研讨会会议记录IEEE标准,497512.谷歌学者谷歌学者
  127. [127]王夏静,胡长珍,马锐,李斌斌、和王雪飞.2020.LAFuzz:用于有效模糊的神经网络.英寸IEEE第32届人工智能工具国际会议论文集IEEE标准,603611.谷歌学者谷歌学者
  128. [128]伍德科克吉姆,拉森·彼得·戈尔姆,比卡雷奎·胡安、和菲茨杰拉德·约翰.2009.正规方法:实践与经验.ACM计算。Surv公司。 41,4(2009),136.谷歌学者谷歌学者数字图书馆数字图书馆
  129. [129]徐国庆杨宗元.2003.JMLAutoTest:一种基于JML和JUnit的新型自动化测试框架.英寸软件测试正式方法国际研讨会.施普林格,7085.谷歌学者谷歌学者
  130. [130]杨俊峰,特威·保罗,恩格尔·道森、和穆苏瓦提·马丹拉尔.2006.使用模型检查查找严重的文件系统错误.ACM事务处理。计算。系统。 24,4(2006),393423.谷歌学者谷歌学者数字图书馆数字图书馆
  131. [131]岳台,唐勇,于波,王鹏飞、和王恩泽.2019.LearnAFL:带知识增强的灰盒模糊.IEEE接入 7(2019),117029117043.谷歌学者谷歌学者交叉引用交叉引用
  132. [132]Zalewski Michal公司.2014.afl-fuzz的技术“白皮书”。检索自http://lcamtuf.coredump.cx/afl/technical_details.txt谷歌学者谷歌学者
  133. [133]张亮,乔夫内斯·戴维,莱文·戴夫,杜米特拉什·都铎,爱错了Alan,舒尔曼·亚伦、和威尔逊·克里斯托.2014.心跳停止后SSL证书重新颁发和吊销的分析.英寸互联网测量会议记录.ACM时,489502.谷歌学者谷歌学者
  134. [134]朱晓刚,文胜,坎特佩·塞伊特、和向阳.2022.模糊:路线图调查.ACM计算。Surv公司。(简。2022).刚刚接受.谷歌学者谷歌学者数字图书馆数字图书馆
  135. [135]齐默尔曼·丹尼尔·MNagmoti Rinkesh公司.2010.JMLUnit:下一代.英寸面向对象软件形式验证国际会议.施普林格,183197.谷歌学者谷歌学者

索引术语

  1. JMLKelinci+:使用Coverage-guided模糊化和运行时断言检查检测语义错误并使用有效输入覆盖分支

    建议

    评论

    登录选项

    检查您是否可以通过登录凭据或您的机构访问本文。

    登录

    完全访问权限

    • 发布于

      封面图像计算的形式方面
      计算的形式化方面 第36卷第1期
      2024年3月
      194页
      国际标准编号:0934-5043
      EISSN公司:1433-299X年
      内政部:10.1145/3613521
      期刊目录

      如果复制品不是为了盈利或商业利益而制作或分发的,并且复制品的第一页载有本通知和完整引文,则允许免费制作本作品的全部或部分数字或硬拷贝以供个人或课堂使用。必须尊重作者以外的其他人拥有的本作品组成部分的版权。允许用信用证进行摘要。要以其他方式复制或重新发布,在服务器上发布或重新发布到列表,需要事先获得特定许可和/或付费。从请求权限[电子邮件保护].

      出版商

      计算机协会

      美国纽约州纽约市

      出版历史

      • 出版:2024年3月20日
      • 在线AM:2023年8月5日
      • 认可的:2023年6月11日
      • 修订过的:2023年5月18日
      • 收到:2022年4月13日
      发布于fac公司第36卷第1期

      权限

      请求有关此文章的权限。

      请求权限

      检查更新

      限定符

      • 研究论文

    PDF格式

    以PDF文件查看或下载。

    PDF格式

    电子阅读器

    使用eReader联机查看。

    电子阅读器