国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

結合多元度量指標軟件缺陷預測研究進展

2021-03-09 16:40:58楊豐玉黃雅璇周世健
計算機工程與應用 2021年5期
關鍵詞:源代碼度量語義

楊豐玉,黃雅璇,周世健,鄭 巍

1.南昌航空大學 軟件學院,南昌330063

2.南昌航空大學 軟件測評中心,南昌330063

軟件缺陷是指軟件產(chǎn)品的結果不符合軟件要求或最終用戶期望。它通常會以非預期的方式產(chǎn)生不正確或意外的結果和行為。軟件日益增加的復雜性和依賴性增加了軟件高質(zhì)量、低成本和可維護的難度,以及創(chuàng)建軟件缺陷的可能性。軟件缺陷預測[1]是在測試之前識別出易出錯的樣本,達到提高軟件質(zhì)量的目的,它能自動檢測出最可能出現(xiàn)錯誤的代碼區(qū)域中的潛在缺陷,有效地優(yōu)化有限資源的分配以進行測試和維護。

缺陷預測在軟件質(zhì)量保證中起著重要作用,是近年軟件測試領域的研究重點之一。軟件缺陷預測包括兩個階段[2]:從源文件中提取度量指標,使用各種機器學習算法構建缺陷預測模型。首先從軟件歷史倉庫中創(chuàng)建數(shù)據(jù)樣本,根據(jù)樣本是否包含缺陷,可以將其標記為有缺陷或無缺陷。然后,用機器學習算法構建缺陷預測模型。最后,預測測試樣本是否有缺陷。利用預測模型,開發(fā)人員可以有效地在缺陷樣本上分配可用的測試資源,以便在開發(fā)生命周期的早期階段提高軟件質(zhì)量。如圖1所示。

圖1 軟件缺陷預測過程

其中,軟件歷史倉庫包含版本控制系統(tǒng)和缺陷跟蹤系統(tǒng),版本控制系統(tǒng)包含源代碼和文件變更信息,缺陷跟蹤系統(tǒng)包含缺陷信息。軟件歷史倉庫中每個樣本的粒度包含方法、類、文件、變更和包級別等,根據(jù)預測粒度,每個樣本可以表示為一個方法、一個類、一個源代碼文件、一個程序包或一個代碼更改。一個樣本通常包含許多缺陷預測度量指標,度量指標表示軟件及其開發(fā)過程的復雜性。

由于度量指標的質(zhì)量會直接影響缺陷預測的效率和準確性,現(xiàn)如今提取度量指標的方法主要分為兩個方面:一方面手動設計新的判別度量指標或組合度量指標,另一方面使用深度學習挖掘源代碼中復雜的非線性特征,這些特征可以很好地表達源代碼的語義和結構。

目前已有一些研究人員從不同方面對缺陷預測的相關研究工作進行梳理和歸納[3-7],李勇等人[4]從數(shù)據(jù)驅(qū)動的角度對基于版本內(nèi)數(shù)據(jù)、跨版本數(shù)據(jù)和跨項目數(shù)據(jù)實現(xiàn)缺陷預測進行分類歸納,陳翔等人[3,5]對靜態(tài)軟件缺陷預測方法和跨項目軟件缺陷預測進行歸納和分析,蔡亮等人[6]從數(shù)據(jù)標注、特征提取、模型構建和模型評估等人方面對即時軟件缺陷預測進行梳理歸納,宮麗娜等人[7]從數(shù)據(jù)集、構建方法、評價指標等多個角度對軟件缺陷預測進行全面總結。

與此不同的是,本文側(cè)重度量指標的選擇,對多元度量指標缺陷預測已有研究進行歸納總結,并總結了當前存在的主要問題和未來發(fā)展方向。主要通過IEEE Xplore Digital Library、ACM Digital Library、Springer Link online Library、Elsevier ScienceDirect及CNKI等在線數(shù)據(jù)庫進行檢索,檢索關鍵詞主要包括software defect prediction和software fault prediction等,最終選出與該研究問題直接相關的論文共73篇(截止到2020年10月)。

1 基于傳統(tǒng)度量指標的缺陷預測

1.1 傳統(tǒng)度量指標

軟件度量指標是影響缺陷預測質(zhì)量的核心因素,若設計與缺陷強相關性的度量指標將很大幅度地提高缺陷預測的準確度。源代碼是一種特殊的形式語言,包含豐富的語義和結構信息,根據(jù)源代碼信息和軟件開發(fā)過程中的復雜性,現(xiàn)有的度量指標分為代碼度量和過程度量[8]。代碼度量是直接收集現(xiàn)有源代碼,主要度量源代碼的代碼規(guī)模和復雜性等屬性,具有越高復雜度的軟件模塊更容易出現(xiàn)缺陷。從存儲在版本控制系統(tǒng)和缺陷跟蹤系統(tǒng)的歷史信息中提取的信息稱為過程度量,這些度量量化了隨著時間變化的軟件開發(fā)過程,如源代碼變更、代碼更改的數(shù)量、開發(fā)人員信息等。表1列出了常見的用于軟件缺陷預測的代碼度量和過程度量。

表1 常見的傳統(tǒng)度量指標

1.1.1 傳統(tǒng)代碼度量

常用的傳統(tǒng)度量指標有代碼行(LOC)[9],基于運算符和操作數(shù)的Halstead度量[10],基于依賴性的McCabe度量[11],面向?qū)ο蟪绦虻腃K度量[12],基于多態(tài)性因子、耦合因子的MOOD度量[13]和代碼氣味度量[14]。除此之外,Aman等人[15]證明了注釋行也能作為分析模塊缺陷的度量指標。Majd等人[16]引入了32種新的語句級別的代碼度量指標,該預測模型可以預測某條語句可能存在多少缺陷。

但是,并非所有的傳統(tǒng)代碼度量都對缺陷預測有利,冗余和無關度量會增加模型構建時間,甚至降低模型性能,如何選擇合適的指標是問題的關鍵。研究人員已嘗試用特征選擇來解決該問題,特征選擇旨在選擇特征子集來替換原始特征集[17],此特征子集能更有效地區(qū)分軟件模塊的類別標簽。由于存在多種特征選擇方法,比較不同特征選擇方法的有效性變得至關重要。Chen等人[18]基于搜索的軟件工程的思想,將特征選擇形式化為一個多目標問題并進行多目標優(yōu)化。他們考慮了兩個目標,一個是盡可能少地選擇特征,另一個是盡可能提高缺陷預測模型的性能。Xu等人[19]對32種不同的特征選擇方法進行了大規(guī)模的實驗,最后確定出一組優(yōu)秀的特征選擇方法。隨后,他們提出了一種稱為KPWE的缺陷預測框架[20],該框架結合了基于核函數(shù)的主成分分析(Kernel Principal Component Analysis,KPCA)和加權極限學習機算法(Weighted Extreme Learning Machine,WELM)。首先,KPWE利用KPCA技術的非線性映射將原始數(shù)據(jù)投影到潛在特征空間,在空間中映射的特征可以很好地表示原始特征。其次,通過映射特性,KPWE應用WELM來構建一個高效且有效的缺陷預測模型,該模型可以處理不平衡的缺陷數(shù)據(jù)。

1.1.2傳統(tǒng)過程度量

近年來,研究者提出了許多代表性過程度量,如相對代碼更改攪動指標[21]、開發(fā)者網(wǎng)絡和社交網(wǎng)絡指標[22]、依賴圖指標[23]和組織結構指標[24]等。其中,研究工作集中在如何利用軟件模塊之間的依賴關系,構建網(wǎng)絡度量指標[22-23,25-26]。

一個軟件系統(tǒng)包括許多實體和元素,例如類、函數(shù)和變量。因此,如果將軟件系統(tǒng)的元素視為節(jié)點,將關系視為網(wǎng)絡系統(tǒng)的邊緣,就可以將其轉(zhuǎn)換為網(wǎng)絡系統(tǒng)。許多軟件網(wǎng)絡的拓撲特征與缺陷密切相關,可以用作軟件缺陷預測的指標。例如,Zimmermann等人[23]基于Windows Server 2003生成了模塊依賴關系圖并對該圖進行了網(wǎng)絡分析。該研究定義了局部、全局和中心網(wǎng)絡指標,并表明依賴圖上的網(wǎng)絡度量指標可用于預測缺陷數(shù)量。實驗表明,網(wǎng)絡度量指標在預測關鍵二進制文件和缺陷方面比復雜性指標更好。隨后,Premraj等人[27]復制了Zimmermann等人[23]的實驗,揭示在代價感知和CPDP方面,網(wǎng)絡度量指標并不優(yōu)于代碼度量。因此,Ma等人[28]對11個具有不同規(guī)模、編程語言和應用程序域的開源項目的多個版本進行研究,與Premraj等人[27]不同的是,他們發(fā)現(xiàn)大多數(shù)網(wǎng)絡度量指標都與缺陷傾向顯著正相關,并且網(wǎng)絡度量指標對于大型和復雜項目更為有效,而在小型項目中則不穩(wěn)定。

Yang等人[29]基于軟件元素之間的關系及其演化關系建立了一個面向?qū)ο蟮能浖W(wǎng)絡,并建立了許多度量指標來宏觀地描述軟件模塊。此外,一些研究人員認為可以將開發(fā)人員活動交互視為軟件網(wǎng)絡,組成網(wǎng)絡度量。Meneely等人[22]使用一套新的基于開發(fā)人員社交網(wǎng)絡的開發(fā)人員指標,如果兩個開發(fā)人員在同一時間段內(nèi)處理相同的文件,則將其連接在一起。結果發(fā)現(xiàn)基于文件的開發(fā)人員指標與軟件缺陷之間的顯著相關性。

代碼度量和過程度量都能建立缺陷預測模型,但是,代碼度量和過程度量誰更優(yōu)存在不同爭論。Arisholm等人[30]分析了不同度量指標對模型預測性能的影響,結果表明若選擇不同的性能評價指標,結果將相反。Moser等人[31]發(fā)現(xiàn)若使用Eclipse數(shù)據(jù)集,過程度量的效果比代碼度量更好。Rahman等人[32]從多個角度分析了代碼度量和過程度量的適用性和有效性,結果表明代碼度量有很高的滯后性,不如過程指標有用。

1.2 缺陷預測模型構建

根據(jù)數(shù)據(jù)來源不同,軟件缺陷預測可分為同項目缺陷預測(Within Project Defect Prediction,WPDP)和跨項目缺陷預測(Cross-Project Defect Prediction,CPDP)。WPDP指在帶標簽的樣本上訓練模型,并對同一項目中其余未標記的樣本執(zhí)行預測。CPDP是指從其他項目中遷移出與目標項目相關的知識進行訓練。目前最流行、應用最廣泛的缺陷預測建模方法是機器學習方法[33],將基于傳統(tǒng)度量指標的缺陷預測文獻大致分為以下四類:有監(jiān)督學習缺陷預測、半監(jiān)督學習缺陷預測、無監(jiān)督學習缺陷預測和跨項目缺陷預測。

1.2.1 有監(jiān)督學習缺陷預測

有監(jiān)督學習方法是指在項目中使用帶有標簽的缺陷數(shù)據(jù)來訓練分類或回歸模型,然后用該模型確定新軟件模塊的缺陷信息。如人工神經(jīng)網(wǎng)絡[34-35]、貝葉斯網(wǎng)絡[36]、支持向量機[37]、字典學習[38]、關聯(lián)規(guī)則[39]、樸素貝葉斯[40]、隨機森林[41]、遺傳算法[42]和集成學習[43]。

Xu等人[44]提出一個基于深度神經(jīng)網(wǎng)絡(Deep Neural Networks,DNN)的學習深度特征表示框架,并向DNN引入了一種混合損失函數(shù)以學習更多具有區(qū)分度的特征,結果表明,在同項目缺陷預測可以獲得更好的性能。Yang等人[45]提出結合決策樹和集成學習的雙層集成學習方法來構建即時缺陷預測模型。該方法在內(nèi)層使用基于決策樹的裝袋集成學習方法來構建隨機森林模型,在外層使用隨機抽樣的方法來訓練不同的隨機森林模型,然后按照堆疊方式來集成這些不同的隨機森林模型。Qiu等人[46]利用DNN從傳統(tǒng)特征中自動學習高維特征表示,然后用決策森林進行分類,主要解決了以端到端方法結合神經(jīng)網(wǎng)絡和決策森林的問題。

1.2.2 半監(jiān)督學習缺陷預測

半監(jiān)督學習方法是通過在項目中僅使用少量標簽的訓練數(shù)據(jù)和大量沒有標簽的數(shù)據(jù)來構建缺陷預測模型。He等人[47]提出了半監(jiān)督學習方法extRF,該方法通過自我訓練模式擴展了有監(jiān)督的隨機森林算法。首先從數(shù)據(jù)集中抽取小部分數(shù)據(jù)作為有標簽的數(shù)據(jù)集,使用這小部分數(shù)據(jù)集訓練隨機森林分類器,根據(jù)訓練好的分類器去預測未標記的數(shù)據(jù)集,然后選擇最好的樣本加入到訓練集中,并進行訓練初始模型,以此類推,最后形成精煉模型。Zhang等人[48]提出了一種基于非負稀疏圖的標簽傳播方法進行缺陷預測。首先對標記的無缺陷實例重新采樣以生成平衡的訓練數(shù)據(jù)集,并使用非負稀疏圖算法計算關系圖的權重以更好地學習數(shù)據(jù)關系。最后,在非負稀疏圖中,使用標簽傳播算法來迭代預測未標記的軟件模塊。Arshad等人[49]提出了一種基于半監(jiān)督的深度模糊C均值聚類的特征提取方法,該方法通過利用未標記和標記數(shù)據(jù)集的深度多聚類來生成新特征。Wu等人[50]介紹了半監(jiān)督詞典學習技術并提出了一種成本敏感的內(nèi)核化半監(jiān)督詞典學習(Cost-sensitive Kernelized Semisupervised Dictionary Learning,CKSDL)方法,CKSDL可以充分利用內(nèi)核空間中有限的標記缺陷數(shù)據(jù)和大量未標記數(shù)據(jù),在16個項目上進行大量實驗,結果表明,該方法在WPDP和CPDP上都具有較好的預測性能。

1.2.3 無監(jiān)督學習缺陷預測

無監(jiān)督學習方法不需要有標簽的訓練數(shù)據(jù),它們直接利用項目中的未標記數(shù)據(jù)來學習缺陷預測模型。對新項目或沒有足夠歷史數(shù)據(jù)的項目進行缺陷預測是一個具有挑戰(zhàn)性的問題,為了解決這個問題,Nam和Kim[51]提出CLA和CLAMI方法,CLA方法對樣本進行聚集和標記,CLAMI方法在CLA基礎上還進行了度量選擇和樣本選擇,其關鍵思想是通過度量值大小來標記沒有標簽的數(shù)據(jù)集。隨后,Yan等人[52]擴展了CLAMI樣本聚集部分,在14個開源項目上評估了這種無監(jiān)督方法,結果表明,無監(jiān)督方法可以產(chǎn)生比有監(jiān)督方法更好的效果。由于頻譜聚類是基于連通性的無監(jiān)督聚類方法,不需要訓練數(shù)據(jù),Zhang等人[53]利用頻譜聚類解決CPDP中源項目和目標項目之間的異質(zhì)性,發(fā)現(xiàn)使用頻譜聚類的無監(jiān)督學習方法在CPDP和WPDP場景下都有可比較性。

1.2.4 跨項目缺陷預測

在實際情況下,目標項目可能沒有任何標記樣本的新項目,或者這個項目的標記樣本較少,不足以訓練高質(zhì)量的缺陷預測模型。如果直接使用從其他項目(即源項目)收集的帶標簽數(shù)據(jù)并且不執(zhí)行任何數(shù)據(jù)預處理,訓練后的模型的性能可能不佳,因為在大多數(shù)情況下,不同項目之間的數(shù)據(jù)分布無法滿足。因此,研究人員設計了不同的方法[54]來緩解跨項目情況下的數(shù)據(jù)分布差異。

Pan等人[55]提出一種遷移成分分析(Transfer Component Analysis,TCA)方法,通過最小化數(shù)據(jù)分布之間的距離的同時保留住原始數(shù)據(jù)屬性,為源項目和目標項目的數(shù)據(jù)發(fā)現(xiàn)新的特征表示,并根據(jù)新的特征表示對數(shù)據(jù)進行轉(zhuǎn)換。結果顯示,TCA可以減小數(shù)據(jù)分布差異。然后,Nam等人[56]提出了TCA+,將源項目和目標項目映射到共享的潛在空間中,使它們之間的數(shù)據(jù)分布距離很近,以提升跨項目缺陷預測的性能。

常規(guī)的CPDP始終假定源項目和目標項目使用相同的度量標準集。研究人員考慮到通用指標的數(shù)量可能很小,或者在通用指標中沒有高質(zhì)量的指標,在目標項目中尋找源項目的相同指標有一定難度等問題,他們提出異構缺陷預測(Heterogeneous Defect Prediction,HDP)方法。He等人[57]提出一種特征集不平衡的CPDP(Cross-Project Defect Prediction Imbalanced Feature Sets,CPDP-IFS)方法,該方法提出了16個基于分布特征的新指標。隨后,Nam等人[58]提出一種HDP方法,通過計算不同項目中源度量指標和目標度量指標的匹配分數(shù),刪除冗余無關的特征,找到相似性高的匹配度量指標。實驗結果表明,使用該方法,即使項目使用不同的度量集,也有可能快速地遷移關于缺陷預測的信息??梢宰钚』错椖亢湍繕隧椖恐g的數(shù)據(jù)分布差異。

Li等人[59]提出集成多核相關對齊(Ensemble Multiple Kernel Correlation Alignment,EMKCA)方法,通過多次內(nèi)核學習將源項目和目標項目數(shù)據(jù)映射到高維內(nèi)核空間中,并利用內(nèi)核相關性對齊方法減少源項目和目標項目的數(shù)據(jù)分布,最后集成了多個內(nèi)核分類器用來解決類不平衡問題。實驗結果顯示,該方法能更好地分離高維內(nèi)核空間中的有缺陷和無缺陷的模塊。隨后,他們提出一種代價敏感遷移核規(guī)范相關分析(Cost-sensitive Transfer Kernel Canonical Correlation Analysis,CTKCCA)方法[60],設計用于HDP的遷移核規(guī)范相關分析方法解決線性不可分問題,利用代價敏感緩解類不平衡問題。實驗表明,CTKCCA可以使非線性特征空間中的源項目和目標項目的數(shù)據(jù)分布更加相似,且學習的特征具有良好的分離性。之后,他們擴展了先前的研究[59],提出兩階段集成學習方法[61],該方法包含集成多內(nèi)核域自適應(Ensemble Multi-kernel Domain Adaptation,EMDA)階段和集成數(shù)據(jù)采樣(Ensemble Data Sampling,EDS)階段。EMDA階段使用EMKCA預測器,EDS階段采用帶有替換技術的重采樣學習多個EMKCA預測器,并使用平均集成將它們組合在一起。

1.3 數(shù)據(jù)質(zhì)量

軟件缺陷預測的數(shù)據(jù)可以來源于開源項目和商業(yè)項目,現(xiàn)有的常用公開數(shù)據(jù)集包括PROMISE、NASA[62]、AEEEM[63]、SOFTLAB[64]和ReLink[65]等。有少量文獻和企業(yè)合作使用了商業(yè)項目[66]。

數(shù)據(jù)質(zhì)量對缺陷預測性能有著巨大的影響,數(shù)據(jù)集中常包含一些降低預測模型性能的問題,如關鍵特征選擇和類不平衡等。

1.3.1 數(shù)據(jù)集

表2 匯總了研究文獻所用的數(shù)據(jù)集,以下對常用的數(shù)據(jù)集進行簡短介紹。

表2 數(shù)據(jù)集

PROMISE:自2005年以來收集了一些開源項目和一些研究人員自發(fā)提供的項目的缺陷信息構成PROMISE Repository。至今,該數(shù)據(jù)集包含38個開源項目,其中類級軟件度量指標有20個。

NASA:NASA MDP數(shù)據(jù)集包含13個NASA軟件項目的方法級軟件度量指標。在這13個數(shù)據(jù)集中,一個用Java(KC3)編寫,其余使用C/C++。這些數(shù)據(jù)集中的缺陷率范圍從0.5%(PC2)到32.3%(MC2)。此外,這些數(shù)據(jù)集中的度量指標并不完全相同,其中一些包含其他指標。在該組數(shù)據(jù)集中,CM1、KC3、MC2、MW1、PC1、PC2、PC3和PC4有40個度量指標,MC1和PC5包含39個度量指標,JM1、KC1、KC2有21個度量指標。

AEEEM:AEEEM數(shù)據(jù)集包含五個開源項目(Eclipse JDT Core、Eclipse PDE UI、Equinox Framework、Mylyn、Apache Lucence)。每個數(shù)據(jù)集包含61個軟件度量指標,包括面向?qū)ο笾笜撕妥兏攘恐笜恕?/p>

SOFTLAB:SOFTLAB由嵌入式控制器AR1、AR2、AR3、AR4、AR5和AR6項目組成,這些項目從PROMISE中獲得。每個數(shù)據(jù)集包含29個度量指標,其中包括Halstead和McCabe度量指標。

ReLink:ReLink中包含三個數(shù)據(jù)集Apache HTTP Server、OpenIntents Safe和ZXing。這些數(shù)據(jù)集包含26個軟件度量指標,并且手動驗證了缺陷標簽。

ELEF:ELEF數(shù)據(jù)集[67]一共有23個Java開源項目,包含了類級和方法級度量指標,其中類級度量指標有39個,方法級度量指標有26個。

NetGen:NetGen是Herzig等人[68]收集的變更級數(shù)據(jù)集,此數(shù)據(jù)集由四個開源項目組成,總共有456個度量指標,包括與文件歷史相關的復雜性度量指標、網(wǎng)絡度量指標和變更度量指標。

1.3.2 關鍵特征選擇

維數(shù)爆炸是影響缺陷預測模型性能的問題之一,特征選擇方法能夠從高維特征中選取具有代表性的特征子集,避免不相關或冗余特征帶來的分類干擾。為了解決這個問題,Jia[69]提出了一種結合了不同特征分類技術的混合特征選擇方法,該方法根據(jù)卡方、信息增益、Pearson相關系數(shù)對特征進行排序并使用隨機森林構建預測模型。Balogun等人[70]提出特征選擇的影響取決于搜索方法的選擇,使用四種不同的分類器對NASA的五個數(shù)據(jù)集進行了四種篩選特征排序和十四種篩選特征子集選擇方法的評估。實驗表明,基于特征排序的缺陷預測在預測性能方面更加穩(wěn)定。

Liu等人[71]提出一種基于特征聚類和特征排名的新特征選擇框架(Feature Clustering and Feature Ranking,F(xiàn)ECAR),根據(jù)特征間的相關性將原始特征劃分為k個聚類,使內(nèi)部聚類特征高度相關。然后,從每個聚類中選擇相關特征并按照相關性排序構建最終特征子集,實驗表明,該方法有效地處理了冗余和不相關的特征。Xu等人[72]提出層次聚類的最大信息系數(shù)特征系數(shù)框架(Maximal Information Coefficient with Hierarchical Agglomerative Clustering,MICHAC),MICHAC利用最大信息系數(shù)對候選特征進行排序,過濾不相關的特征;然后,采用分層聚類的方法對特征進行分組,并從每一組特征中選取一個特征來去除冗余特征。

1.3.3 類不平衡

類不平衡問題是指至少一個類別比其他類別多。在軟件缺陷數(shù)據(jù)集中,缺陷模塊要少于非缺陷模塊,因此不平衡缺陷數(shù)據(jù)集上訓練的模型通常偏向于非缺陷類模塊,而忽略了缺陷類模塊。類不平衡問題是軟件缺陷預測模型性能差的主要原因之一。隨機欠采樣和過采樣技術已被廣泛使用[73-74],但是它們的準確性取決于現(xiàn)有數(shù)據(jù)和分類算法,為了普遍緩解類不平衡問題帶來的影響,Bennin等人[75]提出了一種基于染色體遺傳理論的新型高效合成過采樣方法(MAHAKIL),MAHAKIL將兩個不同的子類解釋為父類,并生成一個新實例,該實例從每個父類繼承不同特征并有助于數(shù)據(jù)分布內(nèi)的多樣性。為了同時解決類不平衡問題和支持向量機(Support Vector Machines,SVM)的參數(shù)選擇問題,Cai等人[76]提出了一種基于支持向量機的混合多目標布谷鳥搜索欠采樣軟件缺陷預測模型,利用混合多目標布谷鳥搜索與動態(tài)局部搜索來同步選擇無缺陷采樣并優(yōu)化SVM的參數(shù)。然后,該模型提出了三種欠采樣方法來選擇無缺陷的模塊。結果顯示,提出的方法對解決類不平衡問題生效。Huda等人[77]集成了隨機欠采樣和過采樣方法解決類不平衡問題,并在PROMISE數(shù)據(jù)集上驗證了所提出的方法的有效性。

表3 列出了基于傳統(tǒng)度量指標的研究文獻使用的度量指標和數(shù)據(jù)集。

2 基于語義結構度量指標的缺陷預測

過去的幾十年已經(jīng)提出了多種研究人員手工設計的傳統(tǒng)度量指標來區(qū)分有缺陷和無缺陷文件[78-79]。隨著研究的逐漸深入,研究人員發(fā)現(xiàn)傳統(tǒng)度量指標主要關注代碼復雜性,通常無法區(qū)分具有不同語義的程序,不能完全捕獲源代碼中的復雜語義信息和度量指標之間的潛在關聯(lián)[80-81]。

近些年,深度學習方法已成功解決許多自然語言處理問題,包括解析、機器翻譯、情感分析和自動問答等。有學者[73]將深度學習引申到軟件缺陷預測中,開始嘗試利用深度學習自動捕獲程序的語義表示和度量指標之間的潛在關聯(lián)(即語法結構),得到源代碼語義度量指標和結構度量指標。從數(shù)據(jù)挖掘角度來看,軟件度量指標可視為特征,傳統(tǒng)度量指標可稱為傳統(tǒng)特征,語義度量指標可稱為語義特征,結構度量指標可稱為結構特征。

2.1 語義度量指標

傳統(tǒng)代碼度量主要關注程序的統(tǒng)計特征,并假定有缺陷的軟件模塊和無缺陷的模塊具有可區(qū)分的統(tǒng)計特征和面向?qū)ο筇卣?。但是,研究者[80]通過對實際開發(fā)的軟件模塊觀察發(fā)現(xiàn),現(xiàn)有的傳統(tǒng)代碼度量指標無法區(qū)分不同語義的模塊,即具有不同語義軟件模塊可能具有相似或相同的傳統(tǒng)代碼度量指標。例如,在圖2中,有兩個Java文件,兩個文件都包含一個for語句和兩個函數(shù)調(diào)用。使用傳統(tǒng)度量來表示這兩個代碼段時,它們的特征向量是相同的,但是,語義信息明顯不同。如果隊列為空,調(diào)用remove()時,F(xiàn)ile2.java將遇到異常,需要建立更準確的預測模型來區(qū)分此類語義差異的模塊。為了捕獲源代碼中的復雜語義信息和語法結構,Wang等人[80]首次提出利用深度學習從源代碼中提取語義特征。

表3 研究文獻中度量指標和數(shù)據(jù)集(一)

圖2 例子

2.1.1 從抽象語法樹捕獲語義度量

目前,現(xiàn)有常用的提取方法是將源代碼轉(zhuǎn)化為抽象語法樹(Abstract Syntax Tree,AST)。AST是代碼在計算機內(nèi)存的一種樹狀數(shù)據(jù)結構,用于描述代碼上下文關系。AST可以有效地存儲語義信息和語法結構[82],有助于準確地分析和定位缺陷。利用深度學習來挖掘AST的隱藏特征可以生成更能體現(xiàn)代碼上下文信息的度量指標,從而更準確地預測軟件缺陷。

Wang等人[80]先將源代碼解析為AST,然后利用深度置信網(wǎng)絡(Deep Belief Network,DBN)從AST節(jié)點中提取token向量并生成語義特征。隨后,他們從源代碼變更中提取語義特征,對變更級的軟件缺陷預測進行了擴展[83]。Li等人[81]將傳統(tǒng)特征與卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks,CNN)學習的語義特征相結合,以構建一個混合預測模型。為了更好地利用AST的樹結構并在源代碼中反映語法和語義的多個層次,在記錄AST的聲明節(jié)點時,沒有記錄節(jié)點名稱,而是提取節(jié)點的值來構建token向量。隨后,邱少健等人[84]采用三層卷積神經(jīng)網(wǎng)絡提取源代碼潛在語義特征,并用代價敏感對數(shù)據(jù)進行處理解決了類不平衡問題。Pan等人[85]在此基礎上進行了改進,將CNN模型的全連接層增加為四個,還添加了三個dropout層防止模型過擬合。結果表明,改進的CNN模型在WPDP方面明顯優(yōu)于最新的機器學習模型。為了從程序中捕獲語義信息,Liang等人[86]構建了一種基于長短期記憶網(wǎng)絡(Long Short Term Memory networks,LSTM)的缺陷預測框架,該框架采用了連續(xù)詞袋(Continuous Bag-Of-Words Model,CBOW)來學習程序AST的向量表示,其拋棄了傳統(tǒng)的機器學習模型,而是采用LSTM來構建缺陷預測模型。

程序中的上下文語義至關重要,但CNN無法捕獲長距離特征,F(xiàn)an等人[87]開始采用具有注意力機制的遞歸神經(jīng)網(wǎng)絡(Recurrent Neural Network,RNN)來區(qū)分關鍵語法結構和語義特征。先從AST中提取的token向量中自動學習語義特征,再用注意力機制進一步捕獲重要特征并賦予更高的權重,使訓練更準確。結果表明,缺陷預測模型性能得到了提升。與Liang等人[86]不同的是,Deng等人[88]并沒有選擇LSTM構建缺陷預測模型,而是利用雙向長短期記憶網(wǎng)絡的長距離依賴特性更好地學習上下文語義特征。因為Transformer突出的并行計算能力,Zhang等人[89]嘗試使用Transformer捕獲向量中特定位置的關鍵特征。

上述從AST節(jié)點中提取token向量過程中,通常選擇遍歷AST來進行序列化,但這種方式會損失一定的語義信息。一些研究人員嘗試通過其他方法將AST序列化,從而捕獲更全面的語義特征。例如,F(xiàn)an等人[90]基于四個開源Android應用程序,從AST中提取高頻關鍵字獲得基于規(guī)則的編程模式,使用DBN從編程模式中學習源代碼的內(nèi)部信息。實驗結果表明,該方法學習到的特征能比傳統(tǒng)特征預測更多缺陷。Dam等人[91]認為遍歷AST沒有完全編碼代碼的語義和語法結構,提出了一個基于樹的長短期記憶網(wǎng)絡(TB-LSTM)模型來獲取整個AST的向量表示。為了避免AST序列化的損失,該模型直接使用樹形LSTM匹配AST表示,將每個AST節(jié)點都輸入LSTM單元,在Samsung項目和公共PROMISE數(shù)據(jù)集上的實驗結果證實了其有效性。Shi等人[92]認為接近的源代碼之間存在很強的語義相關性,提出短路徑的概念來描述每個終端節(jié)點及其控制邏輯,并使用成對的短路徑描述代碼的語義信息,并通過注意力機制將它們?nèi)诤显谝黄?,在PROMISE數(shù)據(jù)集上進行實驗表明,該方法比TB-LSTM具有更好的性能。Rahman等人[93]通過分析AST得到代碼配置文件,使用代碼配置文件作為語義特征代替?zhèn)鹘y(tǒng)度量指標來改進缺陷預測。在Eclipse數(shù)據(jù)集和Github缺陷數(shù)據(jù)庫進行實驗,結果表明,在版本內(nèi)缺陷預測中該方法比傳統(tǒng)度量指標更好,而在跨版本缺陷預測中表現(xiàn)不佳。

考慮到細粒度級別的預測可能更能準確定位預測的缺陷,Shippey等人[94]使用AST n-gram來識別有缺陷的Java代碼特征。將模塊中每個Java方法進行AST序列化,再將方法序列按照字節(jié)進行大小為N的滑動窗口操作,形成長度為N的字節(jié)片段序列,這個字節(jié)片段序列稱為AST n-gram。結果表明,AST n-gram在某些系統(tǒng)中與缺陷非常相關,對預測模型影響很大,某些頻繁出現(xiàn)的AST n-gram意味著該方法包含缺陷的可能性比其他方法提高了三倍。曹靖[95]試圖考慮更細粒度的預測,他將代碼缺陷定位在代碼行,從AST中提取指定類的實例的API調(diào)用序列,預測API序列中的API誤用缺陷。

2.1.2 其他方式捕獲語義度量

一些研究者認為,AST序列化不能完全表達源代碼語義,開始嘗試通過其他方式從源代碼中捕獲語義特征。Phan等人[96]認為AST僅表示源代碼的抽象語法結構,不顯示程序的執(zhí)行過程,該方法通過編譯源代碼獲取匯編指令構造控制流程圖(Control Flow Graph,CFG),然后利用基于多視圖多層有向圖的卷積神經(jīng)網(wǎng)絡在CFG上學習語義特征,結果表明與基于AST的語義特征相比,基于CFG的語義特征性能更好。Zhang等人[97]將交叉熵作為一種新的代碼度量引入缺陷預測中,該方法利用LSTM挖掘代碼語料庫,捕獲程序中常見模式和規(guī)律,然后將模型輸入到token序列的聯(lián)合概率分布中得到軟件模塊的交叉熵,實驗結果表明,交叉熵符合代碼自然性,對傳統(tǒng)代碼度量進行很好的補充。隨后,在此基礎上,他們進行了擴展研究,提出了代碼抽象語法樹節(jié)點序列交叉熵(CE-AST)[98],結果表明,CE-AST具有更大的區(qū)分力。

Scandariato等人[99]將Android源代碼中的Java文件看作文本,采用詞袋模型統(tǒng)計文件中相關詞的頻率,用符號特征生成缺陷特征向量。針對Android源代碼難以獲取的問題,Dong等人[100]從Android二進制可執(zhí)行文件中提取符號特征和語義特征來構建缺陷預測模型,結果表明,該方法在WPDP中的準確率比CPDP更高。

Okutan等人[101]從抄襲和克隆檢測技術中得到啟發(fā),從源代碼中學習到一種新的語義度量指標。他們發(fā)現(xiàn)源文件的語法或語義相似度與其缺陷傾向性可能存在關聯(lián),基于這種假設,他們?yōu)槊總€文件計算相似性度量指標得到源文件之間的相似性,用這些相似性度量指標來預測特定文件是否有缺陷。Huo等人[102]認為注釋可以視為源代碼的另一個視圖,幫助生成語義特征,這些語義特征反映了用于識別缺陷模塊的代碼特征。但由于部分開發(fā)人員的習慣,有些項目的注釋很少,為了克服這個問題,他們構建了一種基于注釋增強程序的卷積神經(jīng)網(wǎng)絡(CAP-CNN)的缺陷預測模型,該網(wǎng)絡可以在訓練過程中自動編碼和吸收注釋信息以自動生成語義特征,實驗結果表明,注釋特征能夠提高缺陷預測性能。

為了避免AST序列化過程中損失語義信息,Humphreys等人[103]直接將源代碼作為序列輸入到深度學習模型中,由于源代碼文件組成成千上萬個token,并且代碼區(qū)域之間的距離很長,因為需要能快速處理長距離依賴關系的深度學習模型,該研究使用transformer從長序列中提取語義特征并證明了模型的可解釋性。Miholca等人[104]提出一種將漸進關系關聯(lián)規(guī)則與人工神經(jīng)網(wǎng)絡相結合的混合分類模型,該模型可以根據(jù)從源代碼中自動學習的語義特征來預測缺陷。

2.1.3 基于CPDP的語義度量指標

在以前利用深度學習捕獲語義特征的研究中[80-81],沒有考慮項目之間語義特征分布差異的影響,因此,Lin等人[105]嘗試將從現(xiàn)有軟件項目獲取的語義表示遷移到新項目中,為了驗證方法的可行性,手動標記了457個缺陷特征,并從6個開源項目中收集了30 000多個非缺陷特征。實驗結果證實,訓練后的模型能跨多個項目進行調(diào)整。Chen等人[106]設計了一種基于雙向長短期記憶網(wǎng)絡和注意力機制的CPDP方法,提出一種新的無監(jiān)督嵌入算法自動學習了從AST中提取的token向量的有意義表示,最后利用雙向長短期記憶網(wǎng)絡和注意力機制學習上下文語義特征。在不同的應用程序域的10個開源項目中進行實驗表明,該方法可以應用在CPDP。

為了最小化項目之間的分類誤差和分布差異,Qiu等人[107]將源和目標項目特定數(shù)據(jù)的隱藏表示形式嵌入到再生內(nèi)核Hilbert空間中進行分布匹配,然后將源文件解析的整數(shù)向量放入CNN中生成語義特征。Deng等人[108]探索了更合適CPDP的AST節(jié)點粒度并在CNN中添加多內(nèi)核匹配層以最小化源和目標項目的數(shù)據(jù)分布差異。Sheng等人[109]提出了對抗判別卷積神經(jīng)網(wǎng)絡,通過欺騙甄別器來學習目標項目到源項目特征空間的判別映射。

與Dam等人[91]類似的是,Cai等人[110]基于樹的嵌入,將AST節(jié)點編碼為向量并在再生內(nèi)核Hilbert空間中遷移不同項目的特征,其中還測量了AST之間的語義差距,最后將編碼后的AST饋入神經(jīng)網(wǎng)絡提取語義和結構特征。

2.2 結構度量指標

若僅關注代碼度量,使用文件或類粒度的統(tǒng)計特征或語義特征,會忽略軟件模塊的宏觀完整性,破壞軟件模塊元素之間的相互影響。相比需要人工建立的傳統(tǒng)網(wǎng)絡度量指標,研究人員試圖使用網(wǎng)絡嵌入等方法對軟件系統(tǒng)網(wǎng)絡結構進行分析。

網(wǎng)絡嵌入是將軟件網(wǎng)絡嵌入到低維空間,其中每個網(wǎng)絡節(jié)點都表示為低維向量,這種低維嵌入已經(jīng)解決了很多問題,例如節(jié)點分類、鏈路預測和個性化推薦。目前,大量的網(wǎng)絡嵌入算法已成功應用于網(wǎng)絡表示學習中,包括DeepWalk[111]、Node2vec[112]和LINE[113]。這些算法對代碼文件之間依賴關系形成的軟件網(wǎng)絡進行表示性學習,提取軟件模塊的結構特征進行缺陷預測。

與Meneely等人[22]的研究工作相似的是,Loyola等人[114]用開發(fā)人員活動數(shù)據(jù)構建了依賴關系圖,但該研究沒有使用傳統(tǒng)網(wǎng)絡度量,而是將依賴關系圖中每個節(jié)點進行截斷的隨機游走,從數(shù)據(jù)中自動學習表示。結果表明,數(shù)據(jù)的表示形式會極大地影響缺陷預測的性能。Qu等人[115]提出一種node2defect的方法,該方法先構造了分析程序的類依賴網(wǎng)絡(Class Dependency Network,CDN),然后使用node2vec自動學習CDN的結構特征。最后將該特征和傳統(tǒng)代碼度量結合形成新特征,實驗結果表明,node2defect方法可以顯著提高軟件缺陷的預測能力。

與網(wǎng)絡嵌入不同的是,一些研究者試圖用其他方法對依賴關系圖進行學習,Qu等人[116]采用k-core算法分析CDN上的缺陷分布,他們發(fā)現(xiàn)具有越大k值的類,有更大幾率存在缺陷,根據(jù)結果對軟件模塊的所有類進行排列能幫助測試人員更快速地找到缺陷。田永清[117]將系統(tǒng)依賴圖進行程序切片,得到程序結構的向量表示,然后利用門控循環(huán)單元神經(jīng)網(wǎng)絡提取網(wǎng)絡特征。

一些研究者將語義度量指標和結構度量指標混合使用。Meilong等人[118]用CNN從AST中自動學習語義特征,再基于軟件模塊之間的依賴關系構建了網(wǎng)絡模型,并用node2vec進行隨機游走得到結構特征。最后將語義特征和結構特征組合進行缺陷預測,實證結果表明,語義特征和結構特征的混合是目前軟件缺陷預測的首選。同樣,劉成斌等人[119]基于Apache的三個開源軟件項目將語義特征和結構特征進行混合預測,這兩項研究為多元度量指標提供了有效的研究思路。

2.3 缺陷預測模型構建

基于語義結構度量指標的缺陷預測的研究重點在提取更合適的度量,為了與傳統(tǒng)度量指標進行對比,研究人員對WPDP的模型構建和數(shù)據(jù)質(zhì)量部分選擇和基于傳統(tǒng)度量指標的缺陷預測保持一致,沒有改進。

綜上所述,研究人員對度量指標的提取進行了大量研究,主要包括傳統(tǒng)代碼度量、傳統(tǒng)網(wǎng)絡度量、語義度量、結構度量和其他過程度量。其中,這些度量指標體現(xiàn)了軟件模塊不同角度的信息,從現(xiàn)有研究來看,混合多元度量指標能使缺陷預測模型最大程度上精確。表4列出了基于語義結構度量指標的研究文獻使用的度量指標和數(shù)據(jù)集。

表4 研究文獻中度量指標和數(shù)據(jù)集(二)

3 評價指標

為了判斷構建的缺陷預測模型的性能,研究人員提出了多種評價指標,但在實際開發(fā)過程中,沒有充足的時間和資源審查代碼。為了將精力集中在最有可能發(fā)生缺陷的模塊上,開發(fā)人員提出了代價感知(effort-aware)指標。而相對地,機器學習領域常用來缺陷預測模型的指標稱為非代價感知(non-effort-aware)指標。表5列出了現(xiàn)有研究中使用最廣泛的評價指標。

3.1 非代價感知指標

在非代價感知情況下,最常用的模型性能評價指標是查準率(Precision)、查全率(Recall)、F-measure和AUC[3,7]。

其中,真正例(TP)表示有缺陷模塊被分類器正確標記為有缺陷的數(shù)量,真負例(TN)表示無缺陷模塊被正確標記為無缺陷的數(shù)量,假正例(FP)是指無缺陷模塊被錯誤地標記為有缺陷的數(shù)量,假負例(FN)是指有缺陷模塊被錯誤地標記為無缺陷的數(shù)量。更高的查準率可以讓開發(fā)人員不將調(diào)試工作浪費在無缺陷代碼上,查全率越高說明發(fā)現(xiàn)的缺陷越多。F-measure是綜合調(diào)和查準率和查全率的指標,用來衡量缺陷預測的性能。

AUC是ROC曲線下面積,ROC是一個x軸為假正例率,y軸為真正例率的二維曲線,AUC越高,模型性能越好。

表5 評價指標

準確率(Accuracy)表示正確預測實例的百分比。

馬修斯相關系數(shù)(MCC)通過考慮所有真假的有缺陷數(shù)據(jù)和無缺陷數(shù)據(jù)來衡量預測結果和真實結果之間的關系。返回值是[?1,1],其中1表示完美正相關,?1表示完美負相關。

3.2 代價感知指標

在代價感知情況下,開發(fā)人員通常通過檢查代碼的前20%行來識別缺陷百分比,性能評價指標是PofB20[26]。首先根據(jù)缺陷預測模型為每個實例生成的置信度,并使用置信度對測試數(shù)據(jù)集中的所有實例進行排序,置信度是指被預測為缺陷的概率。然后,模擬一個開發(fā)人員來檢查這些潛在的缺陷實例,并累積檢查的代碼行和發(fā)現(xiàn)的缺陷數(shù)量。當檢查了測試數(shù)據(jù)中的LOC的20%,并且已發(fā)現(xiàn)錯誤的百分比稱為PofB20分數(shù)時,該過程將終止。PofB20越高表示在檢查有限代碼行時,開發(fā)人員能檢測到的缺陷越多。

另一個廣泛使用的代價感知指標是Popt,被定義為1-Δopt,其中Δopt是預測模型和最優(yōu)模型之間的面積,用來描述兩者的偏差,Popt越大預測模型越接近最優(yōu)模型,標準化的Popt定義如下:

其中,Area(optimal)、Area(pre_model)、Area(worst)分別表示最優(yōu)模型、預測模型和最差模型對應曲線下的面積。

3.3 統(tǒng)計顯著分析方法

統(tǒng)計顯著分析方法可以幫助分析兩個方法是否有統(tǒng)計學上的顯著性差異。

(1)Wilcoxon signed-rank test[120]是一種非參數(shù)統(tǒng)計假設測試,用來比較兩個相關樣本,匹配樣本,或?qū)蝹€樣本重復測量,可用于確定是否從具有相同分布的總體中選擇了兩個相關樣本。該測試不需要基礎數(shù)據(jù)遵循任何分布,另外,它可以應用于數(shù)據(jù)對,并且能夠?qū)⒉钪蹬c零進行比較。在95%置信水平下,p值小于0.05表示受試者之間的差異具有統(tǒng)計學意義,而p值大于或等于0.05則表明差異在統(tǒng)計學上不顯著。

(2)Scott-Knott ESD test[121]是一種使用層次聚類算法進行統(tǒng)計分析的多重比較技術。本測試將方法進行排序和聚類,分為差異顯著的組,同一組的方法無顯著差異,不同組的方法有顯著差異。該測試的優(yōu)點是,它產(chǎn)生完全不同的組,沒有任何重疊。

(4)Friedman test[123]是一種非參數(shù)統(tǒng)計測試,它是基于績效值而不是實際值的排序,測試統(tǒng)計量由下式給出:

其中,n表示數(shù)據(jù)集的項目總數(shù),k表示特征選擇方法的總數(shù)表示第i個方法在第j個項目排名。

3.4 其他指標

(1)CEπ成本效益[124]是如何有效地使用并行計算來解決特定問題的指標。標準化的成本效益指標為:

(2)Win/Tie/Loss用于不同實驗設置之間的性能比較,當對目標項目數(shù)據(jù)集重復實驗1 000次時,若模型的性能優(yōu)于相應基線結果,標記為“Win”,當基線結果更好時,標記為“Loss”,如果模型和基線之間沒有差異,標記為“Tie”,根據(jù)Win/Tie/Loss評估的結果,可以改進模型。

4 結束語

準確的軟件缺陷預測保證了軟件可靠性、提高了軟件測試效率,本文從多元度量指標角度總結了當前軟件缺陷預測的相關工作,并列舉了部分具有代表性的研究文獻。盡管在軟件缺陷預測方面已經(jīng)進行了很多研究,仍存在許多潛在的挑戰(zhàn)。在這里,對未來研究工作進行展望。

(1)預測粒度的研究展望

現(xiàn)在的研究粒度大部分是文件級,由于文件的長度,開發(fā)人員需要很長時間才能找到缺陷,如果發(fā)生誤報,會過多地浪費資源,所以需要縮小預測的缺陷的范圍。更細粒度的預測可以為開發(fā)人員提供更少的代碼行,其中方法級缺陷預測有助于預測軟件項目中帶有缺陷的方法,但是構建方法級缺陷預測模型仍然是一個挑戰(zhàn)。

(2)傳統(tǒng)軟件度量指標的研究展望

過去幾十年,研究人員提出了大量的傳統(tǒng)代碼度量和過程度量,但是冗余和無關度量指標降低模型性能,為了使模型更精確,他們將多種度量指標組合并試圖從軟件歷史倉庫中提取更能體現(xiàn)缺陷的新的度量指標。如何提出合適的指標仍需要進一步研究。

(3)基于深度學習的軟件度量指標的研究展望

近年來,語義度量代替了傳統(tǒng)代碼度量,許多研究表明語義度量構建的缺陷預測模型比傳統(tǒng)代碼度量預測得更準確。用深度學習直接從源代碼中學習語義表示過程,為了將源代碼饋入深度學習模型,通常會損失一些語義信息,哪種方式可以最小限度地減少損失需要進一步研究。

(4)跨項目軟件缺陷預測度量指標的研究展望

對于新項目或缺少足夠歷史數(shù)據(jù)的項目,研究和使用語義度量來預測缺陷非常有意義。由于源項目和目標項目之間存在不同的數(shù)據(jù)分布,因此難以建立可實現(xiàn)令人滿意性能的良好缺陷預測模型。此外,CPDP方面的語義度量提取只是簡單地遷移了WPDP的方法,沒有針對數(shù)據(jù)分布問題進行更好的可行性研究,若能針對該問題進入深入研究,則可以為CPDP方面提供更好的缺陷預測模型。

猜你喜歡
源代碼度量語義
有趣的度量
人工智能下復雜軟件源代碼缺陷精準校正
計算機仿真(2023年8期)2023-09-20 11:23:42
模糊度量空間的強嵌入
基于TXL的源代碼插樁技術研究
語言與語義
迷向表示分為6個不可約直和的旗流形上不變愛因斯坦度量
軟件源代碼非公知性司法鑒定方法探析
“上”與“下”語義的不對稱性及其認知闡釋
揭秘龍湖產(chǎn)品“源代碼”
地質(zhì)異常的奇異性度量與隱伏源致礦異常識別
黔南| 特克斯县| 花莲县| 濮阳市| 桐城市| 汾阳市| 永济市| 含山县| 乌鲁木齐县| 安塞县| 康保县| 荆门市| 澎湖县| 图们市| 那曲县| 吉林省| 海安县| 金湖县| 永济市| 运城市| 诸暨市| 吉林省| 绥江县| 呈贡县| 富民县| 长丰县| 财经| 汕头市| 东明县| 永嘉县| 双柏县| 松原市| 南溪县| 临海市| 常德市| 英超| 扶绥县| 化德县| 泰州市| 新和县| 拉孜县|