论文部分内容阅读
编译器在软件的发展中扮演着非常重要的角色,同时也有越来越多的研究人员研究如何提高编译器的可靠性。如果编译器出现错误,那么这会影响所有使用该编译器编译的程序。但是,编译器的错误是难以识别的。因此,当编译器发生错误的时候,可能会导致编程人员无意识的错误,这产生的后果是非常严重的。测试编译器最重要的一个部分就是如何建立测试用例集合。但是测试用例集合的构造代价是巨大的。针对这个问题,目前有两个方法:基于参考的方法,和基于断言的方法。由于这两种方法都有一些弊端,这几年提出了一种新的方法—蜕变测试。蜕变测试是具有蜕变关系的两个或者几个测试用例作为待测程序的输入,观察输出是否具有期望的蜕变关系。现有的蜕变测试的测试用例生成方法主要有删除无效代码,不执行语句块替换,和等价模块替换等。基于此,本文提出一种新的蜕变方法。我们采用的蜕变关系也是等价关系,但本文是通过变量的值替换的方法和在变量替换后的程序基础上进行未执行代码删除的的方法构造等价蜕变关系,从而生成等价的程序组。本文首先简要介绍了编译器测试,蜕变测试的基础知识,并且介绍了本文工具的源程序生成工具—Csmith的工作原理。其次主要介绍了DeCsmith的工作流程,即Csmith生成的程序作为源程序,经过程序变异生成等价程序,输入到待测编译器,产生可执行文件,执行文件生成结果并做结果分析。再次主要对程序变异部分的原理和具体的实现进行介绍。本文通过对已知值的变量在其作用域内用其具体的值进行替换,并对变量替换后的程序进行未执行代码删除操作的方法构造等价蜕变关系,生成等价程序。变量替换主要利用clang工具提供的接口,进行程序至语法树的转换和语法树的访问,通过一个变量表记录变量的信息,依据语法树和变量表替换变量。未执行代码删除是利用gcov工具对变量替换后的程序进行执行次数统计,从而达到删除未执行代码的目的。最后,本文通过实验举例分析了利用DeCsmith测试编译器的结果,说明工具的有效性。本文的研究主要为蜕变测试的测试用例生成提供了一种新的方法,并且设计实现了基于Csmith的编译器测试用例的自动生成工具,为编译器测试提供了一定的帮助。