• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于修改日志克隆代碼跟蹤及演化模式識(shí)別

    2018-06-01 10:50:12葛廣帥劉東升張麗萍包薩仁娜
    關(guān)鍵詞:查全率代碼克隆

    葛廣帥,劉東升,張麗萍,侯 敏,包薩仁娜

    GE Guangshuai,LIU Dongsheng,ZHANG Liping,HOU Min,BAO Sarenna

    內(nèi)蒙古師范大學(xué) 計(jì)算機(jī)與信息工程學(xué)院,呼和浩特 010022

    College of Computer and Information Engineering,Inner Mongolia Normal University,Hohhot 010022,China

    1 引言

    為了使軟件更具競爭力,在軟件初始版本完成之后,仍然需要新功能擴(kuò)充、問題修復(fù)等后期維護(hù)活動(dòng)。有研究表明[1],軟件維護(hù)約占軟件總勞動(dòng)成本的80%左右。

    軟件的維護(hù)成本受多種因素影響,其中一個(gè)重要因素就是克隆代碼。在軟件開發(fā)維護(hù)過程中,開發(fā)人員為了提高開發(fā)速度、節(jié)約時(shí)間成本,經(jīng)常使用“復(fù)制-粘貼-修改”操作,導(dǎo)致系統(tǒng)中產(chǎn)生大量的克隆代碼。此外,由于設(shè)計(jì)模式、相似API等的使用,也會(huì)產(chǎn)生克隆代碼。有研究表明[2],克隆代碼在軟件系統(tǒng)中普遍存在,并且占據(jù)了相當(dāng)大的比例。

    克隆代碼在軟件開發(fā)維護(hù)方面具有雙重影響。一方面,有些克隆代碼是有益的,例如某代碼片段經(jīng)過測試無任何缺陷,那么復(fù)用該代碼片段可以節(jié)省開發(fā)時(shí)間,避免未知風(fēng)險(xiǎn)[3]。另一方面,有些克隆代碼是有害的,例如復(fù)用了未經(jīng)測試的代碼片段,可能使得潛在的缺陷大量繁殖,并且開發(fā)人員對一段克隆代碼修改時(shí)也必須對相關(guān)的克隆代碼進(jìn)行相應(yīng)修改,增加了維護(hù)成本[4]。

    為了更好地進(jìn)行克隆代碼分析和管理,不僅要檢測出軟件系統(tǒng)中的克隆代碼,還需要了解克隆代碼隨版本迭代的演變情況[2]。研究者們通過分析克隆代碼在版本升級過程中的變化特點(diǎn),為程序員理解、管理克隆代碼提供幫助。

    2 相關(guān)研究工作

    2.1 克隆代碼

    克隆代碼(clone code)[2]是指軟件源碼中的一些代碼片段,它們之間存在著相同或相似的語法或語義特征,這些代碼片段被稱為克隆片段(clone fragment)。兩個(gè)相同或相似的克隆片段稱為克隆對(clone pair),所有相同或相似的克隆片段的集合稱為克隆群(clone class)。

    現(xiàn)有研究中主要采用兩種方式定義克隆,根據(jù)代碼片段粒度,將克隆代碼分為語句克隆、塊克隆、函數(shù)克隆、類克隆、文件克隆五種類型[3];根據(jù)文本及功能相似度,將克隆代碼分為Type-1克隆、Type-2克隆、Type-3克隆、Type-4克隆四種類型[3]。

    圖1展示了Type-1、Type-2、Type-3、Type-4四種克隆類型的具體樣例。Type-1克隆( CF1與CF2):除了空格、制表符、回車換行和注釋外完全相同的代碼片段;Type-2克?。–F1與CF3、CF5與CF6):除了空格、制表符、回車換行、注釋、標(biāo)識(shí)符、類型外句法結(jié)構(gòu)完全相同的代碼片段;Type-3克隆(CF1與CF4、CF3與CF4):除了空格、制表符、回車換行、注釋、標(biāo)識(shí)符、類型外句法結(jié)構(gòu)基本相同,但含有少量語句的增加、修改、刪除的代碼片段;Type-4克?。–F1與CF5):功能相似或相同但句法結(jié)構(gòu)不同的代碼片段[2]。

    圖1 四種克隆類型源代碼示例圖

    2.2 克隆檢測

    克隆檢測是指從源碼中找出克隆代碼,是克隆代碼研究的基礎(chǔ)工作。目前研究學(xué)者已提出多種克隆檢測方法,每種方法都有優(yōu)缺點(diǎn)。

    Johnson[5]使用基于文本的方法進(jìn)行克隆檢測,首先將代碼片段哈希,然后使用增量哈希函數(shù)識(shí)別具有相同哈希值的代碼片段即為克隆代碼。該方法時(shí)空復(fù)雜度低,但是只能用來檢測Type-1克隆,對于其他類型克隆查全率較低。Baker[6]使用基于Token的方法進(jìn)行克隆檢測,首先使用詞法分析工具將代碼片段轉(zhuǎn)化成Token串,然后使用后綴樹算法計(jì)算Token串的相似性得到克隆代碼。該方法能夠有效檢測Type-1、Type-2克隆,但是對于Type-3克隆查全率、查準(zhǔn)率都不高。Baxter等人[7]使用基于抽象語法樹的方法進(jìn)行克隆檢測,首先將源代碼解析成語法樹,然后將子樹哈希到N個(gè)桶中,對同一個(gè)桶中的子樹比較相似性得到克隆代碼。該方法能有效地處理Type-1、Type-2、Type-3克隆,但時(shí)空復(fù)雜度太高。Krinke[8]使用基于程序依賴圖的方法進(jìn)行克隆檢測,首先將程序根據(jù)語句之間的數(shù)據(jù)流和控制關(guān)系建立程序依賴圖集合,然后在程序依賴圖中尋找同構(gòu)子圖,同構(gòu)子圖所對應(yīng)的代碼片段即為克隆代碼。該方法能獲得程序的語義信息,可以處理順序被打亂的克隆代碼,但建立程序依賴圖和尋找同構(gòu)子圖代價(jià)太高,很難應(yīng)用在中大規(guī)模軟件。Roy等人[9]基于文本檢測的方法,同時(shí)集成了源代碼轉(zhuǎn)化、敏捷語法分析等技術(shù),開發(fā)了一款克隆檢測工具NiCad,該工具能檢測C、Java等主流開發(fā)語言的Type-1、Type-2、Type-3克隆代碼,并且具有較高的查全率和查準(zhǔn)率,時(shí)空復(fù)雜度較低。更多關(guān)于克隆代碼檢測研究可參見綜述性文獻(xiàn)[10-12]。

    2.3 克隆跟蹤及演化模式

    克隆檢測結(jié)果僅僅提供了克隆代碼的位置及克隆關(guān)系,克隆代碼跟蹤可以提供克隆代碼在版本迭代過程中變化的線索,克隆演化模式可以體現(xiàn)克隆代碼的變化特點(diǎn)。利用演化模式研究克隆變化,受到了學(xué)者的廣泛關(guān)注。

    Kim等人[13]首次提出克隆譜系的概念,并利用版本管理工具中的修改日志信息,推算版本間的變化,實(shí)現(xiàn)克隆跟蹤,并且定義了六種克隆群演化模式描述相鄰版本克隆代碼變化情況,分別是:無變化、增加、去除、一致變化、不一致變化和位移演化模式。但是他們只對第一版本進(jìn)行克隆檢測,不能分析后期版本新產(chǎn)生的克隆,并且定義的演化模式不分視角,區(qū)分不明確。Saha等人[14]首先進(jìn)行函數(shù)映射,在此基礎(chǔ)上再進(jìn)行克隆映射,最終實(shí)現(xiàn)克隆代碼跟蹤,研究開發(fā)了一款克隆譜系提取工具gCad,并將克隆譜系分為活譜系、死亡譜系、句法相似譜系、一致變化譜系四種類型,并且分析了它們所占的比例。但是如果函數(shù)重命名或者被移動(dòng),將影響克隆跟蹤效果。Bakota[15]使用基于抽象語法樹的克隆檢測工具從每款軟件中提取克隆代碼,然后結(jié)合文件名、位置信息等度量實(shí)現(xiàn)相鄰版本克隆片段映射,并且研究了四種不同的克隆片段演化模式,包括:消失克隆、發(fā)生克隆、移動(dòng)克隆、遷移克隆。但是大規(guī)模軟件中克隆片段數(shù)量較多,時(shí)間復(fù)雜度過大,并且如果演化過程中發(fā)生文件重命名或克隆漂移,將導(dǎo)致克隆片段映射失敗。慈萌等人[16]改進(jìn)克隆區(qū)域描述符(CRD)實(shí)現(xiàn)相鄰版本克隆映射,然后使用二元關(guān)系合成克隆譜系,最終實(shí)現(xiàn)在多版本跟蹤克隆。但是如果代碼某些部分被修改,將導(dǎo)致CRD失效,影響克隆跟蹤。G?de等人[17]利用增量算法將克隆檢測和克隆映射相結(jié)合實(shí)現(xiàn)克隆跟蹤,雖然時(shí)間復(fù)雜度和空間復(fù)雜度都很低,但是不能將后期版本中新產(chǎn)生的克隆群包含進(jìn)來。Barbour等人[18]以克隆對為單位開展了后期演化模式的研究,根據(jù)克隆對分離、合并過程中克隆片段修改情況將后期演化模式分為八種類型,并分析了它們所占的比例。張久杰等人[19]基于主題信息實(shí)現(xiàn)相鄰版本克隆映射,并在克隆群生存視角和克隆片段數(shù)量視角研究九種短期演化模式,發(fā)現(xiàn)超過90%的克隆代碼穩(wěn)定演化,但該研究使用的是軟件的發(fā)布版本,克隆代碼開發(fā)過程中的變化被忽略。更多關(guān)于克隆演化的研究可以參見綜述性文獻(xiàn)[10,20]。

    2.4 總結(jié)

    通過以上對“克隆檢測”、“克隆跟蹤及演化模式”國內(nèi)外研究的分析,可以發(fā)現(xiàn):

    (1)克隆代碼檢測技術(shù)已經(jīng)非常成熟,并且NiCad是一款非常優(yōu)秀的檢測工具。

    (2)克隆代碼跟蹤不夠細(xì)化,大多克隆演化研究都基于發(fā)布版本,忽略了開發(fā)過程中克隆代碼的變化情況。

    (3)克隆跟蹤效果不好,相鄰版本克隆映射時(shí)間復(fù)雜度高或準(zhǔn)確率低。

    (4)克隆演化模式區(qū)分不明確、不分視角,并且大多研究都基于傳統(tǒng)的演化模式定義或研究部分演化模式。

    針對當(dāng)前研究存在的不足,本研究提出一種基于修改日志克隆代碼跟蹤的方法,實(shí)現(xiàn)了更細(xì)致的克隆代碼跟蹤,并分視角識(shí)別了克隆演化模式。創(chuàng)新點(diǎn)包括:基于版本管理資源庫,將每次提交作為一個(gè)小版本,充分考慮每次修改變化;克隆檢測使用NiCad檢測工具檢測每一個(gè)小版本,避免丟失對新增克隆群的研究;相鄰版本基于“克隆群初步映射-克隆片段精準(zhǔn)映射-克隆群映射修正”策略,快速準(zhǔn)確地實(shí)現(xiàn)克隆跟蹤;克隆演化模式識(shí)別分克隆群、克隆片段、克隆代碼內(nèi)容三種視角。

    3 基于修改日志克隆代碼跟蹤及演化模式識(shí)別

    本文提出的基于修改日志克隆代碼跟蹤及演化模式識(shí)別分為五個(gè)步驟:(1)克隆代碼檢測;(2)基于Token編輯距離相似度克隆群映射;(3)基于修改日志克隆片段精準(zhǔn)映射;(4)基于克隆片段映射結(jié)果修正克隆群映射;(5)分視角克隆演化模式識(shí)別。整個(gè)方法的工作流程如圖2所示。

    圖2 整體工作流程圖

    3.1 克隆代碼檢測

    克隆代碼檢測是研究克隆的基礎(chǔ)工作,并且克隆檢測結(jié)果直接影響后期克隆跟蹤、演化模式識(shí)別等研究,所以本研究使用目前較成熟的克隆檢測工具NiCad進(jìn)行克隆檢測。NiCad檢測工具是由Queen’s University開發(fā)的克隆檢測工具,適用于C、java等主流開發(fā)語言,能夠檢測Type-1、Type-2、Type-3的克隆代碼,具有較高的查全率和查準(zhǔn)率,而且時(shí)空復(fù)雜度很低。NiCad檢測工具可以設(shè)置functions和blocks兩種粒度進(jìn)行克隆檢測,由于blocks更具一般性,因此本研究將檢測粒度設(shè)為blocks,其他設(shè)置還有rename為blind,threshold為0.3。

    3.2 基于Token編輯距離相似度克隆群映射

    克隆群是克隆片段的集合,對于Type1、Type2類型克隆,同一個(gè)克隆群內(nèi)所有克隆片段的Token串完全相同;對于Type3類型克隆,同一克隆群內(nèi)克隆片段的Token串之間也只是包含少量的增加、刪除或修改。本研究使用任意一個(gè)克隆片段的Token串代替其所在的克隆群,將克隆群映射轉(zhuǎn)化成Token串相似問題。通過計(jì)算Token串編輯距離相似度,實(shí)現(xiàn)克隆群映射。

    首先,將克隆群中一個(gè)克隆片段源碼Token化。本研究參考了前期研究中Token化方法[21],又考慮了克隆代碼類型定義、程序語言特征及源碼完整性,制定Token化規(guī)則主要包括:(1)去掉源碼中的空白符、注釋等非代碼部分;(2)關(guān)鍵字(除int、float等基本數(shù)據(jù)類型)替換成其大寫字母,例如if用I替換、For用F替換;(3)所有變量及數(shù)據(jù)類型用V替換;(4)浮點(diǎn)數(shù)、整數(shù)等數(shù)字使用D替換;(5)保留基本符號(hào),例如{、}、=、(、)。

    然后,計(jì)算Token串編輯距離相似度。公式(1)描述了計(jì)算Token串T1、T2編輯距離相似度的具體方法,其中 Levenshtein(T1,T2)表示 T1、T2的編輯距離,|T1|、|T2|分別表示T1、T2的長度。

    相鄰版本的兩個(gè)克隆群,計(jì)算它們的相似度Token-Similarity,值越大表示它們的相似度越高,它們之間存在映射關(guān)系的可能性越高;值越小表示它們的相似度越低,它們之間存在映射關(guān)系的可能性越低。本研究根據(jù)實(shí)驗(yàn)結(jié)果分析設(shè)定閾值為0.6,當(dāng)兩個(gè)克隆群的相似度TokenSimilarity大于等于0.6時(shí),將這兩個(gè)克隆群建立映射關(guān)系,加入到克隆群映射候選集合。

    3.3 基于修改日志克隆片段映射

    在克隆群映射的基礎(chǔ)上,結(jié)合版本修改日志實(shí)現(xiàn)克隆片段映射,既不會(huì)丟失克隆跟蹤信息,又減少了無關(guān)克隆片段匹配,大大提高了映射速度。

    版本V(i)經(jīng)過一次commit,修改了部分代碼,演變成版本V(i+1),本研究使用正則表達(dá)式從修改日志中提取代碼變化情況,作為計(jì)算版本V(i)的克隆片段在版本V(i+1)中位置區(qū)域的依據(jù)。表1是jabref軟件的一次版本提交(commitid:11e4d9c)引起的代碼位置變化情況,例如第一條變化記錄“文件路徑:/src/…/JabRef-Preferences.java、代碼范圍:48~53、對應(yīng)范圍:48~54、行增加數(shù):1”表示文件/src/…/JabRefPreferences.java的48~53行進(jìn)行了修改與下一版本的48~54行相對應(yīng),有1行的增加。代碼范圍為“0~0”表示該文件是此次提交新增文件,對應(yīng)范圍為“0~0”表示該文件被刪除。

    表1 commit引起的代碼位置變化示例

    算法1位置區(qū)域起始行計(jì)算算法

    函數(shù)功能:計(jì)算克隆片段在后期版本中位置區(qū)域的起始行

    輸入?yún)?shù):克隆片段、同文件代碼位置變化列表

    輸出參數(shù):克隆片段在后期版本中位置區(qū)域的起始行

    算法2位置區(qū)域結(jié)束行計(jì)算算法

    函數(shù)功能:計(jì)算克隆片段在后期版本中位置區(qū)域的結(jié)束行

    輸入?yún)?shù):克隆片段、同文件代碼位置變化列表

    輸出參數(shù):克隆片段在后期版本中位置區(qū)域的結(jié)束行

    對于版本V(i)中克隆群CG的一個(gè)克隆片段CF,在相鄰后期版本V(i+1)中尋找映射克隆片段的過程如下:首先將版本V(i+1)中與克隆群CG存在映射關(guān)系的所有克隆群組成集合mappingCGSet。如果克隆群集合mappingCGSet為空,代表克隆群CG在下一版本消失,克隆片段CF在版本V(i+1)中自然不存在映射對象,結(jié)束程序。如果克隆群集合mappingCGSet不為空,那么使用修改日志信息計(jì)算克隆片段CF在版本V(i+1)中的位置區(qū)域,如算法1和算法2所示分別計(jì)算得到起始行和結(jié)束行。然后將mappingCGSet中所有克隆群包含的克隆片段匯集成候選克隆片段集合candidateCFSet。最后計(jì)算candidateCFSet中與CF同文件路徑的克隆代碼位置和CF在版本V(i+1)中位置區(qū)域的位置重疊率,找出最優(yōu)匹配的映射克隆片段。當(dāng)位置重疊率相同時(shí),與CF的代碼編輯距離最小的勝出。位置重疊率計(jì)算如公式(2)所示,其中candCF.s、candCF.e分別表示候選克隆片段的起始行、結(jié)束行,CF.mbs、CF.mbe分別表示CF在版本V(i+1)的位置區(qū)域的起始行、結(jié)束行。

    本研究使用算法1和算法2根據(jù)版本修改日志計(jì)算克隆片段CF在下一版本位置區(qū)域時(shí),將位置區(qū)域的范圍盡可能小地?cái)U(kuò)大,例如,假設(shè)一個(gè)克隆片段文件路徑為/src/…/TablePrefsTab.java,起始行為20,結(jié)束行為35,由于20大于19且小于25,那么起始行的可能位置為20+8=28;由于35大于等于25且小于等于36,那么結(jié)束行的可能位置為55,最終根據(jù)Argorithm 1得到該克隆片段在后期版本的位置區(qū)域是[28行,55行]。如果克隆片段CF在版本V(i+1)中沒有邊緣擴(kuò)展,那么由CF演變而來的克隆片段必定在計(jì)算的可能位置之內(nèi),使用公式(2)可以算得位置重疊率為1.0。并且本研究所采用的方法對于克隆片段并沒有修改,但因其上下文代碼修改發(fā)生位置偏移的現(xiàn)象,仍然可以以重疊率為1.0的相似度找到其演化克隆片段。經(jīng)過千余版本實(shí)驗(yàn),人工驗(yàn)證并未發(fā)現(xiàn)一例克隆片段邊緣擴(kuò)展,因此本研究不考慮克隆片段邊緣擴(kuò)展現(xiàn)象,將位置重疊率閾值設(shè)為1.0,當(dāng)最優(yōu)匹配克隆片段位置重疊率等于1.0時(shí),才建立克隆片段映射。

    3.4 基于克隆片段映射結(jié)果修正克隆群映射

    相鄰版本克隆映射的準(zhǔn)確性直接決定克隆跟蹤的效果,也是克隆演化模式識(shí)別的基礎(chǔ)。相鄰版本克隆映射包括克隆群映射和克隆片段映射。傳統(tǒng)的相鄰版本克隆映射都是先進(jìn)行克隆群映射,再進(jìn)行克隆片段映射,而克隆群映射有兩種方法:第一種,相鄰版本克隆群兩兩計(jì)算相似度,結(jié)果在閾值范圍之內(nèi)就建立克隆群映射;第二種,相鄰版本中前期版本的克隆群在后期找一個(gè)最相似的克隆群建立映射,其他克隆群不再考慮。但是傳統(tǒng)的克隆群映射方法都存在弊端,使得最終得到的克隆映射結(jié)果不理想。第一種方法對于克隆群發(fā)生分離,后期獨(dú)立演化的情況,由于分離出的克隆群也極其相似,可能會(huì)出現(xiàn)多余克隆群映射,即雖然從克隆群角度分析極其相似,但兩個(gè)克隆群包含的克隆片段卻不存在映射關(guān)系;第二種方法對于克隆群分離的情況不能處理,即前后版本克隆群真實(shí)映射出現(xiàn)1∶n(n>1)的情況,此方法只能將前期版本克隆群與后期版本一個(gè)克隆群建立映射關(guān)系,丟失映射信息。

    圖3展示了傳統(tǒng)克隆群映射結(jié)果與真實(shí)克隆映射的對比,由于克隆群B、C、D、E均來源于克隆群A,四個(gè)克隆群非常相似,在版本V(i+1)與版本V(i+2)進(jìn)行克隆群映射時(shí),按照傳統(tǒng)克隆群映射方法一,會(huì)出現(xiàn)克隆群B與克隆群E、克隆群C與克隆群D的錯(cuò)誤映射;從版本V(i)演化到版本V(i+1)過程中克隆群A分離成兩個(gè)克隆群B和C,按照傳統(tǒng)克隆群映射方法二,在版本V(i+1)中只選擇最相似的克隆群B與克隆群A建立映射,漏掉克隆群A與克隆群C的映射。

    圖3 傳統(tǒng)克隆群映射結(jié)果與真實(shí)克隆映射對比

    鑒于克隆群粒度太大,本研究以克隆片段映射為基準(zhǔn),根據(jù)版本修改日志進(jìn)行克隆片段精確映射??紤]到軟件中克隆片段數(shù)量太多,首先采用傳統(tǒng)克隆群映射方法一構(gòu)造克隆群映射候選集合,在此基礎(chǔ)上進(jìn)行細(xì)致克隆片段映射,最終根據(jù)克隆片段映射結(jié)果修正克隆群映射,即檢查有映射關(guān)系的克隆群包含的克隆片段是否存在映射,如果映射的克隆群包含的克隆片段沒有任何關(guān)系,將取消克隆群的映射。

    3.5 分視角識(shí)別克隆演化模式

    克隆代碼演化模式可用于研究克隆代碼在相鄰版本迭代過程中演變特點(diǎn),幫助開發(fā)人員及時(shí)了解克隆代碼動(dòng)態(tài)變化規(guī)律?;谝延醒芯恐醒莼J阶R(shí)別方法復(fù)雜、演化模式分類不清晰、模式識(shí)別不全面等問題,本研究在相鄰版本克隆映射的基礎(chǔ)上分三種視角進(jìn)行克隆代碼演化模式識(shí)別,并將演化模式以標(biāo)簽的形式標(biāo)記在前期版本克隆群上。三種視角分別是:克隆群視角、克隆片段視角、克隆代碼內(nèi)容視角。

    3.5.1 克隆群視角短期演化模式識(shí)別

    根據(jù)相鄰版本具有映射關(guān)系克隆群數(shù)量比例及交叉程度,從克隆群角度識(shí)別克隆演化模式,可以分為六種演化模式(如圖4所示)。

    圖4 克隆群視角短期演化模式

    新生演化模式:版本V(i)與版本V(i+1)之間具有映射關(guān)系的克隆群數(shù)量之比為0∶1,即版本V(i+1)中有新克隆群產(chǎn)生。

    死亡演化模式:版本V(i)與版本V(i+1)之間具有映射關(guān)系的克隆群數(shù)量之比為1∶0,即版本V(i+1)中有克隆群消失。

    成長演化模式:版本V(i)與版本V(i+1)之間具有映射關(guān)系的克隆群數(shù)量之比為1∶1。

    分離演化模式:版本V(i)與版本V(i+1)之間具有映射關(guān)系的克隆群數(shù)量之比為1∶n(n>1)。

    合并演化模式:版本V(i)與版本V(i+1)之間具有映射關(guān)系的克隆群數(shù)量之比m∶1(m>1)。

    復(fù)雜演化模式:版本V(i)與版本V(i+1)之間具有映射關(guān)系的克隆群數(shù)量之比m∶n(m>1且n>1)。

    為了方便演化模式存儲(chǔ),將演化模式以標(biāo)簽的形式標(biāo)注在前期版本克隆群上,且新生模式是一個(gè)克隆群從無到有,并不包含其修改變化信息,本研究不予考慮,只標(biāo)注死亡、成長、分離、合并、復(fù)雜五種演化模式。對版本V(i)中的克隆群CG從克隆群角度識(shí)別短期演化模式,添加群標(biāo)簽步驟如下:

    第一步:如果克隆群CG無后繼,即版本V(i)迭代到版本V(i+1)過程中由于修改或刪除使得克隆群CG不再存在,發(fā)生了死亡模式,則為克隆群CG添加“死亡”標(biāo)簽。

    第二步:如果克隆群CG只有一個(gè)后繼,并且該后繼克隆群只有一個(gè)前驅(qū)(肯定是克隆群CG),那么發(fā)生成長模式,則為克隆群CG添加“成長”標(biāo)簽。

    第三步:如果克隆群CG存在多個(gè)后繼,但是所有的后繼克隆群都只有一個(gè)前驅(qū)(肯定是克隆群CG),那么發(fā)生分離模式,則為克隆群CG添加“分離”標(biāo)簽。

    第四步:如果克隆群CG只有一個(gè)后繼,并且該后繼克隆群有多個(gè)前驅(qū)(即除了克隆群CG還有其他克隆群),但是所有前驅(qū)克隆群都只有一個(gè)后繼(肯定是克隆群CG的后繼),那么發(fā)生合并模式,則為克隆群CG添加“合并”標(biāo)簽。

    第五步:如果經(jīng)過前四步克隆群CG依然沒被標(biāo)注,那么發(fā)生了復(fù)雜模式,則為克隆群CG添加“復(fù)雜”標(biāo)簽。

    3.5.2 克隆片段視角短期演化模式識(shí)別

    根據(jù)相鄰版本迭代過程中克隆片段延續(xù)性,從克隆片段角度識(shí)別短期演化模式,可以分為三種演化模式(如圖5所示)。

    圖5 克隆片段視角短期演化模式

    去除演化模式:版本V(i)到版本V(i+1)的過程中,版本V(i)的克隆群中包含無后繼的克隆片段。

    新增演化模式:版本V(i)到版本V(i+1)的過程中,版本V(i+1)的克隆群中包含無前驅(qū)的克隆片段。

    保持演化模式:版本V(i)到版本V(i+1)的過程中,版本V(i)的克隆群包含的所有克隆片段都有后繼,版本V(i+1)的克隆群包含的所有克隆片段都有前驅(qū)。

    克隆片段視角分析克隆演化模式,實(shí)際就是將克隆片段演化規(guī)律標(biāo)注在其所在的克隆群上。因此片段標(biāo)簽與群標(biāo)簽不同,一個(gè)克隆群上可能同時(shí)出現(xiàn)兩個(gè)片段標(biāo)簽,例如,一個(gè)克隆群在演化過程中刪除了一個(gè)克隆片段同時(shí)在其他地方又新增一個(gè)克隆片段,這種情況更應(yīng)該值得關(guān)注。對版本V(i)中的克隆群CG從克隆片段角度識(shí)別短期演化模式,添加片段標(biāo)簽步驟如下:

    第一步:如果克隆群CG包含的克隆片段存在一個(gè)無后繼的,即版本V(i)迭代到版本V(i+1)過程中一個(gè)克隆片段從克隆群CG中消失。那么發(fā)生了去除模式,為克隆群CG添加“去除”標(biāo)簽。

    第二步:如果版本V(i+1)中與克隆群CG有映射關(guān)系的克隆群包含無前驅(qū)的克隆片段,那么該克隆片段為新增的,發(fā)生了新增模式,為克隆群CG添加“新增”標(biāo)簽。

    第三步:如果經(jīng)過前兩步克隆群CG沒有被標(biāo)注“去除”、“新增”標(biāo)簽,那么它包含的所有克隆片段都被完好地保持了下來,為克隆群CG添加“保持”模式。

    3.5.3 克隆代碼內(nèi)容視角短期演化模式識(shí)別

    根據(jù)克隆代碼修改影響,從克隆代碼內(nèi)容角度識(shí)別短期演化模式,可以分為三種演化模式(如圖6所示)。

    圖6 克隆代碼內(nèi)容視角短期演化模式

    無變化演化模式:版本V(i)到版本V(i+1)的過程中,克隆群中包含的克隆片段均無變化。

    一致變化演化模式:版本V(i)到版本V(i+1)的過程中,克隆群中包含的克隆片段有變化,但所有克隆片段仍在一個(gè)克隆群中。

    不一致變化演化模式:版本V(i)到版本V(i+1)的過程中,克隆群中包含的克隆片段有變化,克隆片段不完全在同一個(gè)克隆群中。

    克隆代碼內(nèi)容視角分析克隆演化模式,主要考察克隆群包含的克隆片段是否被修改,被修改之后引起什么影響,同在一個(gè)克隆群的克隆代碼經(jīng)過修改之后是否還在同一克隆群中。對版本V(i)中的克隆群CG從克隆代碼內(nèi)容角度識(shí)別短期演化模式,添加內(nèi)容標(biāo)簽步驟如下:

    第一步:如果克隆群CG包含的所有克隆片段均未被修改,那么為克隆群CG添加“無變化”標(biāo)簽。

    第二步:如果克隆群CG包含的克隆片段有修改,但是在版本V(i+1)中依舊保持在同一個(gè)克隆群中,那么為克隆群CG添加“一致變化”標(biāo)簽。

    第三步:如果克隆群CG包含的克隆片段有修改,并且克隆群CG包含的克隆片段在后期版本V(i+1)中不再屬于同一個(gè)克隆群,那么為克隆群CG添加“不一致變化”標(biāo)簽。

    4 實(shí)驗(yàn)與分析

    4.1 實(shí)驗(yàn)數(shù)據(jù)

    本研究選取的6款開源軟件分別是jabref、make、nginx、ant、freecol、argouml,這些軟件的基本信息見表2所示。

    表2 實(shí)驗(yàn)軟件基本信息

    4.2 評價(jià)方法

    為了驗(yàn)證本研究中關(guān)鍵參數(shù)選取及克隆映射同類實(shí)驗(yàn)對比的有效性,采用人工驗(yàn)證的方法從查準(zhǔn)率、查全率、F 值三方面進(jìn)行衡量。如公式(3)、(4)、(5)所示,其中TT表示識(shí)別的正確映射的數(shù)量,(TT+TF)表示識(shí)別的所有映射的數(shù)量,(TT+FT)表示實(shí)際存在的映射的數(shù)量。precision表示查準(zhǔn)率,recall表示查全率,F(xiàn)-Measure表示F值。

    4.3 關(guān)鍵參數(shù)選取

    本研究實(shí)現(xiàn)克隆映射,基于“克隆群初步映射-克隆片段精準(zhǔn)映射-克隆群映射結(jié)果修正”策略,因此克隆群初步映射的結(jié)果直接影響最終克隆映射的效果??寺∪撼醪接成鋾r(shí),如果Token編輯距離相似度閾值設(shè)置過大,會(huì)丟失部分克隆群映射,導(dǎo)致克隆跟蹤間斷,影響克隆的分析結(jié)果;如果Token編輯距離相似度閾值設(shè)置過小,會(huì)使得克隆群映射候選集合過大,不能達(dá)到提高克隆映射速度的目的。

    通過對表3中四款軟件開展相鄰版本克隆群映射實(shí)驗(yàn),得到如圖7所示選取不同的Token編輯距離相似度閾值時(shí)克隆群映射查準(zhǔn)率、查全率的變化情況,分析發(fā)現(xiàn):(1)Token編輯距離相似度閾值在0.4到0.7的變化過程中克隆群映射查準(zhǔn)率有顯著提升;(2)克隆群映射查全率幾乎全為1.0,Token編輯距離相似度閾值變化對其影響不大??紤]到研究版本的細(xì)化程度,相鄰版本間克隆代碼變化可能很小,而選取的代表克隆群的克隆片段可能是同一個(gè)并且?guī)缀跷窗l(fā)生變化,因此出現(xiàn)Token編輯距離相似度閾值變化而克隆群映射查全率始終為1.0的現(xiàn)象。但是在版本演化過程中,可能出現(xiàn)克隆片段被刪除,代表克隆群的克隆片段換成了其他克隆片段等情況?;诖耍狙芯拷y(tǒng)計(jì)每個(gè)版本中同一個(gè)克隆群所包含的克隆片段之間的最低Token編輯距離相似度,得到同克隆群內(nèi)克隆片段之間最低Token編輯距離相似度分布如表4所示。通過對表4分析,可以發(fā)現(xiàn):(1)同克隆群內(nèi)Token編輯距離相似度最低值全部大于等于0.6;(2)同克隆群內(nèi)Token編輯距離相似度最低值大于等于0.7的超過85%。綜合考慮圖7和表4的統(tǒng)計(jì)數(shù)據(jù),在保證克隆群映射查全率為1.0的情況下,盡可能減小克隆群映射候選集合,整體提升相鄰版本克隆映射速度,將Token編輯距離相似度閾值設(shè)置為0.6。

    表3 閾值選取實(shí)驗(yàn)軟件信息

    圖7 克隆群映射查準(zhǔn)率、查全率隨Token編輯距離相似度閾值變化情況

    表4 同克隆群內(nèi)克隆片段之間相似度分布

    4.4 同類實(shí)驗(yàn)對比分析

    目前已有不少克隆跟蹤工具被開發(fā),其中Saha等人開發(fā)的克隆譜系提取工具gCad影響力最大。鑒于本研究與gCad識(shí)別的演化模式不完全一致,僅對克隆映射做對比實(shí)驗(yàn)。其中檢測階段都使用NiCad且參數(shù)設(shè)置相同,實(shí)驗(yàn)平臺(tái)同為操作系統(tǒng)Ubuntu14.04 64位,內(nèi)存4 GB,CPU 2核。選取的實(shí)驗(yàn)軟件分別是ant、freecol、openssh,版本信息如表5所示。

    表5 相鄰版本克隆映射對比實(shí)驗(yàn)軟件信息

    通過對比實(shí)驗(yàn),配合人工驗(yàn)證,結(jié)果如表6所示。從映射結(jié)果分析,ant軟件相鄰版本克隆映射,OurTool和gCad的查全率都是100%,但是由于克隆檢測結(jié)果中存在兩個(gè)克隆群非常相似,導(dǎo)致gCad的結(jié)果中存在錯(cuò)誤映射,查準(zhǔn)率降低,而OurTool基于修改日志信息,避免了錯(cuò)誤映射。freecol軟件相鄰版本克隆映射,OurTool依然完美地完成映射,而gCad的結(jié)果中出現(xiàn)了錯(cuò)亂映射,導(dǎo)致查全率、查準(zhǔn)率都有所降低。openssh軟件選取的相鄰版本克隆檢測結(jié)果一致,對比克隆檢測結(jié)果和修改日志發(fā)現(xiàn)克隆代碼并沒有發(fā)生任何修改,OurTool和gCad都非常好地完成了相鄰版本克隆映射。從時(shí)間分析,在三款軟件上,OurTool的速度都要快于gCad,而且克隆群數(shù)量越多,效果越明顯。綜上OurTool的查全率、查準(zhǔn)率、F值明顯高于gCad,而且運(yùn)行時(shí)間也較短。

    表6 相鄰版本克隆映射同類實(shí)驗(yàn)結(jié)果對比

    4.5 實(shí)驗(yàn)結(jié)果及分析

    本研究在6款開源軟件近8 000個(gè)版本進(jìn)行了克隆代碼跟蹤實(shí)驗(yàn)。下面給出克隆代碼各演化模式的統(tǒng)計(jì)數(shù)據(jù),并進(jìn)行簡要分析。

    表7是在克隆群視角對克隆演化模式的統(tǒng)計(jì)結(jié)果,可以發(fā)現(xiàn):(1)克隆代碼在相鄰版本間幾乎都是以成長模式演化的(比重均超過98%)。(2)死亡模式所占的比重均小于2%,發(fā)生死亡模式的這些克隆代碼在軟件開發(fā)過程中可能被刪除或者大幅度修改,導(dǎo)致不再具備克隆關(guān)系。(3)分離模式、合并模式、復(fù)雜模式所占的比例小于等于0.01%,甚至有的演化模式在開發(fā)過程中并不出現(xiàn),雖然這些演化模式發(fā)生得很少,但由于其不“規(guī)矩”,可能與Bugs有關(guān),更應(yīng)該值得關(guān)注。

    表7 克隆群視角短期演化模式統(tǒng)計(jì)結(jié)果 %

    表8是在克隆片段視角對克隆演化模式的統(tǒng)計(jì)結(jié)果,去除模式指僅發(fā)生了去除,新增模式指僅發(fā)生了新增,不包含去除新增同時(shí)發(fā)生時(shí)的數(shù)據(jù)。分析表8中數(shù)據(jù)可以發(fā)現(xiàn):(1)保持模式占的比例均超過97%。(2)去除模式、新增模式、去除&新增模式的比例都不高,并且去除模式遠(yuǎn)遠(yuǎn)多于其他兩種,去除新增同時(shí)發(fā)生的情況也比僅新增模式略多。說明克隆片段在版本迭代過程中也幾乎都被保留了下來,并且克隆代碼被再次重用得并不多,反而在演化過程中被修改失去克隆關(guān)系的占一定比例。

    表8 克隆片段視角短期演化模式統(tǒng)計(jì)結(jié)果%

    表9是在克隆代碼內(nèi)容視角對克隆演化模式的統(tǒng)計(jì)結(jié)果,可以發(fā)現(xiàn):(1)超過98%的克隆代碼在版本迭代過程中均未發(fā)生修改。(2)發(fā)生一致變化模式和不一致變化模式的克隆代碼占比均不高于2%,并且一致變化模式的比例略多于不一致變化的比例。

    表9 克隆代碼視角短期演化模式統(tǒng)計(jì)結(jié)果%

    5 結(jié)語

    本研究提出一種基于修改日志克隆代碼跟蹤方法,并分視角識(shí)別克隆演化模式,分析了各模式所占比例。發(fā)現(xiàn)超過97%的克隆穩(wěn)定演化,分離演化模式、合并演化模式、復(fù)雜演化模式均不超過0.01%,一致變化演化模式、不一致變化演化模式均不超過2%。并且在多款軟件上與領(lǐng)域內(nèi)較優(yōu)秀的同類工具gCad做對比實(shí)驗(yàn),結(jié)果查全率(提高了2%)、查準(zhǔn)率(提高了2%)明顯高于gCad,而且同環(huán)境下速度比gCad快。本文的研究內(nèi)容與實(shí)驗(yàn)仍然存在一些不足之處,例如演化模式以克隆群為粒度太粗。本文在后續(xù)研究中陸續(xù)改進(jìn)、完善不足之處,以克隆對為粒度分析克隆演化。

    參考文獻(xiàn):

    [1]Alkhatib G.The maintenance problem of application software:An empirical analysis[J].Journal of Software Maintenance Research&Practice,1992,4(2):83-104.

    [2]Zibran M F,Saha R K,Asaduzzaman M,et al.Analyzing and forecasting near-miss clones in evolving software:An empirical study[C]//IEEE International Conference on Engineering of Complex Computer Systems,2011:295-304.

    [3]Roy C K.Detection and analysis of near-miss software clones[C]//IEEE International Conference on Software Maintenance,2009:447-450.

    [4]D·張,S·卡恩,黨映農(nóng),等.代碼克隆通知以及體系結(jié)構(gòu)改變可視化:CN,CN 102681835 A[P].2012.

    [5]Johnson J H.Identifying redundancy in source code using fingerprints[C]//Conference of the Centre for Advanced Studies on Collaborative Research,Toronto,Ontario,Canada,1993:171-183.

    [6]Baker B S.On finding duplication and near-duplication in large software systems[C]//Proceedings of 2nd Working Conference on Reverse Engineering,1995:86-95.

    [7]Baxter I D,Yahin A,Moura L,et al.Clone detection using abstract syntax trees[C]//International Conference on Software Maintenance,1998:368-377.

    [8]Krinke J.Identifying similar code with program dependence graphs[C]//Eighth Working Conference on Reverse Engineering,2001:301-309.

    [9]Cordy J R,Roy C K.The NiCad clone detector[C]//The IEEE International Conference on Program Comprehension,ICPC 2011,2011:219-220.

    [10]史慶慶,孟繁軍,張麗萍,等.克隆代碼技術(shù)研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2013,30(6):1617-1623.

    [11]Koschke R.Survey of research on software clones[C]//Proc Duplication Redundancy&Similarity in Software,2006.

    [12]曹羽中,金茂忠,劉超.克隆代碼檢測技術(shù)綜述[C]//中國計(jì)算機(jī)學(xué)會(huì)軟件工程專委會(huì)2006年年會(huì),2006.

    [13]Kim M,Sazawal V,Notkin D,et al.An empirical study of code clone genealogies[J].Acm Sigsoft Software Engineering Notes,2005,30(5):187-196.

    [14]Saha R K,Roy C K,Schneider K A.gCad:A near-miss clone genealogy extractor to support clone evolution analysis[C]//IEEE International Conference on Software Maintenance,2013:488-491.

    [15]Bakota T.Tracking the evolution of code clones[C]//Sofsem 2011:Theory and Practice of Computer Science,Conference on Current Trends in Theory and Practice of Computer Science,Novy Smokovec,Slovakia,January 22-28,2011:86-98.

    [16]Meng C,Su X H,Wang T T,et al.A new clone group mapping algorithm for extracting clone genealogy on multi-version software[C]//Third International Conference on Instrumentation,Measurement,Computer,Communication and Control,2013:848-853.

    [17]G?de N,Koschke R.Studying clone evolution using incremental clone detection[J].Journal of Software Evolution&Process,2013,25(2):165-192.

    [18]Barbour L,Khomh F,Zou Y.Late propagation in software clones[C]//IEEE International Conference on Software Maintenance,2011:273-282.

    [19]張久杰,翟曄,王春暉,等.基于版本間克隆映射的演化模式識(shí)別及譜系構(gòu)建[J].計(jì)算機(jī)應(yīng)用,2016,36(7):2021-2030.

    [20]Pate J R,Tairas R,Kraft N A.Clone evolution:A systematic review[J].Journal of Software Maintenance&Evolution Research&Practice,2013,25(3):261-283.

    [21]張久杰,王春暉,張麗萍,等.基于Token編輯距離檢測克隆代碼[J].計(jì)算機(jī)應(yīng)用,2015,35(12):3536-3543.

    猜你喜歡
    查全率代碼克隆
    克隆狼
    浙江:誕生首批體細(xì)胞克隆豬
    創(chuàng)世代碼
    創(chuàng)世代碼
    創(chuàng)世代碼
    創(chuàng)世代碼
    海量圖書館檔案信息的快速檢索方法
    基于詞嵌入語義的精準(zhǔn)檢索式構(gòu)建方法
    抗BP5-KLH多克隆抗體的制備及鑒定
    Galectin-7多克隆抗體的制備與鑒定
    91成人精品电影| 纯流量卡能插随身wifi吗| 成人18禁高潮啪啪吃奶动态图| 欧美激情极品国产一区二区三区 | 80岁老熟妇乱子伦牲交| 五月天丁香电影| 最近最新中文字幕免费大全7| 午夜视频国产福利| 色婷婷久久久亚洲欧美| 一本—道久久a久久精品蜜桃钙片| 日韩,欧美,国产一区二区三区| 99热6这里只有精品| 亚洲情色 制服丝袜| 久久99精品国语久久久| 秋霞伦理黄片| 亚洲欧美中文字幕日韩二区| 国产亚洲午夜精品一区二区久久| 国产伦理片在线播放av一区| 国产成人欧美| 毛片一级片免费看久久久久| 黄片播放在线免费| 在线观看免费日韩欧美大片| 欧美激情 高清一区二区三区| 狂野欧美激情性bbbbbb| 国产片内射在线| 大话2 男鬼变身卡| 国产免费又黄又爽又色| 丝袜脚勾引网站| 激情五月婷婷亚洲| 亚洲av中文av极速乱| 欧美老熟妇乱子伦牲交| 免费看av在线观看网站| 国产1区2区3区精品| 精品一区二区免费观看| 亚洲,欧美精品.| 国产精品久久久久久久久免| 久久99热这里只频精品6学生| 亚洲人成77777在线视频| 亚洲成人一二三区av| 在线观看美女被高潮喷水网站| 免费在线观看完整版高清| 天天躁夜夜躁狠狠躁躁| av电影中文网址| 一级片'在线观看视频| 国产极品天堂在线| 深夜精品福利| 欧美亚洲日本最大视频资源| 日本爱情动作片www.在线观看| 寂寞人妻少妇视频99o| 国产av一区二区精品久久| 亚洲四区av| 国产国拍精品亚洲av在线观看| 不卡视频在线观看欧美| 高清毛片免费看| 99九九在线精品视频| 亚洲内射少妇av| 免费观看a级毛片全部| 欧美日韩综合久久久久久| av在线老鸭窝| 最近的中文字幕免费完整| 国产日韩一区二区三区精品不卡| 女人久久www免费人成看片| 久久久国产欧美日韩av| 欧美日韩av久久| 亚洲精品久久午夜乱码| 一本色道久久久久久精品综合| 亚洲欧美成人精品一区二区| 国产精品久久久久久精品古装| av又黄又爽大尺度在线免费看| 久久久国产精品麻豆| 夜夜爽夜夜爽视频| 久久久精品区二区三区| 日韩免费高清中文字幕av| 精品一区在线观看国产| 99热国产这里只有精品6| 午夜福利在线观看免费完整高清在| 久久久a久久爽久久v久久| 国产成人aa在线观看| 亚洲 欧美一区二区三区| 精品一区二区免费观看| 丝袜人妻中文字幕| 久久久久久久久久人人人人人人| 亚洲少妇的诱惑av| 建设人人有责人人尽责人人享有的| 亚洲精品久久午夜乱码| 久久久国产一区二区| 亚洲美女黄色视频免费看| 永久网站在线| 这个男人来自地球电影免费观看 | 亚洲av.av天堂| 交换朋友夫妻互换小说| 国产欧美亚洲国产| 成人综合一区亚洲| 女人被躁到高潮嗷嗷叫费观| 色婷婷久久久亚洲欧美| 国产成人免费无遮挡视频| 久久久国产一区二区| 日韩不卡一区二区三区视频在线| videosex国产| 亚洲人成网站在线观看播放| 久久精品国产鲁丝片午夜精品| av不卡在线播放| 国产综合精华液| 久久久久人妻精品一区果冻| 寂寞人妻少妇视频99o| 人妻一区二区av| 欧美97在线视频| 天天躁夜夜躁狠狠躁躁| 亚洲精品成人av观看孕妇| 男男h啪啪无遮挡| 国产精品免费大片| 国产福利在线免费观看视频| 精品人妻一区二区三区麻豆| 人妻系列 视频| 久久久久人妻精品一区果冻| 久久99蜜桃精品久久| 亚洲第一av免费看| 亚洲精品456在线播放app| 国产精品熟女久久久久浪| 黄色毛片三级朝国网站| 亚洲精品国产色婷婷电影| 亚洲精品乱久久久久久| 欧美bdsm另类| 亚洲av欧美aⅴ国产| videosex国产| 深夜精品福利| 精品人妻在线不人妻| 97在线人人人人妻| 亚洲精品456在线播放app| 亚洲欧美一区二区三区国产| 人妻人人澡人人爽人人| 校园人妻丝袜中文字幕| 一边亲一边摸免费视频| 国产黄色免费在线视频| 国产成人精品久久久久久| 亚洲中文av在线| 赤兔流量卡办理| 老女人水多毛片| 久久久久久久大尺度免费视频| av卡一久久| 国产精品欧美亚洲77777| 日韩大片免费观看网站| 免费播放大片免费观看视频在线观看| 免费女性裸体啪啪无遮挡网站| 青春草视频在线免费观看| 黑人巨大精品欧美一区二区蜜桃 | videosex国产| 久久久久久久久久成人| 80岁老熟妇乱子伦牲交| 在线观看一区二区三区激情| 国产爽快片一区二区三区| 国产69精品久久久久777片| 国产片特级美女逼逼视频| 午夜福利视频精品| 国产精品女同一区二区软件| 精品久久国产蜜桃| 女人精品久久久久毛片| 国产一区二区在线观看日韩| 一区二区三区精品91| 夫妻性生交免费视频一级片| 99国产精品免费福利视频| 精品国产一区二区三区四区第35| 麻豆乱淫一区二区| 春色校园在线视频观看| 日本av手机在线免费观看| 精品久久蜜臀av无| 一区二区av电影网| 亚洲av国产av综合av卡| 国产色婷婷99| 亚洲图色成人| a级毛色黄片| 一级a做视频免费观看| 蜜臀久久99精品久久宅男| 亚洲精华国产精华液的使用体验| 韩国av在线不卡| 国产1区2区3区精品| 久久人人爽av亚洲精品天堂| 国产精品欧美亚洲77777| 观看美女的网站| videossex国产| 啦啦啦啦在线视频资源| 国产精品嫩草影院av在线观看| 女人精品久久久久毛片| 波多野结衣一区麻豆| 这个男人来自地球电影免费观看 | 亚洲精品国产色婷婷电影| 国产欧美另类精品又又久久亚洲欧美| 中文字幕另类日韩欧美亚洲嫩草| 欧美老熟妇乱子伦牲交| 午夜视频国产福利| 青春草视频在线免费观看| 老女人水多毛片| 国产乱人偷精品视频| 欧美老熟妇乱子伦牲交| 考比视频在线观看| 天天影视国产精品| 免费黄频网站在线观看国产| 久久精品国产鲁丝片午夜精品| 夜夜骑夜夜射夜夜干| 成人无遮挡网站| 卡戴珊不雅视频在线播放| 制服人妻中文乱码| 久久ye,这里只有精品| 免费av中文字幕在线| 国产精品三级大全| 五月玫瑰六月丁香| 免费不卡的大黄色大毛片视频在线观看| 免费高清在线观看视频在线观看| 久久久久久久久久久免费av| 久久久久国产网址| 精品人妻熟女毛片av久久网站| 久久久久久久亚洲中文字幕| 免费黄网站久久成人精品| 亚洲国产欧美日韩在线播放| 久久精品久久久久久久性| 侵犯人妻中文字幕一二三四区| 一本久久精品| 卡戴珊不雅视频在线播放| 久久久久久久精品精品| 日本爱情动作片www.在线观看| 欧美另类一区| 色哟哟·www| 777米奇影视久久| 国产欧美另类精品又又久久亚洲欧美| videossex国产| 国产精品久久久久成人av| 日韩制服丝袜自拍偷拍| 伦精品一区二区三区| 久久99蜜桃精品久久| 国产精品欧美亚洲77777| 亚洲婷婷狠狠爱综合网| 一级毛片我不卡| 国产精品熟女久久久久浪| 咕卡用的链子| 亚洲四区av| 91在线精品国自产拍蜜月| 国产欧美日韩综合在线一区二区| 少妇的逼水好多| a级毛色黄片| 久久精品久久精品一区二区三区| 1024视频免费在线观看| 亚洲成av片中文字幕在线观看 | 亚洲欧美成人精品一区二区| 亚洲精品中文字幕在线视频| 99久久综合免费| 亚洲综合色网址| 夫妻午夜视频| 在线观看国产h片| 久久97久久精品| 嫩草影院入口| 婷婷色综合www| 欧美精品亚洲一区二区| 黄网站色视频无遮挡免费观看| 国产精品99久久99久久久不卡 | 成人亚洲欧美一区二区av| 99视频精品全部免费 在线| 你懂的网址亚洲精品在线观看| 亚洲成人av在线免费| 中文字幕人妻丝袜制服| 国产福利在线免费观看视频| 婷婷色麻豆天堂久久| 观看av在线不卡| av免费在线看不卡| 有码 亚洲区| 午夜免费鲁丝| 亚洲高清免费不卡视频| 夜夜骑夜夜射夜夜干| 久久精品夜色国产| 女性被躁到高潮视频| 热re99久久精品国产66热6| 国产爽快片一区二区三区| 亚洲国产毛片av蜜桃av| 18+在线观看网站| 国产一区二区激情短视频 | 国产精品三级大全| 国产高清国产精品国产三级| 高清不卡的av网站| 亚洲欧美清纯卡通| 久久久久精品性色| 丝袜在线中文字幕| 午夜福利视频在线观看免费| av视频免费观看在线观看| 成人午夜精彩视频在线观看| 性高湖久久久久久久久免费观看| 婷婷色麻豆天堂久久| 五月伊人婷婷丁香| 欧美人与性动交α欧美精品济南到 | 男的添女的下面高潮视频| 欧美精品一区二区免费开放| 亚洲国产av影院在线观看| 欧美精品国产亚洲| 制服人妻中文乱码| 丝袜美足系列| 高清欧美精品videossex| 久久久久国产精品人妻一区二区| 大香蕉97超碰在线| 国产69精品久久久久777片| 久久精品国产a三级三级三级| 久久精品国产鲁丝片午夜精品| 久久久久精品人妻al黑| 久久这里只有精品19| 啦啦啦中文免费视频观看日本| 国产精品一国产av| 又大又黄又爽视频免费| 久久人人爽av亚洲精品天堂| 毛片一级片免费看久久久久| 国产色爽女视频免费观看| 亚洲一码二码三码区别大吗| 一级片免费观看大全| 在线观看国产h片| 2021少妇久久久久久久久久久| 丁香六月天网| 成年美女黄网站色视频大全免费| 美女脱内裤让男人舔精品视频| 菩萨蛮人人尽说江南好唐韦庄| 精品久久国产蜜桃| 9热在线视频观看99| 成年人午夜在线观看视频| 国产毛片在线视频| 一区在线观看完整版| 91久久精品国产一区二区三区| 国产老妇伦熟女老妇高清| 日韩在线高清观看一区二区三区| 国产男女超爽视频在线观看| xxx大片免费视频| 日韩 亚洲 欧美在线| 亚洲色图综合在线观看| 各种免费的搞黄视频| 校园人妻丝袜中文字幕| 国产亚洲精品久久久com| 久久久精品区二区三区| 国产高清三级在线| 欧美日本中文国产一区发布| 亚洲av欧美aⅴ国产| 美女主播在线视频| 久久精品久久久久久噜噜老黄| 天天操日日干夜夜撸| 欧美人与性动交α欧美精品济南到 | 国产一区二区在线观看日韩| 国产激情久久老熟女| 亚洲,一卡二卡三卡| 曰老女人黄片| 韩国精品一区二区三区 | 国产精品无大码| 一本色道久久久久久精品综合| 精品一区在线观看国产| 美国免费a级毛片| 中文字幕亚洲精品专区| 免费看不卡的av| 人人妻人人澡人人爽人人夜夜| 国产免费现黄频在线看| 一区二区三区精品91| 九色成人免费人妻av| 亚洲高清免费不卡视频| 久久精品久久久久久久性| 国产淫语在线视频| 国产高清不卡午夜福利| 丝袜人妻中文字幕| 国产国拍精品亚洲av在线观看| 欧美少妇被猛烈插入视频| 精品久久久精品久久久| 国产欧美日韩一区二区三区在线| 内地一区二区视频在线| 久久亚洲国产成人精品v| 午夜福利网站1000一区二区三区| 国产精品国产三级专区第一集| freevideosex欧美| 亚洲国产欧美在线一区| av一本久久久久| 中文乱码字字幕精品一区二区三区| 麻豆乱淫一区二区| 亚洲第一av免费看| 成人亚洲欧美一区二区av| 欧美日韩精品成人综合77777| 菩萨蛮人人尽说江南好唐韦庄| 在线观看国产h片| 国产成人aa在线观看| 亚洲国产毛片av蜜桃av| 久久鲁丝午夜福利片| 伊人亚洲综合成人网| 亚洲精品色激情综合| 91精品伊人久久大香线蕉| 亚洲av综合色区一区| 久久久欧美国产精品| 成人毛片60女人毛片免费| 国产精品秋霞免费鲁丝片| 久久97久久精品| 亚洲精品456在线播放app| 亚洲,欧美精品.| 日韩av不卡免费在线播放| 大片电影免费在线观看免费| 国产激情久久老熟女| 欧美 亚洲 国产 日韩一| tube8黄色片| 国产精品一区二区在线观看99| 免费观看av网站的网址| av片东京热男人的天堂| 久久 成人 亚洲| 蜜桃国产av成人99| 人妻一区二区av| 国产精品偷伦视频观看了| 国产精品一区二区在线不卡| 狂野欧美激情性bbbbbb| h视频一区二区三区| 男的添女的下面高潮视频| 久久人人爽人人爽人人片va| 久久国内精品自在自线图片| 精品亚洲成国产av| 99精国产麻豆久久婷婷| 一级a做视频免费观看| 日日啪夜夜爽| 亚洲成人av在线免费| 亚洲综合色惰| 国语对白做爰xxxⅹ性视频网站| 亚洲精品第二区| 国产午夜精品一二区理论片| 久久99一区二区三区| 亚洲精品乱久久久久久| 一本大道久久a久久精品| av黄色大香蕉| 色网站视频免费| 色吧在线观看| 国产精品久久久久成人av| av在线老鸭窝| 午夜福利在线观看免费完整高清在| 又大又黄又爽视频免费| av在线播放精品| 免费看av在线观看网站| 十八禁网站网址无遮挡| 欧美精品一区二区免费开放| 日韩成人av中文字幕在线观看| 中文字幕亚洲精品专区| 少妇高潮的动态图| 婷婷色综合大香蕉| 在线观看免费高清a一片| av线在线观看网站| 99视频精品全部免费 在线| 国产精品国产三级国产av玫瑰| 国产成人免费无遮挡视频| av线在线观看网站| 亚洲成人av在线免费| 成人国产av品久久久| 精品午夜福利在线看| av女优亚洲男人天堂| 少妇的逼水好多| av播播在线观看一区| 亚洲 欧美一区二区三区| 日韩制服丝袜自拍偷拍| 99视频精品全部免费 在线| 精品久久蜜臀av无| 欧美精品亚洲一区二区| 亚洲欧美成人精品一区二区| 香蕉国产在线看| 亚洲情色 制服丝袜| 国产精品蜜桃在线观看| 精品一品国产午夜福利视频| 精品亚洲成国产av| 满18在线观看网站| 精品一区在线观看国产| 热re99久久精品国产66热6| 黄色配什么色好看| 色婷婷av一区二区三区视频| 久久久久人妻精品一区果冻| 欧美亚洲日本最大视频资源| 黄色一级大片看看| 亚洲av男天堂| 亚洲国产色片| 亚洲国产看品久久| 超色免费av| 久久 成人 亚洲| 国产精品麻豆人妻色哟哟久久| av有码第一页| 亚洲一级一片aⅴ在线观看| 国产精品嫩草影院av在线观看| 欧美精品高潮呻吟av久久| a级毛片在线看网站| 国产精品女同一区二区软件| 中文字幕亚洲精品专区| 国产有黄有色有爽视频| 多毛熟女@视频| 999精品在线视频| av有码第一页| 各种免费的搞黄视频| 51国产日韩欧美| 看免费成人av毛片| 国产白丝娇喘喷水9色精品| 女人精品久久久久毛片| 最近2019中文字幕mv第一页| 日韩成人伦理影院| 欧美bdsm另类| 五月天丁香电影| 伦精品一区二区三区| 少妇被粗大猛烈的视频| 春色校园在线视频观看| 一区二区日韩欧美中文字幕 | 91午夜精品亚洲一区二区三区| 国产亚洲午夜精品一区二区久久| 亚洲人与动物交配视频| 国产欧美亚洲国产| 日韩中文字幕视频在线看片| 国产老妇伦熟女老妇高清| 欧美人与善性xxx| 日本色播在线视频| 99久久精品国产国产毛片| 欧美变态另类bdsm刘玥| 久久久久精品久久久久真实原创| 久久99热这里只频精品6学生| 久久久久久人妻| 欧美精品一区二区大全| 人人澡人人妻人| tube8黄色片| 女人精品久久久久毛片| 亚洲精品国产av蜜桃| 欧美xxⅹ黑人| 视频中文字幕在线观看| 亚洲国产精品国产精品| 日韩av在线免费看完整版不卡| 免费久久久久久久精品成人欧美视频 | 观看美女的网站| 国产亚洲av片在线观看秒播厂| 纵有疾风起免费观看全集完整版| 久久久精品94久久精品| 久久久久久人妻| 亚洲精品乱码久久久久久按摩| 青春草亚洲视频在线观看| 涩涩av久久男人的天堂| 一区二区三区精品91| 夜夜骑夜夜射夜夜干| 尾随美女入室| 久久久久视频综合| 韩国高清视频一区二区三区| 你懂的网址亚洲精品在线观看| 免费久久久久久久精品成人欧美视频 | 王馨瑶露胸无遮挡在线观看| 少妇被粗大的猛进出69影院 | 视频区图区小说| 一二三四在线观看免费中文在 | 在线看a的网站| 亚洲精品av麻豆狂野| 久久久精品免费免费高清| 国产一区二区在线观看av| 国产乱来视频区| 99国产综合亚洲精品| 免费久久久久久久精品成人欧美视频 | 一区二区三区乱码不卡18| 97超碰精品成人国产| 十分钟在线观看高清视频www| 五月天丁香电影| 精品酒店卫生间| 91久久精品国产一区二区三区| 少妇熟女欧美另类| 国产精品久久久久久久电影| 精品少妇久久久久久888优播| 亚洲图色成人| 超色免费av| 色婷婷久久久亚洲欧美| 五月开心婷婷网| 久久热在线av| 久久国产精品男人的天堂亚洲 | 中文字幕精品免费在线观看视频 | 色吧在线观看| 国产精品蜜桃在线观看| 视频在线观看一区二区三区| 精品久久久精品久久久| 亚洲国产日韩一区二区| 伦理电影免费视频| 国产xxxxx性猛交| 人人妻人人澡人人看| 欧美丝袜亚洲另类| 纵有疾风起免费观看全集完整版| 激情五月婷婷亚洲| 丝袜喷水一区| 26uuu在线亚洲综合色| 国产亚洲一区二区精品| av网站免费在线观看视频| 午夜福利影视在线免费观看| av视频免费观看在线观看| 日产精品乱码卡一卡2卡三| 精品一区二区三区视频在线| 免费av不卡在线播放| 综合色丁香网| 亚洲伊人色综图| 国产永久视频网站| 最近手机中文字幕大全| 久久女婷五月综合色啪小说| xxxhd国产人妻xxx| 欧美激情 高清一区二区三区| 你懂的网址亚洲精品在线观看| 两个人看的免费小视频| 久久狼人影院| 亚洲av.av天堂| 国产成人欧美| 成人手机av| a级毛色黄片| 这个男人来自地球电影免费观看 | 夜夜爽夜夜爽视频| 亚洲av男天堂| 亚洲美女搞黄在线观看| 日韩中字成人| 国产亚洲一区二区精品| 婷婷色麻豆天堂久久| 国产 精品1| 人成视频在线观看免费观看| 日本欧美国产在线视频| 一级毛片黄色毛片免费观看视频| 人人妻人人添人人爽欧美一区卜| 日韩电影二区| 又粗又硬又长又爽又黄的视频| 国产成人欧美| 亚洲熟女精品中文字幕| 另类精品久久| 欧美亚洲 丝袜 人妻 在线| 亚洲人与动物交配视频| 大话2 男鬼变身卡| 欧美 亚洲 国产 日韩一|