• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      一種改進的基于文本的重復代碼自動識別方法

      2018-11-17 01:32:18賓航飛胡志剛
      軟件 2018年10期
      關鍵詞:常量精確度代碼

      劉 偉,賓航飛,胡志剛

      ?

      一種改進的基于文本的重復代碼自動識別方法

      劉 偉1,2,賓航飛2,胡志剛2

      (1. 湖南中醫(yī)藥大學信息科學與工程學院,湖南 長沙 410208;2. 中南大學軟件學院,湖南 長沙 410075)

      代碼味道的識別與自動重構是近年來軟件工程的熱點領域之一,而重復代碼是一種在軟件工程中較為常見的代碼味道。本文在基于文本的重復代碼識別方法的基礎上,通過詞法分析對特定的Token作出處理后再對源代碼進行對比,最后通過語法樹的對比來對結果進行過濾以降低誤報率。測試結果表明該方法對于重復代碼有著較好的識別效果。對重復代碼的自動識別算法研究有著借鑒意義,在軟件的質(zhì)量、維護等領域上也具有廣泛的應用需求。

      重復代碼;代碼味道;自動識別;抽象語法樹

      0 引言

      隨著信息技術的高速發(fā)展,人們已開發(fā)越來越多的軟件系統(tǒng),而軟件系統(tǒng)的復雜程度也隨之越來越高,軟件系統(tǒng)的規(guī)模也越來越龐大,軟件系統(tǒng)的健壯性、可維護性、可擴展性等質(zhì)量屬性也越來越重要,軟件質(zhì)量已成為軟件工程的重要研究分支 之一[1-4]。

      隨著軟件系統(tǒng)規(guī)模的擴大、復雜度的提升,即便耗費了大量的人力物力,軟件系統(tǒng)的正確性仍然難以保證,不良的代碼和低劣的設計也隨之出現(xiàn)。在Martin Fowler的《重構——改善既有代碼的設計》中使用“代碼味道(code smells)”來指代軟件系統(tǒng)中的差勁設計和質(zhì)量低下的模塊。在該著作中,將常見的代碼味道進行歸納并提出了22種代碼味道。

      在代碼味道中,重復代碼是一種重要的代碼味道,也是在軟件系統(tǒng)中最為常見的代碼味道之一。重復代碼將導致代碼的冗余,同時降低了軟件系統(tǒng)的健壯性和可維護性,浪費不必要的工作量。

      與其他代碼味道相比較,重復代碼具有更高的客觀性和可度量性,易于使用數(shù)學語言或程序語言進行表達,因此,相比其他代碼味道的識別,重復代碼的識別更加具有可行性。

      國外對于重復代碼的研究始于20世紀90年代[5],而國內(nèi)對這方面的研究起步較晚,且在取得的成果上還有一定的差距,但在重復代碼檢測及重構上仍有一定的成果[6-8]。

      國內(nèi)外已提出許多重復代碼識別方法和技術,并且開發(fā)出了相應的檢測工具。這些方法可大致分為基于文本(context)、基于詞法(token)、基于語法(syntax)、基于語義(semantic)、基于度量(metrics)等,還有一些其他方法。

      (1)基于文本(context)的識別方法

      該方法在對軟件系統(tǒng)的源代碼進行簡單處理后(一般只過濾注釋、空行等),直接進行重復代碼的判斷。在Lingxiao Jing等[9]提出的方法中,先對意義相同的循環(huán)控制語句、條件語句等進行了過濾,再進行比較以查找重復代碼。Johnson[10]首先提出基于文本的識別方法,該方法使用哈希函數(shù)將代碼片段進行哈希計算,通過哈希值的比較來查找重復 代碼。

      (2)基于詞法(token)的識別方法

      該方法可看作基于文本的識別方法的改進。該方法先將源代碼中的內(nèi)容通過詞法分析轉(zhuǎn)換為token序列,再對轉(zhuǎn)換后的token序列進行比較。該方法由Baker[11]首次提出,其采用了后綴樹算法來比較token序列的相似性。

      (3)基于語法(syntax)的識別方法

      該方法將程序解析為語法樹,通過查找其中相似的子樹來查找重復代碼。Baxter等[12]首先將抽象語法樹(AST)技術應用于重復代碼識別。

      (4)基于語義(semantic)的識別方法

      該方法以程序依賴圖(PDG)為代表,先根據(jù)程序的數(shù)據(jù)流和控制流構建程序依賴圖,再通過查找其中的同構子圖來查找重復代碼。郭婧等[8]在基于程序依賴圖的克隆檢測方法上,通過對程序語句進行斷層和分類處理,以加強對重復代碼的識別 能力。

      (5)基于度量(metrics)的識別方法

      該方法先根據(jù)程序的源代碼或者抽象語法樹進行分析,得出度量因子,通過比較度量因子來查找重復代碼。該種方法由Mayrand等人首次提出[13]。

      (6)其他方法

      其他重復代碼識別方法在實際應用中使用較少,如基于低級語言的方法,該方法通過比較編譯后產(chǎn)生的匯編代碼、Java字節(jié)碼[14]來識別重復代碼。由Philipp Schugerl提出的基于描述邏輯的方法[15],該方法綜合了基于語法的方法與基于語義的方法,通過分析程序得到抽象語法樹,再使用語義網(wǎng)推理器(semantic web reasoner)進行語義分析,并結合了Hadoop的Map/Reduce框架,著重于對程序的控制流進行比較來查找重復代碼。Georges Golomingi Koni-N’Sapu提出的基于重構場景的方法[16],該方法通過對重構方法的分類,指出各種重構方法使用重復代碼的情況,根據(jù)這些情況尋找程序中是否出現(xiàn)了對應的重復代碼。

      上述的方法各有其優(yōu)缺點,本文提出了一種基于文本的、結合詞法分析與語法分析的重復代碼識別算法,嘗試對現(xiàn)有的重復代碼查找算法進行改進。

      1 重復代碼查找算法的評估方法

      1.1 重復代碼的分類

      代碼段(Code Fragment)指代任意一段代碼行序列,在不同的重復代碼識別方法中代碼段一般也有著不同的粒度,如類定義、函數(shù)定義、邏輯控制語句等。重復代碼,又稱為克隆代碼,即指相同或相似的兩個及以上的代碼段。其中,一對相似的代碼段稱之為克隆對,兩個及以上的相似代碼段稱之為克隆群。

      在國內(nèi)外的研究中,普遍根據(jù)代碼段的文本相似性和功能相似性將重復代碼分成了四類[17-18]: (1)除空格、注釋、代碼布局之外都相同的代碼段;(2)除了對變量名、類型或函數(shù)名等進行重命名外,代碼片段在語法級別相似;(3)進行了增加、刪除、修改的代碼段;(4)功能相同,但句法上不同的代碼段。

      在一些研究中,將第1類稱為完全克隆,第2、3類稱為近似克?。╪ear-miss clone)[19],而第4類稱之為語義克隆(semantic clone)[20]。

      1.2 發(fā)現(xiàn)率與精確度

      為了對重復代碼識別方法進行評估,一些研究提出如下定義,用于評估重復代碼識別方法的有效性與實用性[21]。

      (1)在將重復代碼識別方法應用于具體的軟件系統(tǒng)時,將軟件系統(tǒng)中真實存在的重復代碼的集合稱之為真實克隆。真實克隆只能通過人工檢查來確定,且具有一定的主觀性。但它仍然是評估一個重復代碼識別方法的基礎。

      (2)通過某種重復代碼識別方法所檢測到的重復代碼的集合稱之為候選克隆。

      (3)既屬于候選克隆,又屬于真實克隆的,即為合理候選克隆。

      發(fā)現(xiàn)率和精確度是用來衡量重復代碼識別方法的主要指標,一個好的方法既要有較高的發(fā)現(xiàn)率也要有較高的精確度,在本文中,將使用這兩個指標來評估各種重復代碼識別方法。

      2 基于文本的重復代碼查找算法設計

      本算法在采用基于文本的重復代碼查找算法的基礎上,結合了詞法分析和語法分析等方法,以提高識別率和精確度。

      代碼之間以代碼行為單位進行比較,兩段代碼之間相同的行數(shù)超過所定閾值即可視為重復代碼。兩個代碼行之間通過字符串匹配判斷是否相同。

      本算法由以下三個步驟組成:

      (1)代碼標準化。移除源文件中的注釋、空白行和其他無效內(nèi)容,并對代碼中的某些Token進行處理以提高發(fā)現(xiàn)率。代碼標準化可以有效提高發(fā)現(xiàn)率,但對精確度有著一定的影響。

      (2)代碼比較。逐行對代碼文件進行比較,記錄兩個代碼片段間重復的行數(shù),結合所定閾值判斷兩個代碼片段是否為克隆對。

      (3)結果優(yōu)化。代碼比較之后的結果可能出現(xiàn)較大誤差,本算法通過抽象語法樹的比較等手段對結果進行過濾,在保證較高發(fā)現(xiàn)率的同時,一定程度上提高精確度。

      2.1 代碼標準化

      傳統(tǒng)的基于文本的重復代碼查找算法有著實現(xiàn)簡單,精確度高的特點,但是發(fā)現(xiàn)率卻很不理想,只對第1類克隆有著較高的發(fā)現(xiàn)率。其原因在于代碼在被復制的過程中,開發(fā)人員可能對代碼做出簡單的修改,例如對注釋、變量名、函數(shù)名進行修改、添加或刪除的操作,從而產(chǎn)生第2類、第3類克隆代碼。簡單的基于文本對比的重復代碼查找算法,只能識別完全相同的兩段文本,因此很難對第2類、第3類克隆代碼進行有效識別。

      代碼標準化可以有效改善上述問題,其作用有如下兩個:

      (1)降噪

      代碼標準化可以對代碼進行“降噪”,即去除對于代碼比較毫無意義且有干擾的元素。

      首先,注釋普遍存在于各種語言的代碼中;同時,開發(fā)人員通過多個換行分隔各段代碼,以提升代碼的可讀性;此外,不同的代碼具有不同縮進格式,而代碼結構層次的不同也會形成不同的縮進。在代碼比較的過程中,注釋和這些多余的換行、空格顯然是要進行消除的。例如,在降噪過程中將去除兩個及以上的連續(xù)空格,僅保留其中一個。

      其次,代碼的大小寫不同也會對代碼比較造成影響,因此在降噪進程中可以統(tǒng)一代碼的大小寫。

      除了注釋、多余換行、空格等干擾元素之外,開發(fā)人員的編程習慣也會對代碼格式造成影響,例如在賦值語句中等號兩邊使用一個空格間隔或者不使用空格,都于開發(fā)人員的代碼書寫習慣有關。因此,在降噪過程中需要去除等號、括號以及比較符等“間隔符”與其它元素之間的空格,以消除開發(fā)人員的代碼書寫習慣的影響。

      針對各種語言特性,可以設計相對應的降噪方法:對于Java語言,可去除意義性不強的聲明包package以及導入包語句import;對于C/C++語言,可以在降噪過程中去除“#include”等對于代碼意義影響不大的代碼行。

      (2)Token處理

      降噪處理可以去除對重復代碼有干擾的元素,對提高算法的發(fā)現(xiàn)率有一定的作用。但降噪處理只能提高對第2類克隆代碼的識別能力,對第3類克隆代碼識別效果的提升并不明顯。

      Token處理即對某些字符串(在代碼中可能是方法名,也可能是參數(shù)名)進行替換,根據(jù)規(guī)則全部替換為指定的Token值。例如,將所有變量名替換為字符“p”,將所有數(shù)字常量替換為數(shù)字0,字符串常量替換為字符串“s”。

      通過Token替換,該算法能夠有效識別經(jīng)過修改變量名、類型以及各種常量的重復代碼段,從而提升了算法對第3類克隆代碼的識別能力。

      在本算法中,Token處理可分為三種程度。

      (1)不進行任何Token處理,算法將直接對降噪后的代碼進行比較。

      (2)只對各種常量進行Token處理,將數(shù)字常量、字符串常量等替換為一個統(tǒng)一的常量。在本算法中,對字符串常量統(tǒng)一替換為字符串“s”,整數(shù)常量統(tǒng)一替換為整數(shù)“0”,實數(shù)常量統(tǒng)一為“0.0”。

      (3)在(2)的基礎上,對所有標識符進行統(tǒng)一的替換。即對類型、變量名、函數(shù)名等統(tǒng)一替換為p。需要指出的是,由于代碼并未進行語法分析,因此在詞法分析中,對象的方法名、屬性同樣會被識別為普通的標識符。如代碼“people.getName()”,經(jīng)過第三種程度的Token替換后會成為代碼“p.p()”。該情況的出現(xiàn)會造成大量的誤報,因此在第三種程度的代碼標準化中,需通過詞法分析將方法名、成員變量標識為不進行替換的Token。因此上文中的代碼“people.getName()”將替換為代碼“p.getName()”,從而在提高發(fā)現(xiàn)率的同時,避免大量的誤報。

      在本算法中,降噪和Token處理都是通過詞法分析來完成的,通過這個標準化的過程,能有效地提高本算法對于第2類克隆的發(fā)現(xiàn)率。

      2.2 代碼比較過程

      代碼經(jīng)過標準化處理后,將對其進行比較,并識別出重復代碼。本算法以代碼行為單位進行文本比較。

      該過程中有兩個重要閾值:重復代碼閾值和不匹配行閾值。

      (1)重復代碼閾值聲明了當兩段代碼之間有多少行代碼匹配時即可被視為重復代碼。該閾值對整個算法至關重要,尤其是代碼標準化過程會使得大量的代碼行在標準化之后成為了匹配的代碼行,因此這個閾值的設定會大幅地影響整個算法的發(fā)現(xiàn)率和精確度。

      (2)在第3類克隆中,代碼片段可能存在某一行或多行代碼進行了修改、增加、刪除操作。針對該情況,在代碼比較過程中設定一個不匹配行閾值,該閾值聲明了兩個重復代碼段之間所允許的不匹配行數(shù)的最大值。通過該閾值,使算法能夠發(fā)現(xiàn)部分第3類克隆。但是,如果將該閾值設定得過大,則會使算法的精確度降低,造成大量的誤報。

      在代碼行的比較過程中,如圖1所示,常見的代碼行匹配情況有三種:連續(xù)匹配、不連續(xù)匹配、錯位匹配。連續(xù)匹配是指兩段代碼段之間每一行都是完全匹配的,不連續(xù)匹配是指兩段代碼行之間有相同行數(shù)的不匹配現(xiàn)象,錯位匹配是指兩段代碼行之間有不匹配現(xiàn)象,但兩段代碼行之間不匹配的行數(shù)不相同。

      圖1 連續(xù)匹配、不連續(xù)匹配和錯位匹配示意圖

      需要指出的是,在本文所提出的算法中,并沒有檢測錯位匹配的重復代碼情況,因為實現(xiàn)錯位匹配檢測需要付出相當程度的時間復雜度,因此未對錯位匹配的情況進行檢測。而對于不連續(xù)匹配,不匹配行閾值即用于發(fā)現(xiàn)不連續(xù)匹配。

      2.3 基于語法樹匹配的結果優(yōu)化過程

      使用在本算法查找重復代碼的過程中,標準化過程、不匹配行閾值在提高發(fā)現(xiàn)率的同時,也會降低精確度,因此,本算法設計了一個基于抽象語法樹匹配的過程,用于去除查找結果中的非重復代碼段,以提高該算法的精確度。在該過程中,將兩段待比較的代碼轉(zhuǎn)換成為抽象語法樹,再比較兩棵樹的匹配程度,計算語法樹之間的相似度,過濾掉相似度較低的識別結果。

      3 算法驗證與結果分析

      在本章中將以本文提出的算法進行實驗,并對結果進行比較和分析,以判斷該算法是否有效,并分析各項參數(shù)對于發(fā)現(xiàn)率和精確度的影響。從上文對算法的描述可知,標準化程度、重復代碼閾值和不匹配行閾值是影響重復代碼查找結果的3個重要因素。本章也將研究這3個因素對于查找結果的影響。

      3.1 實驗數(shù)據(jù)集

      為了對該算法進行實驗,收集了一百個開源Java項目的源代碼作為實驗數(shù)據(jù)集。

      3.2 評價指標

      上文中提出了兩個用于評估重復代碼查找算法的指標:發(fā)現(xiàn)度和精確度。發(fā)現(xiàn)率是指合理候選克隆與真實克隆的比例,比例值越高說明發(fā)現(xiàn)克隆代碼的能力越強;精確度是指合理候選克隆與候選克隆的比例,比例值越高說明識別能力越準確。

      需要指出的是,在本次實驗中,發(fā)現(xiàn)度與精確度是無法進行精確衡量的,因為真實克隆代碼需要通過人工在實驗數(shù)據(jù)集中查找出來,具有極高的主觀性。因此只能先通過較為權威的克隆代碼識別工具找出某個小型項目中的候選克隆代碼,將該結果作為初步篩選,并在此基礎上人工查閱已被標記的克隆代碼片段的上下文代碼,補充遺漏的克隆代碼片段,得到最終的真是克隆代碼,以此算出發(fā)現(xiàn)率和準確率。

      3.3 參考集

      在本實驗中主要使用PMD的檢測結果作為對照集來檢驗本算法的檢測效果(發(fā)現(xiàn)率和準確率)。PMD是一種開源的分析Java代碼錯誤的工具。與其他分析工具不同的是,PMD通過靜態(tài)分析獲知代碼錯誤,即在不運行Java程序的情況下報告錯誤。PMD附帶了許多可以直接使用的規(guī)則,利用這些規(guī)則可以找出Java源程序的許多問題。此外,用戶還可以自己定義規(guī)則,檢查Java代碼是否符合某些特定的編碼規(guī)范。

      3.4 實驗過程與結果分析

      實驗挑選了兩個開源Java項目進行實驗:jManage和freemarker。對這兩個項目進行重復代碼查找。

      上文中提到標準化程度、重復代碼閾值和不匹配行閾值是3個本算法中重要的變量。由于作為參考集的PMD工具只有重復代碼閾值這一設置項,因此只將本算法中的標準化程度、不匹配行閾值作為變量進行實驗,重復代碼閾值設置為固定的常量。

      標準化程度可分為3種程度,用數(shù)字1-3表示。

      程度1表示不進行任何Token處理,算法將直接對降噪后的代碼進行比較。

      程度2只對各種常量進行Token處理,將數(shù)字常量、字符串常量等替換為一個統(tǒng)一的常量。在本算法中,對字符串常量統(tǒng)一替換為字符“s”,整數(shù)常量統(tǒng)一替換為整數(shù)“0”,實數(shù)常量統(tǒng)一為“0.0”。

      程度3是在程度2的基礎上,對所有標識符進行統(tǒng)一的替換。即對類型、變量名、函數(shù)名等統(tǒng)一替換為字符“p”。

      不匹配行閾值只使用0-3這個范圍,因為根據(jù)之前的觀測發(fā)現(xiàn)不匹配行閾值超過3會引起大量的誤報,因此不匹配行閾值是沒有必要超過3的。

      首先實驗了算法的發(fā)現(xiàn)率,對于jManage項目進行重復代碼查找的結果如表1,對freemarker項目進行重復代碼查找的結果如表2。

      表1 jManage項目中的PMD查找結果

      Tab.1 The detection result of PMD for jManage

      表2 jManage項目中的重復代碼查找結果

      Tab.2 The detection result of the proposed approach for jManage

      表3 freemarker項目中的PMD查找結果

      Tab.3 The detection result of PMD for freemarker

      表4 freemarker項目中的重復代碼查找結果

      Tab.4 The detection result of the proposed approach for freemarker

      根據(jù)實驗結果可以得出標準化程度、不匹配行閾值這兩個變量對于重復代碼查找的發(fā)現(xiàn)率和精確度的影響:

      不匹配行閾值一定的情況下,標準化程度越高,算法的發(fā)現(xiàn)率也就越高,但精確度也就隨之降低。

      證明代碼標準化在提高發(fā)現(xiàn)率的同時也導致了精確度的降低,當然在發(fā)現(xiàn)率本來就較高的情況上,再進行標準化對結果也沒有太大的影響。而在標準化程度一定的情況下,不匹配行閾值越高,同樣算法的發(fā)現(xiàn)率也就越高,但精確度也隨之下降。因此不匹配行閾值也在提高發(fā)現(xiàn)率的同時降低了精確度,而且不匹配行閾值的取值不應該過大,否則會造成大量的誤報。但是設置合適的不匹配行閾值,如將其設置為2,對查找第3類克隆是有一定的幫助的。

      可以看出,標準化程度、不匹配行閾值對于本算法是至關重要的兩個變量,在很大程度上可以影響算法的檢測結果。設置合適的標準化程度、不匹配行閾值對于重復代碼查找是相當重要的。freemarker項目重復代碼查找結果中,在標準化程度為2,不匹配行閾值為0的情況與標準化程度為3,不匹配行閾值為0的情況之間,精確率出現(xiàn)大幅度的下降。經(jīng)過人工審查發(fā)現(xiàn)大量相似的構造函數(shù)被識別為克隆代碼,而類似構造函數(shù)、Getter和Setter等特殊方法不適合被識別為克隆代碼。

      4 結語

      本文設計了一種基于文本的重復代碼查找方法,該方法在基于文本的方法的基礎上結合了詞法分析和語法分析,以進一步提升發(fā)現(xiàn)率和精確度。通過實驗發(fā)現(xiàn)該算法的發(fā)現(xiàn)率和精確度在實際項目中都有著不錯的表現(xiàn)。

      但該方法中的比較算法僅僅考慮了文件之間的兩兩比較,沒有考慮查找多個文件中共同的重復代碼,未來的工作將考慮對多個文件中的重復代碼進行查找。

      [1] 翁秀木. 一個通用的軟件質(zhì)量評估指標體系[J]. 軟件, 2015, 36(3): 59-63.

      [2] 印杰, 李千目. 軟件代碼漏洞的電子取證技術綜述[J]. 軟件, 2015, 36(12): 49-59.

      [3] 段明璐, 楊勛姮. 軟件故障樹算法建模的研究[J]. 軟件, 2018, 39(2): 66-74.

      [4] 楊勛姮, 段明璐. 軟件缺陷分析技術的研究[J]. 軟件, 2018, 39(2): 93-101.

      [5] BAKER B S. A program for identifying duplicated code[J]. Computing Science and Statistics, 1992, 24(1): 49-57.

      [6] 于冬琦, 吳毅堅, 彭鑫,等. 基于相似性度量的面向?qū)ο蟪绦蚍椒壙寺蓽y[J]. 電子學報, 2010, 38(2A): 174-181.

      [7] 于冬琦, 彭鑫, 趙文耘. 使用抽象語法樹和靜態(tài)分析的克隆代碼自動重構方法[J]. 小型微型計算機系統(tǒng), 2009, 30(9): 1752-1760.

      [8] 郭婧, 吳軍華. 基于程序依賴圖的克隆檢測及改進[J]. 計算機工程與設計, 2012, 33(2): 595-600.

      [9] Lingxiao Jing, Zhendong Su, Edwin Chiu. Context-Based Detection of Clone-Related Bugs[Z]. Proceedings of the 6th Joint Meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering (ESEC/FSE), 2007.

      [10] JOHNSON J H. Identifying redundancy in source code using fingerprints[C]. IBM Press, 1993: 171-183.

      [11] BAKER B S. On finding duplication and near-dulication in large software systems[C]. Washington DC: IEEE Computer Society, 1995: 86-95.

      [12] BAXTER I, YAHIN A, MOURA L, et al. Clone detection using abstract syntax trees[C]. Washington DC: IEEE Computer Society, 1998: 368-377.

      [13] MAYRAND J, LEBLANC C, MERLO E. Experiment on the automatic detection of function clones in a software system using metrics[C]. Washington DC: IEEE Computer Society, 1996: 244-253.

      [14] Ian J. Davis, Michael W. Godfrey. From Whence It Came: Detecting Source Code Clones by Analyzing Assembler[Z]. Reverse Engineering (WCRE), 2010 17th Working Conference on, 2010.

      [15] Philipp Schugerl. Scalable clone detection using description logic--IWSC '11 Proceedings of the 5th International Workshop on Software Clones [C]. ACM: New York, 2011: 47-53.

      [16] Georges Golomingi Koni-N’Sapu. A scenario based approach for refactoring duplicated code in object oriented systems [D]. Switzerland: University of Bern, 2001.

      [17] ROY C K, CORDY J R, KOSCHKE R. Comparison and evaluation of code clone detection techniques and tools: a qualitative approach[J]. Science of Computer Programming, 2009, 74(7): 470-495.

      [18] 史慶慶, 孟繁軍, 張麗萍, 劉東升. 克隆代碼技術研究綜述[J]. 計算機應用研究, 2013, 30(6): 1617-1623.

      [19] ZIBRAN F M, SAHA R, ASADUZZAMAN M, et al. Analyzing and forecasting near-miss clones in evolving software: an empirical study--Proc of the 16th IEEE International Conference on Engineering of Complex Computer Systems[C]. Washington DC: IEEE Computer Society, 2011: 295-304.

      [20] GABEL M, JIANG Ling-xiao, SU Zhen-dong. Scalable detection of semantic clone[C]. New York: ACM Press, 2008: 321-330.

      [21] Stéphane Ducasse, Oscar Nierstrasz, Matthias Rieger. On the effectiveness of clone detection by string matching[J]. Journal of Software Maintenance and Evolution: Research and Practice, 2006, 18: 27-58.

      An Improved Approach for Automatic Detection of Duplicated Code Based on Text

      LIU Wei1,2, BIN Hang-fei2, HU Zhi-gang2

      (1. School of Informatics, Hunan University of Chinese Medicine, Changsha 410208, Hunan, China; 2. School of Software, Central South University, Changsha 410075, Hunan, China)

      In the recent years, detection and automatic refactoring of code smell is one of the focus topic in software engineering, and duplicated code is a kind of common code smell. Based on the duplicated code recognition method of text, the false positives can be reduced through the lexical analysis to compare the source code after handling the specific token and through the comparison with the abstract syntax tree to filter the results. The test results show that the method has better detection effect of duplicated code. This has great significance in the study of automatic detection algorithm of duplicated code, and there is also wild application in software maintenance and software quality.

      Duplicated code; Code smell; Automatic detection; Abstract syntax tree

      TP311.5

      A

      10.3969/j.issn.1003-6970.2018.10.015

      劉偉,男,副教授,高級工程師,博士,研究方向:軟件工程和數(shù)據(jù)挖掘;賓航飛,男,碩士研究生,研究方向:軟件工程;胡志剛,男,教授,博士生導師,博士,研究方向:軟件工程、并行計算和云計算。

      劉偉,賓航飛,胡志剛. 一種改進的基于文本的重復代碼自動識別方法[J]. 軟件,2018,39(10):68-73

      猜你喜歡
      常量精確度代碼
      科學照亮世界
      ——卡文迪什測定萬有引力常量
      研究核心素養(yǎng)呈現(xiàn)特征提高復習教學精確度
      “硬核”定位系統(tǒng)入駐兗礦集團,精確度以厘米計算
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      低氧低分壓環(huán)境下泡塑吸附火焰原子吸收光譜法測定常量金
      西藏科技(2015年1期)2015-09-26 12:09:20
      論常量函數(shù)的充分必要條件
      近似數(shù)1.8和1.80相同嗎
      措勤县| 裕民县| 泗洪县| 札达县| 丰台区| 伊川县| 修武县| 汉源县| 贡山| 巴林左旗| 五指山市| 襄樊市| 华宁县| 栖霞市| 新野县| 杭州市| 汾阳市| 连南| 文安县| 盱眙县| 洛宁县| 东至县| 安庆市| 成安县| 千阳县| 建湖县| 三台县| 万州区| 绩溪县| 乌拉特前旗| 甘洛县| 徐水县| 普格县| 昌吉市| 广水市| 白沙| 杭锦后旗| 册亨县| 江都市| 明光市| 双峰县|