技术领域
[0001] 本
发明属于
软件测试技术领域,涉及编译器测试方法,尤其涉及一种基于机器学习的编译器测试加速方法(LET:learning-to-test),能够使编译器在测试过程中更早地检测出
缺陷。
背景技术
[0002] 编译器作为高级编程语言和机器字节码之间转换的纽带,具有十分关键且不可替代的作用,几乎所有的软件系统都依赖于它。然而,和所有其他软件一样,编译器也不可避免地存在着缺陷。由于编译器的复杂特性,其缺陷是很难被人们所发现的。在编译器发展的几十年中,许多有效的编译器测试技术已经被提出,如随机差异测试、等价取模测试等。但是,无论采用哪种测试技术,编译器测试都是一个十分耗时的过程,常常需要数月甚至数年的测试时间,才能够发现少量的缺陷。
[0003] 针对编译器测试时间长的问题,目前没有任何有效的针对性方法来解决它。在编译器测试中,由于只有一小部分的测试程序会触发编译器的缺陷,那么,倘若可以先执行这些能触发编译器缺陷的测试程序,那么编译器测试即可被加速。因此,测试
用例排序可以用来加速编译器测试。然而,大多数已有的测试用例排序方法都是依赖于
覆盖信息的,而编译器的测试程序往往都是随机生成的,不可能提前获得它们的覆盖信息。也就是说,这些基于覆盖信息的测试用例排序方法无法用于编译器测试加速。最近,一些基于测试输入的测试用例排序方法被提出,然而通过实验表明,这些已有的基于测试输入的方法由于效率和效果的不足,仍然不能用于加速编译器。因此,目前还没有可以用来有效加速编译器测试的测试用例排序方法。
发明内容
[0004] 针对
现有技术的不足,本发明提出了一种基于机器学习的编译器测试加速方法。通过本发明,测试人员可以在执行测试程序之前,事先对测试程序进行排序,使得更有可能触发缺陷的测试程序被优先执行,从而达到编译器测试的加速。
[0005] 本发明的原理是:通过机器学习的方法构造两个模型:能
力模型与时间模型。前者可以预测每个测试程序触发缺陷的概率,后者可以预测每个测试程序的执行时间。通过计算每个测试程序单位时间内触发缺陷的概率,实现对测试程序的排序。具体步骤可以分为两个阶段:学习阶段与调度阶段。学习阶段包括识别特征、训练能力模型、训练时间模型;在调度阶段,基于已经训练好的能力模型和时间模型,调度得到测试程序新的执行顺序;由此加速编译器测试。
[0006] 本发明的技术方案是:
[0007] 一种基于机器学习的编译器测试加速方法,通过机器学习的方法构造能力模型与时间模型,能力模型用于预测每个测试程序触发缺陷的概率,时间模型用于预测每个测试程序的执行时间;该加速方法通过计算每个测试程序单位时间内触发缺陷的概率,实现对测试程序的排序;包括学习阶段与调度阶段;分别包括如下步骤:
[0008] 1)学习阶段
[0009] 11)识别特征,包括存在特征和使用特征;
[0010] 通过手工研究大量编译器缺陷之后,识别出的特征可以被分为两类。第一类特征称为存在特征,指的是在测试程序中是否存在某种类型的语言元素。直观地讲,有一些缺陷的发生仅仅依赖于某种特定的语言元素,因此这些元素是否存在一定程序上可以帮助预测测试程序是否能够触发编译器缺陷。比如,循环优化相关缺陷的检测,必须使用具有循环元素的测试程序,否则无法触发到循环优化。如果测试程序存在该语言元素,那么该特征值为1,否则为0。更加具体地说,存在特征分为下列四类:
[0011] ●STMT:一组C语言中的所有语句类型
[0012] ●EXPR:一组C语言中的所有表达式类型
[0013] ●VAR:一组C语言中的所有变量类型
[0014] ●OP:一组C语言中的所有操作类型
[0015] 第二类特征被称为使用特征,指的是测试程序中某种语言元素被如何使用。直观地讲,某类编译器缺陷的触发,只有在某些程序元素被用于某种特定的行为时才会发生。比如,当一个
指针指向了多地址,那么可能触发编译器中与指针相关的缺陷。在本发明中,我们利用了一个随机测试程序生成工具CSmith的特性,即当使用CSmith生成测试程序时,它会记录生成程序的一些使用特性。为了节约特征收集的时间,我们直接使用了由CSmith收集的使用特性,具体如下:
[0016] ●地址特征,如一个结构体或者一个变量被
访问地址的次数
[0017] ●结构体位域特征:如全域结构体的个数
[0018] ●指针引用特征:如指针引用深度
[0019] ●指针比较特征:如指针与NULL比较的次数
[0021] ●跳跃特征:如前跳的次数
[0022] ●使用变量的特征:如新创建的变量的比例
[0023] 12)训练能力模型
[0024] 通过已经存在的测试程序生成工具(CSmith),首先收集一组测试程序作为训练集,其中一半为能够触发缺陷,另一半为不能够触发缺陷。基于这一组训练集,通过下列三个步骤训练能力模型:特征选择、归一化和构建能力模型。本发明中,能力模型是指用来预测测试程序触发缺陷概率的模型。
[0025] 特征选择:计算每个特征的信息增益比。在这里,信息增益比指的是对本质信息的信息增益的比例,其经常被用作度量一个特征的贡献。通过计算信息增益比,可以过滤掉无效的特征,即信息增益比为零的特征。
[0026] 归一化:由于特征通常是数值类型和布尔类型,本发明通过最大最小归一化法将特征的值统一到[0,1]区间中。假设测试程序集为T={t1,t2,…,tm},特征集为F={f1,*f2,…,fs},使用变量xij来表示测试程序ti的特征fj在归一化前的值;使用变量xij来表示测试程序ti的特征fj在归一化后的值。其中1≤i≤m,1≤j≤s。xij*可通过如下公式求得:
[0027]
[0028] 构建能力模型:经过特征选择和归一化之后,使用序列最小优化
算法(Sequential Minimal Optimization,简称SMO)机器学习算法构建能力模型。在训练模型中,LET使用Puk核函数,同时设置omega的值为1.0以及sigma的值为0.7。SMO算法是一种
支持向量机算法,该算法通过将一个大的二次方程优化问题拆分成了一系列最小的二次方程优化问题,从而加速了传统的支持向量机算法。特别地,训练出的能力模型可以预测任何一个新的测试程序的缺乏缺陷的概率,具体来说,该模型的输入为由测试程序抽象而来的
特征向量,输出为该模型基于特征向量值计算出的概率值,即触发缺陷的概率。
[0029] 13)训练时间模型
[0030] 收集一组测试程序作为训练集,并记录了其执行时间,每一个测试程序被当作一个实例,提取上述所有列出的特征,并将记录的时间作为标记。与训练能力模型类似,首先对训练集的每一维特征进行归一化处理,然后使用高斯过程构建回归模型,即时间模型。在训练模型中,LET同样使用Puk核函数,同时设置omega的值为3.3以及sigma的值为0.5。高斯过程使用懒惰学习方法以及核函数训练模型。特别地,训练出的时间模型用来预测新的测试程序的实际执行时间,具体来说,该模型的输入为由测试程序抽象而来的特征向量,输出为该模型基于特征向量值计算出的值,即测试程序的执行时间。
[0031] 2)调度阶段
[0032] 基于学习的能力模型和时间模型,在调度阶段调度新的测试程序的执行顺序。首先,对每个待调度的测试程序提取上述所有列出的特征,然后使用这两个模型分别预测该测试程序的触发缺陷的概率以及执行时间。接着,计算每个程序的单位时间内的触发缺陷的概率,即用能力模型预测的触发缺陷的概率值除以时间模型预测的执行时间。最后,LET基于每个测试程序的单位时间的触发缺陷的概率,按照概率值从大到小的顺序对测试程序进行排序。
[0033] 与现有技术相比,本发明的有益效果是:
[0034] 本发明提出了一种基于机器学习的编译器测试加速方法,通过机器学习的方法构造能力模型与时间模型,能力模型用于预测每个测试程序触发缺陷的概率,时间模型用于预测每个测试程序的执行时间;该加速方法通过计算每个测试程序单位时间内触发缺陷的概率,实现对测试程序的排序。
[0035] 本发明可实现加速编译器测试。现有的编译器测试,都是通过生成大量的测试程序,然后直接执行,使用各种各样的测试预言对是否触发缺陷进行判断,这样的方式往往导致编译器测试的时间非常长。通过本发明,测试人员可以在执行测试程序之前,事先对测试程序进行排序,使得更有可能触发缺陷的测试程序被优先执行,从而达到编译器测试的加速。
附图说明
具体实施方式
[0037] 下面结合附图,通过
实施例进一步描述本发明,但不以任何方式限制本发明的范围。
[0038] 本发明提出了一种基于机器学习的编译器测试加速方法,通过机器学习的方法构造能力模型与时间模型,能力模型用于预测每个测试程序触发缺陷的概率,时间模型用于预测每个测试程序的执行时间;该加速方法通过计算每个测试程序单位时间内触发缺陷的概率,实现对测试程序的排序。本发明可应用于加速编译器测试。
[0039] 通过本发明,开发人员可以在进行编译器测试之前,对测试程序进行排序,使更能够触发缺陷的测试程序优先执行,从而达到加速编译器测试的效果。以下实例收集1000个测试程序作为训练集,生成1000个测试程序作为测试集,实施本发明提出的编译器测试加速方法,图1所示为本发明方法的流程,具体包括如下步骤:
[0040] 1)对训练集中的1000个程序中的每个程序提取出特征,特征包括存在特征和使用特征;并对特征进行归一化处理,分别构建能力模型和时间模型;能力模型用于预测每个测试程序触发缺陷的概率;时间模型用来预测测试程序的实际执行时间。
[0041] 存在特征指的是在测试程序中是否存在某种类型的语言元素。如果测试程序存在该语言元素,那么该特征值为1,否则为0。更加具体地说,C语言中的存在特征分为下列四类:
[0042] ●STMT:一组C语言中的所有语句类型
[0043] ●EXPR:一组C语言中的所有表达式类型
[0044] ●VAR:一组C语言中的所有变量类型
[0045] ●OP:一组C语言中的所有操作类型
[0046] 使用特征指的是测试程序中某种语言元素被如何使用。本发明具体实施中,我们利用了一个随机测试程序生成工具CSmith的特性,即当使用CSmith生成测试程序时,它会记录生成程序的一些使用特性。为了节约特征收集的时间,我们直接使用了由CSmith收集的使用特性,具体如下:
[0047] ●地址特征,如一个结构体或者一个变量被访问地址的次数
[0048] ●结构体位域特征:如全域结构体的个数
[0049] ●指针引用特征:如指针引用深度
[0050] ●指针比较特征:如指针与NULL比较的次数
[0051] ●别名集合特征:如别名集合大小
[0052] ●跳跃特征:如前跳的次数
[0053] ●使用变量的特征:如新创建的变量的比例
[0054] 特征归一化:本发明通过最大最小归一化法将特征的值统一到[0,1]区间中。
[0055] 构建能力模型过程中,在对特征归一化之前,需要选择特征。选择特征具体通过计算每个特征的信息增益比,过滤掉信息增益比为零(无效)的特征。信息增益比是对本质信息的信息增益的比例,经常被用作度量一个特征的贡献。
[0056] 构建能力模型:本发明具体实施中,使用序列最小
优化算法(Sequential Minimal Optimization,简称SMO)机器学习算法构建能力模型。在训练模型中,使用Puk核函数,同时设置omega的值为1.0以及sigma的值为0.7。SMO通过将一个大的二次方程优化问题拆分成了一系列最小的二次方程优化问题,从而加速了传统的支持向量机算法。
[0057]
构建时间模型;记录每一个测试程序的执行时间,将每一个测试程序当作一个实例,针对上述提取出的特征,将记录的执行时间作为标记。与训练能力模型类似,首先对训练集每一维特征值进行归一化,然后使用高斯过程构建回归模型,即时间模型。在训练模型中,同样使用Puk核函数,同时设置omega的值为3.3以及sigma的值为0.5。高斯过程使用懒惰学习方法以及核函数训练模型。
[0058] 2)将测试集合中的1000个程序中的每个程序提取上述特征,并将该特征向量作为能力模型的输入,预测每个测试程序触发编译器缺陷的概率。
[0059] 3)将测试集合中的1000个程序中的每个程序提取上述特征,并将该特征向量作为时间模型的输入,预测每个测试程序的实际执行时间。
[0060] 4)计算每个测试程序单位时间内触发缺陷的概率(即将预测得到的触发缺陷的概率值除以预测得到的执行时间),对测试集中的1000个测试程序按照该概率值由大到小的顺序对其进行排序,得到测试程序新的执行顺序,由此加速编译器测试。
[0061] 表1 LET的加速效果与随机排序和基于文本向量的排序方法的对比
[0062]
[0063] 表1是LET的加速效果与随机排序和基于文本向量的排序方法的对比,表1中,第一列和第九列代表LET的应用场景,比如Open64-5.0->GCC-4.4.3表示在Open64-5.0上训练模型,对GCC-4.4.3进行测试;第二列和第十列代表缺陷数量;第三、六、十一、十四列代表随机排序的结果,即检测到相应数量的缺陷所花费的时间;第四、七、十二、十五列代表LET与随机排序的效果差,即检测到相同数量的缺陷,LET所节约的时间;第五、八、十三、十六列代表基于文本向量的排序方法与随机排序的效果差,即检测到相同数量的缺陷,基于文本向量的排序方法所节约的时间;此外,DOL和EMI是两种最常用的编译器测试技术。从表1可以看出,在各种应用场景下,对于使用DOL和EMI这两种编译器测试技术来说,检测各种数量的缺陷时,LET在大多数情况下都花费最短的时间检测这些缺陷,这意味着LET确实在很大程度上加速了编译器测试。
[0064] 表2 LET对不同编译器技术在不同测试场景下的统计结果
[0065]
[0066] 表2是LET对不同编译器技术在不同测试场景下的统计结果,表2中,DOL和EMI代表两种不同的编译器测试技术;Cross-compiler和Cross-version代表着不同的LET测试场景,前者代表训练集和测试集来自不同的编译器,或者代表训练集和测试集来自同一个编译器的不同版本;Mean代表着LET所达到的加速比的平均值,p-value代表着LET的加速效果是否显著,其中带有加号代表显著;从表2可以看出,无论对于哪一种编译器测试技术,在哪一种测试场景下,LET都显著地加速了编译器测试,平均加速比在27.69%到50.81%的范围内。
[0067] 需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附
权利要求的精神和范围内,各种替换和
修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。