论文部分内容阅读
编译器是最重要的系统软件之一。如果编译器本身有问题,那么它编译生成的可执行文件可能会出现严重的错误。编译器测试能够保证编译器的质量。近年来,许多技术促进了编译器自动化测试技术的发展。它们通常依赖于一些测试用例生成的工具(如Csmith等),用来生成大量的测试用例(编译器测试的输入)。因为编译器是一个非常庞大、复杂的软件,测试人员往往会利用大量的测试用例对编译器进行压力测试。虽然现有的编译器测试方法引入额外的特征对编译器测试过程进行改进,但是它们均存在严重的效率问题。编译器测试优化即优化编译器测试程序的执行顺序,加速编译器测试过程,提升编译器测试能力。许多加速编译器测试的方法通过特定的准则,优先执行最有可能触发编译器错误的测试用例。但是,它们忽略了编译器测试过程中的一个严重问题,即不同的测试用例极有可能触发相同的编译器错误。测试覆盖信息能够有效地区分测试程序。由于编译器测试中测试用例均是由自动化测试生成工具自动生成的,动态获取测试程序的覆盖信息的开销是巨大的。本文提出一种能够静态获取测试程序覆盖信息的方法,利用得到的覆盖信息,基于聚类的方法,重新排列测试程序在编译器测试过程中的执行顺序,达到加速编译器测试的目的。预测覆盖信息即预测编译器对一个测试程序进行编译时编译器组件被覆盖的信息(如源代码文件是否被覆盖,函数是否被执行等信息)。预测覆盖信息可以看作为多输出的回归问题,每一个标签代表编译器组件中的被关注的元素(如文件粒度上源代码文件是否被执行,语句粒度上语句是否被执行等)。与典型的机器学习算法应用场景类似,预测覆盖信息的过程需要定义特征,标签,训练预测模型,预测和对齐数据等。本文将这一方法命名为COP(COverage Prediction的缩写)。本文分别基于GCC和LLVM编译器进行大量实验,实验结果表明,COP方法能够有效加速编译器测试过程,平均达到了51.01%的加速比。此外,COP方法和已知效果最好的加速方法相比,在各项实验设置中,性能提升了17.16%-82.51%。