本發(fā)明屬于軟件測(cè)試技術(shù)領(lǐng)域,涉及編譯器測(cè)試方法,尤其涉及一種基于機(jī)器學(xué)習(xí)的編譯器測(cè)試加速方法(let:learning-to-test),能夠使編譯器在測(cè)試過程中更早地檢測(cè)出缺陷。
背景技術(shù):
編譯器作為高級(jí)編程語言和機(jī)器字節(jié)碼之間轉(zhuǎn)換的紐帶,具有十分關(guān)鍵且不可替代的作用,幾乎所有的軟件系統(tǒng)都依賴于它。然而,和所有其他軟件一樣,編譯器也不可避免地存在著缺陷。由于編譯器的復(fù)雜特性,其缺陷是很難被人們所發(fā)現(xiàn)的。在編譯器發(fā)展的幾十年中,許多有效的編譯器測(cè)試技術(shù)已經(jīng)被提出,如隨機(jī)差異測(cè)試、等價(jià)取模測(cè)試等。但是,無論采用哪種測(cè)試技術(shù),編譯器測(cè)試都是一個(gè)十分耗時(shí)的過程,常常需要數(shù)月甚至數(shù)年的測(cè)試時(shí)間,才能夠發(fā)現(xiàn)少量的缺陷。
針對(duì)編譯器測(cè)試時(shí)間長(zhǎng)的問題,目前沒有任何有效的針對(duì)性方法來解決它。在編譯器測(cè)試中,由于只有一小部分的測(cè)試程序會(huì)觸發(fā)編譯器的缺陷,那么,倘若可以先執(zhí)行這些能觸發(fā)編譯器缺陷的測(cè)試程序,那么編譯器測(cè)試即可被加速。因此,測(cè)試用例排序可以用來加速編譯器測(cè)試。然而,大多數(shù)已有的測(cè)試用例排序方法都是依賴于覆蓋信息的,而編譯器的測(cè)試程序往往都是隨機(jī)生成的,不可能提前獲得它們的覆蓋信息。也就是說,這些基于覆蓋信息的測(cè)試用例排序方法無法用于編譯器測(cè)試加速。最近,一些基于測(cè)試輸入的測(cè)試用例排序方法被提出,然而通過實(shí)驗(yàn)表明,這些已有的基于測(cè)試輸入的方法由于效率和效果的不足,仍然不能用于加速編譯器。因此,目前還沒有可以用來有效加速編譯器測(cè)試的測(cè)試用例排序方法。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)的不足,本發(fā)明提出了一種基于機(jī)器學(xué)習(xí)的編譯器測(cè)試加速方法。通過本發(fā)明,測(cè)試人員可以在執(zhí)行測(cè)試程序之前,事先對(duì)測(cè)試程序進(jìn)行排序,使得更有可能觸發(fā)缺陷的測(cè)試程序被優(yōu)先執(zhí)行,從而達(dá)到編譯器測(cè)試的加速。
本發(fā)明的原理是:通過機(jī)器學(xué)習(xí)的方法構(gòu)造兩個(gè)模型:能力模型與時(shí)間模型。前者可以預(yù)測(cè)每個(gè)測(cè)試程序觸發(fā)缺陷的概率,后者可以預(yù)測(cè)每個(gè)測(cè)試程序的執(zhí)行時(shí)間。通過計(jì)算每個(gè)測(cè)試程序單位時(shí)間內(nèi)觸發(fā)缺陷的概率,實(shí)現(xiàn)對(duì)測(cè)試程序的排序。具體步驟可以分為兩個(gè)階段:學(xué)習(xí)階段與調(diào)度階段。學(xué)習(xí)階段包括識(shí)別特征、訓(xùn)練能力模型、訓(xùn)練時(shí)間模型;在調(diào)度階段,基于已經(jīng)訓(xùn)練好的能力模型和時(shí)間模型,調(diào)度得到測(cè)試程序新的執(zhí)行順序;由此加速編譯器測(cè)試。
本發(fā)明的技術(shù)方案是:
一種基于機(jī)器學(xué)習(xí)的編譯器測(cè)試加速方法,通過機(jī)器學(xué)習(xí)的方法構(gòu)造能力模型與時(shí)間模型,能力模型用于預(yù)測(cè)每個(gè)測(cè)試程序觸發(fā)缺陷的概率,時(shí)間模型用于預(yù)測(cè)每個(gè)測(cè)試程序的執(zhí)行時(shí)間;該加速方法通過計(jì)算每個(gè)測(cè)試程序單位時(shí)間內(nèi)觸發(fā)缺陷的概率,實(shí)現(xiàn)對(duì)測(cè)試程序的排序;包括學(xué)習(xí)階段與調(diào)度階段;分別包括如下步驟:
1)學(xué)習(xí)階段
11)識(shí)別特征,包括存在特征和使用特征;
通過手工研究大量編譯器缺陷之后,識(shí)別出的特征可以被分為兩類。第一類特征稱為存在特征,指的是在測(cè)試程序中是否存在某種類型的語言元素。直觀地講,有一些缺陷的發(fā)生僅僅依賴于某種特定的語言元素,因此這些元素是否存在一定程序上可以幫助預(yù)測(cè)測(cè)試程序是否能夠觸發(fā)編譯器缺陷。比如,循環(huán)優(yōu)化相關(guān)缺陷的檢測(cè),必須使用具有循環(huán)元素的測(cè)試程序,否則無法觸發(fā)到循環(huán)優(yōu)化。如果測(cè)試程序存在該語言元素,那么該特征值為1,否則為0。更加具體地說,存在特征分為下列四類:
●stmt:一組c語言中的所有語句類型
●expr:一組c語言中的所有表達(dá)式類型
●var:一組c語言中的所有變量類型
●op:一組c語言中的所有操作類型
第二類特征被稱為使用特征,指的是測(cè)試程序中某種語言元素被如何使用。直觀地講,某類編譯器缺陷的觸發(fā),只有在某些程序元素被用于某種特定的行為時(shí)才會(huì)發(fā)生。比如,當(dāng)一個(gè)指針指向了多地址,那么可能觸發(fā)編譯器中與指針相關(guān)的缺陷。在本發(fā)明中,我們利用了一個(gè)隨機(jī)測(cè)試程序生成工具csmith的特性,即當(dāng)使用csmith生成測(cè)試程序時(shí),它會(huì)記錄生成程序的一些使用特性。為了節(jié)約特征收集的時(shí)間,我們直接使用了由csmith收集的使用特性,具體如下:
●地址特征,如一個(gè)結(jié)構(gòu)體或者一個(gè)變量被訪問地址的次數(shù)
●結(jié)構(gòu)體位域特征:如全域結(jié)構(gòu)體的個(gè)數(shù)
●指針引用特征:如指針引用深度
●指針比較特征:如指針與null比較的次數(shù)
●別名集合特征:如別名集合大小
●跳躍特征:如前跳的次數(shù)
●使用變量的特征:如新創(chuàng)建的變量的比例
12)訓(xùn)練能力模型
通過已經(jīng)存在的測(cè)試程序生成工具(csmith),首先收集一組測(cè)試程序作為訓(xùn)練集,其中一半為能夠觸發(fā)缺陷,另一半為不能夠觸發(fā)缺陷。基于這一組訓(xùn)練集,通過下列三個(gè)步驟訓(xùn)練能力模型:特征選擇、歸一化和構(gòu)建能力模型。本發(fā)明中,能力模型是指用來預(yù)測(cè)測(cè)試程序觸發(fā)缺陷概率的模型。
特征選擇:計(jì)算每個(gè)特征的信息增益比。在這里,信息增益比指的是對(duì)本質(zhì)信息的信息增益的比例,其經(jīng)常被用作度量一個(gè)特征的貢獻(xiàn)。通過計(jì)算信息增益比,可以過濾掉無效的特征,即信息增益比為零的特征。
歸一化:由于特征通常是數(shù)值類型和布爾類型,本發(fā)明通過最大最小歸一化法將特征的值統(tǒng)一到[0,1]區(qū)間中。假設(shè)測(cè)試程序集為t={t1,t2,…,tm},特征集為f={f1,f2,…,fs},使用變量xij來表示測(cè)試程序ti的特征fj在歸一化前的值;使用變量xij*來表示測(cè)試程序ti的特征fj在歸一化后的值。其中1≤i≤m,1≤j≤s。xij*可通過如下公式求得:
構(gòu)建能力模型:經(jīng)過特征選擇和歸一化之后,使用序列最小優(yōu)化算法(sequentialminimaloptimization,簡(jiǎn)稱smo)機(jī)器學(xué)習(xí)算法構(gòu)建能力模型。在訓(xùn)練模型中,let使用puk核函數(shù),同時(shí)設(shè)置omega的值為1.0以及sigma的值為0.7。smo算法是一種支持向量機(jī)算法,該算法通過將一個(gè)大的二次方程優(yōu)化問題拆分成了一系列最小的二次方程優(yōu)化問題,從而加速了傳統(tǒng)的支持向量機(jī)算法。特別地,訓(xùn)練出的能力模型可以預(yù)測(cè)任何一個(gè)新的測(cè)試程序的缺乏缺陷的概率,具體來說,該模型的輸入為由測(cè)試程序抽象而來的特征向量,輸出為該模型基于特征向量值計(jì)算出的概率值,即觸發(fā)缺陷的概率。
13)訓(xùn)練時(shí)間模型
收集一組測(cè)試程序作為訓(xùn)練集,并記錄了其執(zhí)行時(shí)間,每一個(gè)測(cè)試程序被當(dāng)作一個(gè)實(shí)例,提取上述所有列出的特征,并將記錄的時(shí)間作為標(biāo)記。與訓(xùn)練能力模型類似,首先對(duì)訓(xùn)練集的每一維特征進(jìn)行歸一化處理,然后使用高斯過程構(gòu)建回歸模型,即時(shí)間模型。在訓(xùn)練模型中,let同樣使用puk核函數(shù),同時(shí)設(shè)置omega的值為3.3以及sigma的值為0.5。高斯過程使用懶惰學(xué)習(xí)方法以及核函數(shù)訓(xùn)練模型。特別地,訓(xùn)練出的時(shí)間模型用來預(yù)測(cè)新的測(cè)試程序的實(shí)際執(zhí)行時(shí)間,具體來說,該模型的輸入為由測(cè)試程序抽象而來的特征向量,輸出為該模型基于特征向量值計(jì)算出的值,即測(cè)試程序的執(zhí)行時(shí)間。
2)調(diào)度階段
基于學(xué)習(xí)的能力模型和時(shí)間模型,在調(diào)度階段調(diào)度新的測(cè)試程序的執(zhí)行順序。首先,對(duì)每個(gè)待調(diào)度的測(cè)試程序提取上述所有列出的特征,然后使用這兩個(gè)模型分別預(yù)測(cè)該測(cè)試程序的觸發(fā)缺陷的概率以及執(zhí)行時(shí)間。接著,計(jì)算每個(gè)程序的單位時(shí)間內(nèi)的觸發(fā)缺陷的概率,即用能力模型預(yù)測(cè)的觸發(fā)缺陷的概率值除以時(shí)間模型預(yù)測(cè)的執(zhí)行時(shí)間。最后,let基于每個(gè)測(cè)試程序的單位時(shí)間的觸發(fā)缺陷的概率,按照概率值從大到小的順序?qū)y(cè)試程序進(jìn)行排序。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
本發(fā)明提出了一種基于機(jī)器學(xué)習(xí)的編譯器測(cè)試加速方法,通過機(jī)器學(xué)習(xí)的方法構(gòu)造能力模型與時(shí)間模型,能力模型用于預(yù)測(cè)每個(gè)測(cè)試程序觸發(fā)缺陷的概率,時(shí)間模型用于預(yù)測(cè)每個(gè)測(cè)試程序的執(zhí)行時(shí)間;該加速方法通過計(jì)算每個(gè)測(cè)試程序單位時(shí)間內(nèi)觸發(fā)缺陷的概率,實(shí)現(xiàn)對(duì)測(cè)試程序的排序。
本發(fā)明可實(shí)現(xiàn)加速編譯器測(cè)試?,F(xiàn)有的編譯器測(cè)試,都是通過生成大量的測(cè)試程序,然后直接執(zhí)行,使用各種各樣的測(cè)試預(yù)言對(duì)是否觸發(fā)缺陷進(jìn)行判斷,這樣的方式往往導(dǎo)致編譯器測(cè)試的時(shí)間非常長(zhǎng)。通過本發(fā)明,測(cè)試人員可以在執(zhí)行測(cè)試程序之前,事先對(duì)測(cè)試程序進(jìn)行排序,使得更有可能觸發(fā)缺陷的測(cè)試程序被優(yōu)先執(zhí)行,從而達(dá)到編譯器測(cè)試的加速。
附圖說明
圖1是本發(fā)明方法的流程框圖。
具體實(shí)施方式
下面結(jié)合附圖,通過實(shí)施例進(jìn)一步描述本發(fā)明,但不以任何方式限制本發(fā)明的范圍。
本發(fā)明提出了一種基于機(jī)器學(xué)習(xí)的編譯器測(cè)試加速方法,通過機(jī)器學(xué)習(xí)的方法構(gòu)造能力模型與時(shí)間模型,能力模型用于預(yù)測(cè)每個(gè)測(cè)試程序觸發(fā)缺陷的概率,時(shí)間模型用于預(yù)測(cè)每個(gè)測(cè)試程序的執(zhí)行時(shí)間;該加速方法通過計(jì)算每個(gè)測(cè)試程序單位時(shí)間內(nèi)觸發(fā)缺陷的概率,實(shí)現(xiàn)對(duì)測(cè)試程序的排序。本發(fā)明可應(yīng)用于加速編譯器測(cè)試。
通過本發(fā)明,開發(fā)人員可以在進(jìn)行編譯器測(cè)試之前,對(duì)測(cè)試程序進(jìn)行排序,使更能夠觸發(fā)缺陷的測(cè)試程序優(yōu)先執(zhí)行,從而達(dá)到加速編譯器測(cè)試的效果。以下實(shí)例收集1000個(gè)測(cè)試程序作為訓(xùn)練集,生成1000個(gè)測(cè)試程序作為測(cè)試集,實(shí)施本發(fā)明提出的編譯器測(cè)試加速方法,圖1所示為本發(fā)明方法的流程,具體包括如下步驟:
1)對(duì)訓(xùn)練集中的1000個(gè)程序中的每個(gè)程序提取出特征,特征包括存在特征和使用特征;并對(duì)特征進(jìn)行歸一化處理,分別構(gòu)建能力模型和時(shí)間模型;能力模型用于預(yù)測(cè)每個(gè)測(cè)試程序觸發(fā)缺陷的概率;時(shí)間模型用來預(yù)測(cè)測(cè)試程序的實(shí)際執(zhí)行時(shí)間。
存在特征指的是在測(cè)試程序中是否存在某種類型的語言元素。如果測(cè)試程序存在該語言元素,那么該特征值為1,否則為0。更加具體地說,c語言中的存在特征分為下列四類:
●stmt:一組c語言中的所有語句類型
●expr:一組c語言中的所有表達(dá)式類型
●var:一組c語言中的所有變量類型
●op:一組c語言中的所有操作類型
使用特征指的是測(cè)試程序中某種語言元素被如何使用。本發(fā)明具體實(shí)施中,我們利用了一個(gè)隨機(jī)測(cè)試程序生成工具csmith的特性,即當(dāng)使用csmith生成測(cè)試程序時(shí),它會(huì)記錄生成程序的一些使用特性。為了節(jié)約特征收集的時(shí)間,我們直接使用了由csmith收集的使用特性,具體如下:
●地址特征,如一個(gè)結(jié)構(gòu)體或者一個(gè)變量被訪問地址的次數(shù)
●結(jié)構(gòu)體位域特征:如全域結(jié)構(gòu)體的個(gè)數(shù)
●指針引用特征:如指針引用深度
●指針比較特征:如指針與null比較的次數(shù)
●別名集合特征:如別名集合大小
●跳躍特征:如前跳的次數(shù)
●使用變量的特征:如新創(chuàng)建的變量的比例
特征歸一化:本發(fā)明通過最大最小歸一化法將特征的值統(tǒng)一到[0,1]區(qū)間中。
構(gòu)建能力模型過程中,在對(duì)特征歸一化之前,需要選擇特征。選擇特征具體通過計(jì)算每個(gè)特征的信息增益比,過濾掉信息增益比為零(無效)的特征。信息增益比是對(duì)本質(zhì)信息的信息增益的比例,經(jīng)常被用作度量一個(gè)特征的貢獻(xiàn)。
構(gòu)建能力模型:本發(fā)明具體實(shí)施中,使用序列最小優(yōu)化算法(sequentialminimaloptimization,簡(jiǎn)稱smo)機(jī)器學(xué)習(xí)算法構(gòu)建能力模型。在訓(xùn)練模型中,使用puk核函數(shù),同時(shí)設(shè)置omega的值為1.0以及sigma的值為0.7。smo通過將一個(gè)大的二次方程優(yōu)化問題拆分成了一系列最小的二次方程優(yōu)化問題,從而加速了傳統(tǒng)的支持向量機(jī)算法。
構(gòu)建時(shí)間模型;記錄每一個(gè)測(cè)試程序的執(zhí)行時(shí)間,將每一個(gè)測(cè)試程序當(dāng)作一個(gè)實(shí)例,針對(duì)上述提取出的特征,將記錄的執(zhí)行時(shí)間作為標(biāo)記。與訓(xùn)練能力模型類似,首先對(duì)訓(xùn)練集每一維特征值進(jìn)行歸一化,然后使用高斯過程構(gòu)建回歸模型,即時(shí)間模型。在訓(xùn)練模型中,同樣使用puk核函數(shù),同時(shí)設(shè)置omega的值為3.3以及sigma的值為0.5。高斯過程使用懶惰學(xué)習(xí)方法以及核函數(shù)訓(xùn)練模型。
2)將測(cè)試集合中的1000個(gè)程序中的每個(gè)程序提取上述特征,并將該特征向量作為能力模型的輸入,預(yù)測(cè)每個(gè)測(cè)試程序觸發(fā)編譯器缺陷的概率。
3)將測(cè)試集合中的1000個(gè)程序中的每個(gè)程序提取上述特征,并將該特征向量作為時(shí)間模型的輸入,預(yù)測(cè)每個(gè)測(cè)試程序的實(shí)際執(zhí)行時(shí)間。
4)計(jì)算每個(gè)測(cè)試程序單位時(shí)間內(nèi)觸發(fā)缺陷的概率(即將預(yù)測(cè)得到的觸發(fā)缺陷的概率值除以預(yù)測(cè)得到的執(zhí)行時(shí)間),對(duì)測(cè)試集中的1000個(gè)測(cè)試程序按照該概率值由大到小的順序?qū)ζ溥M(jìn)行排序,得到測(cè)試程序新的執(zhí)行順序,由此加速編譯器測(cè)試。
表1let的加速效果與隨機(jī)排序和基于文本向量的排序方法的對(duì)比
表1是let的加速效果與隨機(jī)排序和基于文本向量的排序方法的對(duì)比,表1中,第一列和第九列代表let的應(yīng)用場(chǎng)景,比如open64-5.0->gcc-4.4.3表示在open64-5.0上訓(xùn)練模型,對(duì)gcc-4.4.3進(jìn)行測(cè)試;第二列和第十列代表缺陷數(shù)量;第三、六、十一、十四列代表隨機(jī)排序的結(jié)果,即檢測(cè)到相應(yīng)數(shù)量的缺陷所花費(fèi)的時(shí)間;第四、七、十二、十五列代表let與隨機(jī)排序的效果差,即檢測(cè)到相同數(shù)量的缺陷,let所節(jié)約的時(shí)間;第五、八、十三、十六列代表基于文本向量的排序方法與隨機(jī)排序的效果差,即檢測(cè)到相同數(shù)量的缺陷,基于文本向量的排序方法所節(jié)約的時(shí)間;此外,dol和emi是兩種最常用的編譯器測(cè)試技術(shù)。從表1可以看出,在各種應(yīng)用場(chǎng)景下,對(duì)于使用dol和emi這兩種編譯器測(cè)試技術(shù)來說,檢測(cè)各種數(shù)量的缺陷時(shí),let在大多數(shù)情況下都花費(fèi)最短的時(shí)間檢測(cè)這些缺陷,這意味著let確實(shí)在很大程度上加速了編譯器測(cè)試。
表2let對(duì)不同編譯器技術(shù)在不同測(cè)試場(chǎng)景下的統(tǒng)計(jì)結(jié)果
表2是let對(duì)不同編譯器技術(shù)在不同測(cè)試場(chǎng)景下的統(tǒng)計(jì)結(jié)果,表2中,dol和emi代表兩種不同的編譯器測(cè)試技術(shù);cross-compiler和cross-version代表著不同的let測(cè)試場(chǎng)景,前者代表訓(xùn)練集和測(cè)試集來自不同的編譯器,或者代表訓(xùn)練集和測(cè)試集來自同一個(gè)編譯器的不同版本;mean代表著let所達(dá)到的加速比的平均值,p-value代表著let的加速效果是否顯著,其中帶有加號(hào)代表顯著;從表2可以看出,無論對(duì)于哪一種編譯器測(cè)試技術(shù),在哪一種測(cè)試場(chǎng)景下,let都顯著地加速了編譯器測(cè)試,平均加速比在27.69%到50.81%的范圍內(nèi)。
需要注意的是,公布實(shí)施例的目的在于幫助進(jìn)一步理解本發(fā)明,但是本領(lǐng)域的技術(shù)人員可以理解:在不脫離本發(fā)明及所附權(quán)利要求的精神和范圍內(nèi),各種替換和修改都是可能的。因此,本發(fā)明不應(yīng)局限于實(shí)施例所公開的內(nèi)容,本發(fā)明要求保護(hù)的范圍以權(quán)利要求書界定的范圍為準(zhǔn)。