ICSE16论文介绍——编译器测试技术比较
Posted 软件工程研究与实践
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ICSE16论文介绍——编译器测试技术比较相关的知识,希望对你有一定的参考价值。
在当今信息化时代中,编译器是最重要的基础软件之一。如果编译器有错误,那么该编译器编译出来的软件可能都有错误,造成严重影响。因此,人们都尽可能的消除编译器的错误。当前,在工业界使用最广泛的发现编译器错误的方法还是采用测试的方法。因为手动编写测试用例耗时耗力,因此人们提出了各种各样的编译器测试生成技术来减轻手动编写的工作量。
自动测试生成有两大核心任务,一是生成测试输入,二是生成测试预言来检查输出的正确性。测试输入生成通常采用随机生成的方法,其中一个代表性的工具是CSmith。CSmith由华人学者Xuejun Yang、Yang Chen等人开发,可以随机生成不包含未定位行为的C语言程序。测试预言的生成一直是比较困难的问题,但近年来该领域取得了一系列显著进展,形成了三大主流方法。
第一个主流方法是随机差异测试(Random Differential Testing, RDT)。在编译器领域,RDT采用同一语言的两个不同的编译器,如GCC和LLVM,然后用两个编译器编译同样的程序并执行。如果两个编译器编译出来的程序呈现出不同的行为,那么其中一个编译器一定存在缺陷。
第二个主流方法是优化级别测试(Different Optimization Levels, DOL),是RDT的一个变种。由于大量的编译器缺陷都是优化缺陷,所以DOL不对比的两个编译器的结果,而是对比同一个编译器不同优化选项输出的结果。如果输出程序运行行为不一致,那么一定有一种优化存在缺陷。
第三个主流方法是近年由美国UC Davis苏振东教授团队来提出的等价取模测试(Equivalent Modulo Inputs, EMI)。和RDT等方法不同,EMI不试图采用两个等价的编译器,而试图构造两个在给定输入下等价的程序。给定一个程序,EMI首先在某个输入下执行该程序,同时观察有哪些语句被执行了。接下来EMI试图随机修改没有被执行到的语句。因为这些语句不会被执行到,所以无论对这些语句进行何种修改,最后得到的程序在该输入下仍然是等价的。如果两个程序编译之后在这个输入下跑出了不同结果,那么编译器一定存在缺陷。
这些方法在实际的编译器上经过了长时间的验证,并发现了大量真实存在的编译器缺陷。比如,RDT对GCC进行了三年的测试,发现了325个编译器缺陷。在此之后,RDT集成到了GCC的开发流程中,成为GCC开发的标准测试步骤。EMI也对GCC的最新trunk版进行了11个月的跟踪测试,并发现了147个编译器缺陷。
但是,尽量这些测试方法都能取得很好的查错效果,我们并不知道这些方法哪个更为有效。当我们自己开发一款编译器的时候,我们也无法知道应该优先选择哪个方法对编译器进行测试。因此,在我们的ICSE’16论文《An Empirical Comparison of Compiler Testing Techniques》中,我们试图通过对这三个编译技术进行对比来回答这个问题,即,在一定测试时间内,我们检查每种测试技术能够检测到多少编译器的错误。
但是,对这些测试方法进行对比并不容易。三种测试方法都只能告诉我们在一些程序上编译器存在缺陷。但给定两个引发编译器缺陷的程序,我们并不知道他们是引发的是同一个缺陷还是两个不同的缺陷。已有的研究往往忽略这个问题,直接以发现的引发错误的程序数来表示编译器的效果。我们的研究表明,这个直接忽略会导致及其不精确的结果。同时,因为所找出来的程序数量往往很庞大,我们也难以人工鉴别两个程序是否引发的是同一个缺陷。
为了解决这个问题,我们选择了一个比较早版本的编译器进行测试,这样我们所发现的缺陷在新版本的编译器上大多已经被修复。每当我们发现一个引发缺陷的程序的时候,我们观察这个缺陷是在编译器代码的哪一次提交中被修复的,即从哪一个版本开始该程序工作正常。当两个不同的程序都刚好从同一个版本开始呈现正常行为的时候,我们就认为这两个程序引发的是同一个缺陷。实验表明,我们的这个方法大大提高了编译器测试效果的衡量准确度。
基于这个方案,我们在GCC和LLVM两个C语言编译器上对这三种方法进行了对比。实验结果表明,三种方法发现缺陷的效果存在显著差异。其中DOL在在检测与优化相关的缺陷时最为有效,即在相同时间内检查出来最多的缺陷,而RDT在检测非优化缺陷时最为有效。同时,三种方法都能发现一些独有的缺陷,即其他两种方法没有检测到的缺陷。因此,即使某种方法被证明不如其他方法有效,我们仍然有必要在测试编译的时候采用该方法。
基于这个结论,我们推荐在实践中采用的编译器测试方案应该是按一定顺序应用三种方法。其中更有效的方法应该优先采用,当该方法无法发现新的缺陷的时候就换用下一种方法。在编译器主要包含优化相关缺陷的时候,我们推荐的顺序是DOL, RDT, EMI。在编译器包含大量非优化缺陷的时候,我们推荐的顺序是RDT, DOL, EMI。
此外,为了更深层次地理解这三种编译器测试技术的效果差异,我们探索了三种影响编译器测试效果的因素,即测试效率(在一定时间内,有多少测试程序被运行),测试预言的强度(给定相同的测试程序,哪种技术检测的错误更多),和测试程序的有效性(等价取模测试产生的变体程序是否会比原始的随机生成的测试程序检测更多的错误)。实验结果表明,这三种因素均对编译器测试技术的效果具有显著性的影响,并且测试效率对其的影响是最显著的。因此,我们在设计新的编译器测试应当综合考虑这三种因素,并重点考虑测试效率。
论文的作者包括博士生陈俊洁、硕士生胡文翔、郝丹副教授、熊英飞研究员、张洪宇研究员、张路教授和谢冰教授。其中郝丹、熊英飞、张洪宇为共同第一指导教师。
以上是关于ICSE16论文介绍——编译器测试技术比较的主要内容,如果未能解决你的问题,请参考以下文章