王 鑫,趙 偉,吳亞鋒
(1.解放軍32381 部隊,北京 100000;2.江蘇自動化研究所,江蘇 連云港 222061)
軍品軟件可靠性直接決定武器裝備產(chǎn)品的質(zhì)量,必經(jīng)多輪測試后方可交付列裝。代碼規(guī)則檢查在軟件產(chǎn)品研制與測試過程中均至關(guān)重要。針對C/C++語言的自動化代碼檢測工具在大規(guī)模代碼的多輪迭代及回歸中凸顯其高效性,但單一工具檢測結(jié)果存在誤檢或漏檢,且需人工復(fù)核以確保準(zhǔn)確性,本文提出一種多測試工具代碼規(guī)則檢查報告自動融合的方法,極大縮短了軟件迭代測試周期,提升了復(fù)查結(jié)果準(zhǔn)確率,降低迭代測試的時間、經(jīng)濟成本。
LDRATestbedForC/C++、Klocwork、可集成在Visual C++工具中的C++test 以及HelixQAC 工具是4款面向C/C++語言的靜態(tài)分析工具。除了檢查代碼的標(biāo)準(zhǔn)符合性,更以圖和報告形式實現(xiàn)代碼可視化測試,提高了代碼測試的可視性和清晰度,其中C++test 更支持代碼復(fù)審及在線回歸。4 款測試工具均支持代碼規(guī)則定制以及檢測結(jié)果文本形式瀏覽?;诠ぞ咂饎臃绞?、結(jié)果輸出形式、支持編碼語言以及規(guī)則可查看角度對工具進(jìn)行分析,如表1 所示。
表1 工具特性表
上述工具均無法檢測出全部違規(guī)代碼,測試結(jié)果之間互有補充又諸多重合,各工具分析代碼所依據(jù)的規(guī)則也并非完全一致。
比對測試結(jié)果與原始代碼可以發(fā)現(xiàn)工具自動生成的測試報告具有以下特征:
1)針對存在問題的同一行源碼,不同工具測試結(jié)果描述語言不同,具有獨特語言風(fēng)格;
2)不同測試工具檢測的同一問題代碼,其問題定位信息在不同結(jié)果中顯示不同。測試報告中的問題代碼行數(shù)與源碼存在差異(工程實踐經(jīng)驗該誤差通常不大于5);
3)選定參考標(biāo)準(zhǔn)為GB、GJB 后,測試報告中的問題描述與GB、GJB 建立對應(yīng)關(guān)系。測試工具生成的測試報告為英文描述,而GJB 與GB 均為漢字描述,在人工復(fù)核檢測結(jié)果工作中帶來不便。
綜合上述比對可知,多工具自動化生成的英文檢測報告與漢語描述的GB、GJB 之間仍未完全對應(yīng),面對規(guī)模龐大的代碼,人工分析其測試報告在GB、GJB 標(biāo)中的映射,其時間和人力成本都隨代碼規(guī)模的擴張,呈現(xiàn)幾何級數(shù)的增長。因此,將工具生成的報告與標(biāo)準(zhǔn)之間建立準(zhǔn)確的映射關(guān)系,成為提升“最后一步”工作效率的可行手段。
檢測結(jié)果與GB 之間的映射關(guān)系可以理解為對不同語言之間語義相近的語句分類,描述同一個問題的英文檢測結(jié)果與其在GB 中的漢字規(guī)則描述理論上存在相關(guān)性。在自然語言研究中,通常把一個詞匯描述為向量,一條語句描述為一個矩陣,語義相近的兩句話之間在語義空間上必然存在向量一致性。為解決上文提出的多工具檢測報告與規(guī)則集映射問題,基于語義的跨語言文本聚類方法體現(xiàn)了其優(yōu)勢。
國內(nèi)外諸多學(xué)者對自然語言文本聚類方法進(jìn)行了深入探討,本文采用基于VTM(Vector Term-frequency Model,向量詞頻模型)完成文本分類。該方法具有以下特點:
1)基于語料庫實現(xiàn)跨語言的文本聚類。多測試工具生成的檢測報告中全部問題描述語句和規(guī)則集構(gòu)成平行語料庫,從各自有限大的語料庫中提取文本分類所需要的信息。通過平行語料庫完成語句分類可以避免傳統(tǒng)模式的先翻譯,再將翻譯結(jié)果進(jìn)行分類帶來的大量計算,全部聚類過程處于語義和概念層面,更多結(jié)合自然語言的涵義。
2)借鑒Word2Vec模型完成“語句- 向量”轉(zhuǎn)換。Word2vec 模型最早由Mikolov 提出,由圖1 可知,由CBOW 模型和Skip-gram 模型構(gòu)成。
圖1 Word2Vec 模型數(shù)學(xué)表達(dá)示意圖
CBOW 模型由詞的前后m 個詞匯出現(xiàn)的概率決定詞A 出現(xiàn)的概率,其數(shù)學(xué)表達(dá)式如下:
類似地,Skip-gram 模型則是由上下文n 個詞匯預(yù)測詞A 出現(xiàn)的概率,其數(shù)學(xué)表達(dá)式如下:
Word2Vec 是自然語言研究中將詞語劃分為實數(shù)值向量表達(dá)的深度機器學(xué)習(xí)工具,在詞向量訓(xùn)練中涵蓋語料的上下文,從語義的層面解決了跨語言文本分類主題漂變和語言隔離問題。同時
Word2Vec 工具訓(xùn)練高效,300 M 語料詞向量的訓(xùn)練時間僅40 min 左右。
采用Word2Vec 模型,將一段文本S 描述為一組向量V(T),向量存在一個幾何中心,如同該文本存在一個核心詞。核心詞定義為Core(S),其歸一化向量表達(dá)形式如下:
如式(2)所示,歸一化向量表達(dá)式描述了文本S的幾何中心,也是該文本向量表示。
本文用TF-IDF(Term Frequency-Inverse Document frequency)方法確定式(2)中的詞向量權(quán)重。TF-IDF 是一種常用數(shù)據(jù)挖掘的加權(quán)技術(shù),TF(Term Frequency,詞頻)表示目標(biāo)詞在文本中出現(xiàn)的頻率,體現(xiàn)該詞在文本中的重要程度,IDF(Inverse Document Frequency,逆向文本頻率)用度量目標(biāo)詞的普遍性,反映了該詞在文本集中的識別度。TF-IDF 是TF 與IDF 的乘積。
假設(shè)一個預(yù)料庫D 中存在一段文本包含N 個的詞(其中k 個詞不重復(fù)),對于一個詞T而言,其重要性可表示如下:
文本中每個詞的權(quán)重向量可表示如下:
通過式(9)可以得知,在有限語料庫場景下,基于詞頻的文本權(quán)重向量表達(dá)式與TF 無關(guān),僅需要計算IDF 即可得出一段文本的權(quán)重向量表達(dá)式。
圖2 基于語義的檢測結(jié)果規(guī)則聚類流程圖
此時兩文本之間歐氏距離等價于余弦距離,在文本分類中以此為相似性測度。當(dāng)兩個文本相似性測度(歐氏距離)大于設(shè)定閾值時,判定為語義相近。至此完成跨語言的文本聚類。
首先,建立包含檢測結(jié)果與規(guī)則集的平行語料庫,語料庫內(nèi)容如圖3 所示,運行圖4 代碼,完成文本向量表達(dá)和文本向量距離計算。
圖3 平行語料庫截圖
圖4 文本向量相似性計算實現(xiàn)
表2 中第1 列選取了5 條檢測結(jié)果,每一行對應(yīng)計算該檢測結(jié)果與規(guī)則集之間的相似性測度計算值,對于成功匹配的兩條文本相似性計算結(jié)果加粗標(biāo)明??梢?,兩條文本語義上接近的相似性測度值更大,與無關(guān)文本相似性測度存在明顯的分離性,可以通過合理的相似性測度閾值加以區(qū)分。
表2 檢測結(jié)果與規(guī)則集相似性計算
上述方法僅實現(xiàn)檢測報告與規(guī)則集之間映射關(guān)系,檢測結(jié)果之間仍存在重合與互補。檢測結(jié)果自身攜帶問題代碼路徑Path 以及所在函數(shù)中行數(shù)Line 可區(qū)分問題代碼。類似的,規(guī)則集的常見形式是:“編號ID+規(guī)則描述”,編號即一個規(guī)則在其集合中的唯一識別。規(guī)則描述與檢測結(jié)果完成映射,意味著“Path+Line”與“規(guī)則ID”之間建立映射。根據(jù)測試工作實踐,問題與規(guī)則之間的關(guān)系如下頁圖5所示。
圖5 問題代碼路徑與規(guī)則標(biāo)識關(guān)系圖
對于近似行代碼對應(yīng)單規(guī)則ID 情況判定為重復(fù)檢測,任選其一作為最終結(jié)果;單行代碼對應(yīng)多個規(guī)則ID 情況判定為結(jié)果互補,保留不重復(fù)ID規(guī)則。至此完成多工具檢測結(jié)果與規(guī)則集合的融合匹配。
本文結(jié)合靜態(tài)測試實踐,整理代碼規(guī)則檢查工具,針對C/C++語言檢查結(jié)果。以檢測結(jié)果及規(guī)則集作為有限集語料庫,以文本加權(quán)詞頻向量之間的相似程度為判別條件進(jìn)行相似性判斷,并對聚類文本進(jìn)行去重及融合,達(dá)到檢測結(jié)果互相補充、彼此完善的目的。實現(xiàn)了多工具檢測結(jié)果與規(guī)則集智能匹配,提高了代碼級規(guī)則檢測效率。本文介紹了文本詞頻向量表達(dá)聚類算法在多工具檢測結(jié)果與規(guī)則集之間的匹配方法,仍存在優(yōu)化空間。文中相似性測度算法值得在未來研究中完善優(yōu)化,同時面向更多種類語言的代碼規(guī)則檢測結(jié)果融合也具有較高的研究價值。