苍井优一级毛片免费观看,成年网站在线观看,日本一二三不卡视频,日日天天人人夜夜九九

24小時(shí)論文定制熱線(xiàn)

熱門(mén)畢設:土木工程工程造價(jià)橋梁工程計算機javaasp機械機械手夾具單片機工廠(chǎng)供電采礦工程
您當前的位置:論文定制 > 畢業(yè)設計論文 >
快速導航
畢業(yè)論文定制
關(guān)于我們
我們是一家專(zhuān)業(yè)提供高質(zhì)量代做畢業(yè)設計的網(wǎng)站。2002年成立至今為眾多客戶(hù)提供大量畢業(yè)設計、論文定制等服務(wù),贏(yíng)得眾多客戶(hù)好評,因為專(zhuān)注,所以專(zhuān)業(yè)。寫(xiě)作老師大部分由全國211/958等高校的博士及碩士生設計,執筆,目前已為5000余位客戶(hù)解決了論文寫(xiě)作的難題。 秉承以用戶(hù)為中心,為用戶(hù)創(chuàng )造價(jià)值的理念,我站擁有無(wú)縫對接的售后服務(wù)體系,代做畢業(yè)設計完成后有專(zhuān)業(yè)的老師進(jìn)行一對一修改與完善,對有答辯需求的同學(xué)進(jìn)行一對一的輔導,為你順利畢業(yè)保駕護航
代做畢業(yè)設計
常見(jiàn)問(wèn)題

基于Github的Java程序缺陷自動(dòng)修復方法研究

添加時(shí)間:2021/11/19 來(lái)源:未知 作者:樂(lè )楓
軟件缺陷制約軟件產(chǎn)業(yè)發(fā)展,嚴重影響軟件質(zhì)量。探索高效、自動(dòng)的軟件缺陷修復方法是目前軟件工程領(lǐng)域的重要課題之一。深度學(xué)習技術(shù)的發(fā)展和大規模開(kāi)源代碼庫的出現為改進(jìn)傳統基于"生成-驗證"的缺陷修復方法帶來(lái)了可能,正在成為目前研究的熱點(diǎn)方向。
以下為本篇論文正文:

摘要

  軟件缺陷制約軟件產(chǎn)業(yè)發(fā)展,嚴重影響軟件質(zhì)量。探索高效、自動(dòng)的軟件缺陷修復方法是目前軟件工程領(lǐng)域的重要課題之一。深度學(xué)習技術(shù)的發(fā)展和大規模開(kāi)源代碼庫的出現為改進(jìn)傳統基于"生成-驗證"的缺陷修復方法帶來(lái)了可能,正在成為目前研究的熱點(diǎn)方向。

  目前基于深度學(xué)習的缺陷修復方法主要依賴(lài)來(lái)自開(kāi)源代碼庫中的數據集構建模型,盡管與傳統基于手工提取缺陷修復模式的修復方法相比,能夠生成可通過(guò)配套測試用例集的有效補丁,但生成的補丁往往偏離了原始程序的語(yǔ)義,正確性依然有待提升,其主要原因在于:

  (1)因為這些方法使用簡(jiǎn)單的規則從開(kāi)源倉庫中獲取數據,由于開(kāi)源倉庫的多樣性,這種單一的數據篩選方式獲取的訓練數據質(zhì)量低,影響模型的學(xué)習效果;

  (2)現有方法忽略關(guān)注程序中的控制流和數據流信息;

  (3)現有方法在序列化處理源代碼時(shí)粒度單一,并且對其中的用戶(hù)自定義標識符抽象表示,使生成的詞匯表中損失了一部分程序語(yǔ)義信息,影響模型生成補丁的效果。

  本文針對以上問(wèn)題對現有缺陷修復方法進(jìn)行改進(jìn),并提出一種基于深度學(xué)習技術(shù)的缺陷修復解決方案,具體研究?jì)热菘偨Y如下:

  (1)面對開(kāi)源倉庫的數據存在質(zhì)量分布不均衡的挑戰,本文提出了一種基于大規模開(kāi)源倉庫的數據優(yōu)化方法,通過(guò)數據篩選過(guò)程對開(kāi)源倉庫中的數據進(jìn)行提純,并且為了捕獲程序上下文中對缺陷修復有意義的重點(diǎn)特征,構建一種基于程序控制流和數據流的程序切片方法對數據進(jìn)行預處理,提升從開(kāi)源倉庫獲取數據的質(zhì)量。

  (2)提出一種使用編碼器-解碼器結構的程序缺陷修復模型。針對現有方法在源碼序列化過(guò)程中存在粒度單一、損失部分程序信息的問(wèn)題,本文使用基于子詞表示的序列化方法對源碼進(jìn)行處理,盡可能多的保留程序上下文中的用戶(hù)自定義標識符信息。

  再通過(guò)基于局部注意力機制的編碼器-解碼器模型學(xué)習缺陷的修復模式,實(shí)現補丁的自動(dòng)生成。考慮到每種缺陷的修復操作具有相似性,本文通過(guò)構建一個(gè)基于程序抽象語(yǔ)法樹(shù) (Abstract Syntax Tree, AST) 結構特征的缺陷預分類(lèi)模型,為待修復缺陷選擇最匹配的補丁生成模型。

  (3)設計并實(shí)現了一個(gè)基于 Github 的 Java 程序缺陷修復原型系統 VulRepair.

  并且為了驗證 VulRepair 的缺陷修復效果,還設計并實(shí)現了一組評估對比實(shí)驗,從多個(gè)角度評估驗證本文提出的缺陷修復模型和系統。實(shí)驗結果表明,本文提出的缺陷修復方法在基準數據集和來(lái)自開(kāi)源倉庫的數據集上,相比已有的缺陷修復方法,VulRepair 生成的有效補丁和正確補丁數量更多,并且具有修復多行缺陷的潛力。

  關(guān)鍵詞: 自動(dòng)缺陷修復,深度學(xué)習,開(kāi)源倉庫

  ABSTRACT

  Software defects restrict the development of the software industry and seriously affect software quality. Exploring efficient and automatic software defect repair methods is currently one of the important topics in the field of software engineering. The development of deep learning technology and the emergence of large-scale open source repositories bases have brought the possibility to improve the traditional defect repair method based on theG&V technique, and it is becoming a hot research direction at present.

  The current defect repair methods based on deep learning mainly rely on data sets in the open source repositories. Although compared with traditional repair methods based on manually extracting defect repair patterns, they can generate effective patches that can pass a set of matched test cases, but the generated patches usually deviate from the semantics of the original program, and the correctness still needs to be improved. The main reasons are as follows: (1) Because these methods use simple rules to obtain data from open source repositories, due to the persity of open source repositories, the quality of training data obtained by this single data screening method is low, which affects the learning effect of the model; (2) Existing methods ignore the control flow and data flow information in the concerned program; (3) The existing method uses a single granularity when tokenizing the source code, and abstractly expresses the user-defined identifier in it, which loses part of the program semantic information, thus affecting the effect of the model to generate patches.Because of the above problems, this thesis proposes a defect repair solution based on deep learning technology. The specific research content is summarized as follows:

  (1) Facing the challenge of unbalanced quality distribution of data in open source repositories, this thesis proposes a data optimization method based on large-scale open source repositories. The data in the open source repositories is purified through the data filtering process, and in order to capture the program context features that are meaningful for defect repair, construct a program slicing method based on program control flow and data flow to preprocess data and improve the quality of data obtained from open source repositories.

  (2) Propose a program defect repair model using an encoder-decoder structure. Aiming at the problem of single granularity and loss of partial program information in the source code tokenization process of existing methods, this article uses a tokenization method based on subword representation to process the source code, and retain as many user-defined identifiers in the program context as possible. Then, through the encoder-decoder model based on the local attention mechanism, the defect repair mode is learned to realize the automatic generation of patches. Considering the similarity of repair operations for each defect, this thesis constructs a defect pre-classification model based on the structural features of the program abstract syntax tree and selects the most matching patch generation model for the defect to be repaired.

  (3) Designed and implemented a Github-based Java program defect repair prototype system VulRepair. And in order to verify the defect repair effect of VulRepair, a set of evaluation and comparison experiments are also designed and implemented to evaluate and verify the defect repair model and system proposed in this thesis from multiple angles. The experimental results show that the defect repair method proposed in this thesis is based on the benchmark data set and the data set from the open source repositories. Compared with the existing defect repair methods, VulRepair can generate more effective patches and can repair multiple lines of defects.

  Keywords: Automatic program repair, Deep learning, Open source repositories

Java程序缺陷自動(dòng)修復方法

  目錄

  第一章 引言

  本章節首先闡述本文的研究?jì)热荩ㄜ浖毕葑詣?dòng)修復的研究背景和意義,之后通過(guò)梳理該方向的歷史研究進(jìn)程,進(jìn)一步分析當前研究所面臨的局限和主要挑戰。

  最后再針對現有研究中存在的問(wèn)題,給出本文的研究思路,并簡(jiǎn)要介紹本文的研究方法和文章的組織結構。

  1.1 研究背景與意義

  在軟件的開(kāi)發(fā)過(guò)程中,由于需求不明確,設計不合理,開(kāi)發(fā)人員編碼錯誤等各方面原因,不可避免的會(huì )在系統中引入各種各樣的缺陷。這些軟件缺陷隨著(zhù)軟件規模和復雜度的提升,成為限制軟件發(fā)展的重要阻礙,甚至會(huì )被不法攻擊者利用,威脅系統安全,產(chǎn)生難以預計的嚴峻后果。

  由于開(kāi)源平臺快速發(fā)展帶來(lái)的開(kāi)發(fā)便利性,很多開(kāi)發(fā)者直接使用公開(kāi)的開(kāi)源代碼庫進(jìn)行編碼,并且忽略檢查其中的內部流程和具體實(shí)現操作。有關(guān)報告[1]顯示:在 2019年,平均每個(gè)軟件使用了 445 個(gè)開(kāi)源代碼庫,和往年相比平均使用率增長(cháng)了 85%,還指出幾乎所有(99%)被統計的軟件中都使用了開(kāi)源代碼庫,而這些被使用的開(kāi)源代 碼庫中,超過(guò) 75%都含有缺陷。進(jìn)一步說(shuō)明在減少開(kāi)發(fā)時(shí)間的同時(shí),開(kāi)源代碼庫的使用也加快了缺陷的數量增長(cháng)和危害范圍,帶來(lái)巨大的隱患。因為開(kāi)源代碼庫自身隱藏的缺陷會(huì )隨著(zhù)被大量復用而快速傳播,而且很多開(kāi)源代碼庫并不會(huì )公開(kāi)自己存在的缺陷,這些缺陷對代碼審查人員和開(kāi)發(fā)人員來(lái)說(shuō)并不明顯,甚至是隱蔽的,分析和修復它們顯得更加困難。

  因此,對于開(kāi)發(fā)人員來(lái)說(shuō),發(fā)現缺陷,并對其進(jìn)行修復仍然是一項耗時(shí)且繁瑣的工作,在缺陷排查過(guò)程中首先需要借助代碼審查,理解程序的執行過(guò)程,以找到引起缺陷的原因,然后對缺陷進(jìn)行相應的修改,最后通過(guò)回歸測試驗證修復的正確性。盡管對于每個(gè)階段已經(jīng)有很多相關(guān)的工具,然而這一過(guò)程依然需要必不可少的人工參與,Britton 等人通過(guò)相關(guān)的訪(fǎng)談和調查發(fā)現,開(kāi)發(fā)人員在調試 bug 上面花費的時(shí)間幾乎占據其總編程時(shí)間的一半,除了耗時(shí)以外,調試所消耗的資金開(kāi)支也同樣不容小覷,約占整體資金開(kāi)支的 50%,每年消耗在調試 bug 上的開(kāi)支近乎 1560 億美元[2].

  由此可見(jiàn),隨著(zhù)系統規模的擴大,對軟件缺陷修復的研究提出了更嚴峻的要求,以人工為主的缺陷修復過(guò)程不僅延長(cháng)了軟件開(kāi)發(fā)的時(shí)間周期,還極大地增加了軟件開(kāi)發(fā)的人力成本。因此,對缺陷修復的自動(dòng)化研究迫在眉睫。

  1.2 本文研究動(dòng)機

  為了提升軟件開(kāi)發(fā)的效率,研究人員對程序缺陷的自動(dòng)修復展開(kāi)了一系列研究。

  目前基于生成-驗證的缺陷修復方法[3-6]是該領(lǐng)域主流的技術(shù)之一,通過(guò)使用一些特定的轉換規則對缺陷程序進(jìn)行變換來(lái)生成候選補丁,然后對候選補丁執行配套的測試用例集進(jìn)行排序和驗證,從包含全部候選補丁的搜索空間中篩選出排名最高并且通過(guò)全部測試用例的可編譯補丁作為修復結果。

  盡管基于生成-驗證的修復方法已經(jīng)能夠成功修復一些數據集中的缺陷,但最新的一項研究表明[7]這類(lèi)修復方法普遍存在搜索空間不能捕獲正確補丁分布的不足:即生成的候選補丁中,包含的正確補丁極少,進(jìn)一步說(shuō)明搜索空間已經(jīng)成為制約基于生 成-驗證的缺陷修復方法修復效果的重要因素。即使一些方法采用從項目上下文中手工提取修復模式的操作來(lái)提升生成候選補丁的質(zhì)量,但在實(shí)際修復過(guò)程中,基于手工提取修復模式的修復方法從程序中提取的修復特征有限,并且對不同缺陷修復的操作不夠靈活,限制搜索空間的多樣性。因此目前這種基于手工提取修復模式的缺陷修復方法亟需探索一種更新穎更智能的方式去提取缺陷修復特征,生成更精確的候選補丁。

  神經(jīng)機器翻譯 (Neural Machine Translation,NMT) 模型是一種主要處理自然語(yǔ)言翻譯任務(wù)的深度學(xué)習技術(shù),近幾年已經(jīng)被廣泛應用于程序分析領(lǐng)域[8],可以利用神經(jīng)翻譯模型學(xué)習從缺陷程序到修復程序的修復過(guò)程。這種基于深度學(xué)習提取修復模式的方法相比傳統手工提取修復模式的方法,所提取的缺陷修復模式更多樣化,并且可以基于更靈活的修改粒度生成補丁。Santos 等人[9]探索使用神經(jīng)翻譯模型檢測并修復小規模程序中存在的語(yǔ)法和編譯問(wèn)題,表明了使用深度學(xué)習技術(shù)解決缺陷修復問(wèn)題的潛力,但由于訓練數據有限,并且只對程序語(yǔ)言中的簡(jiǎn)單語(yǔ)法特征進(jìn)行學(xué)習,導致這些方法修復的程序規模和缺陷類(lèi)型有限,只能處理一些簡(jiǎn)單的語(yǔ)法、編譯問(wèn)題,對實(shí)際開(kāi)發(fā)過(guò)程中開(kāi)發(fā)人員常出現的缺陷往往無(wú)能為力。

  為了進(jìn)一步豐富訓練數據,改善模型修復缺陷的效果,研究人員選擇從大型開(kāi)源倉庫中挖掘缺陷數據對模型進(jìn)行訓練,使基于深度學(xué)習提取修復模式的缺陷修復方法學(xué)習到更真實(shí)更多樣化的缺陷特征,提升模型解決實(shí)際缺陷的能力。

  即使基于深度學(xué)習提取修復模式的缺陷修復方法可以有效改善人工提取修復模式過(guò)程中需要手工定義特征、提取特征的問(wèn)題,并且可以從海量真實(shí)數據中自動(dòng)學(xué)習程序缺陷修復模式,真正實(shí)現自動(dòng)化修復,但是目前這種基于深度學(xué)習的方法對實(shí)際開(kāi)發(fā)場(chǎng)景中的真實(shí)缺陷進(jìn)行修復時(shí)效果不佳,原因主要有以下幾點(diǎn):

  (1)現有基于深度學(xué)習的相關(guān)工作,從 Github 開(kāi)源平臺上獲取數據集進(jìn)行建模時(shí),僅使用簡(jiǎn)單的關(guān)鍵詞篩選數據,這種基于簡(jiǎn)單規則的數據獲取方法無(wú)法避免一些低質(zhì)量的數據,導致模型學(xué)習修復模式時(shí)捕捉不到有用的信息,影響模型修復效果。

  (2)程序的上下文信息對缺陷修復過(guò)程具有指導作用,但現有的方法通常將缺陷所在的單一語(yǔ)句輸入模型進(jìn)行訓練,所包含的缺陷上下文信息有限,影響模型從中學(xué)習缺陷修復模式的能力。

  (3)現有的方法在序列化源代碼時(shí)根據空格將其分割為單獨的單詞,并對源代碼中存在的變量名、函數名等用戶(hù)自定義標識符統一抽象表示,導致序列化形成的詞匯表中損失了部分缺陷上下文語(yǔ)義信息,阻礙模型生成有效補丁的能力。

  (4)目前基于深度學(xué)習的修復方法粒度過(guò)粗,缺陷類(lèi)型和對應修復模式之間沒(méi)有建立映射關(guān)系,而是將缺陷全部視為單一類(lèi)型,這種方式使模型在學(xué)習過(guò)程中需要關(guān)注多種修復模式,無(wú)法捕捉和輸入缺陷緊密相關(guān)的修復特征,難以生成更有針對性的補丁。

  1.3 本文研究?jì)热莞鶕?/strong>

  1.2 節提出的現有相關(guān)方法在數據獲取、數據處理等方面存在的不足,本文提出一種基于深度學(xué)習技術(shù)的缺陷修復解決方案,具體研究?jì)热萑缦拢?/p>

  (1)研究從開(kāi)源倉庫中獲取訓練數據的方法。

  通過(guò)分析現有基于簡(jiǎn)單規則從開(kāi)源倉庫中獲取數據的方法中存在的不足,提出一種基于大規模開(kāi)源倉庫的數據優(yōu)化方法,利用數據篩選過(guò)程對開(kāi)源倉庫中的數據進(jìn)行提純,并且為了捕獲對缺陷修復有意義的上下文信息,提出一種基于程序控制流和數據流的程序切片方法對數據進(jìn)行預處理。

  (2)研究使用深度學(xué)習技術(shù)從缺陷-修復數據中學(xué)習缺陷修復模式并生成補丁的方 法。

  因為每種缺陷的修復操作具有相似性,本文通過(guò)提取源代碼的 AST 結構特征,訓練一個(gè)基于代碼語(yǔ)法特征和結構特征的相似性缺陷預分類(lèi)模型,為待修復缺陷匹配最相似的補丁生成模型。并構建基于局部注意力機制的 Encoder-Decoder 模型學(xué)習缺陷的修復模式,實(shí)現自動(dòng)生成補丁的目標。

  本文的主要貢獻有以下幾點(diǎn):

  (1)提出一種基于大規模開(kāi)源倉庫的"多篩選與預處理融合"的數據優(yōu)化方法。

  首先,基于 commit 的變更類(lèi)型、正則表達式以及分類(lèi)模型對開(kāi)源倉庫中的缺陷數據進(jìn)行三次篩選,剔除了 91%的低質(zhì)量數據,并根據 CWE 描述對數據進(jìn)行分類(lèi),經(jīng)過(guò)這些步驟可以得到來(lái)自開(kāi)源倉庫的高質(zhì)量數據樣本。再使用程序控制流和數據流信息對缺陷程序進(jìn)行切片,這種預處理方法能夠去除無(wú)關(guān)的上下文信息,使模型能夠從與缺陷緊密相關(guān)的控制流和數據流中學(xué)習更精確的缺陷修復模式。

  (2)提出一種基于 Encoder-Decoder 的程序缺陷修復模型。

  首先,提取源代碼的 AST 路徑作為其結構特征,并使用注意力機制從中學(xué)習源代碼的向量化表示,這種源代碼表示方法能夠充分捕捉缺陷程序所蘊含的語(yǔ)法特征和層次結構特征,利用雙向長(cháng)短時(shí)記憶網(wǎng)絡(luò ) (Bi-directional Long Short-Term Memory, BiLSTM) 自動(dòng)地學(xué)習這種缺陷特征,根據程序語(yǔ)法特征和結構特征訓練一個(gè)可以檢測缺陷相似性的缺陷預分類(lèi)模型;同時(shí)使用基于子詞表示的序列化方法對每種類(lèi)型的缺陷程序及修復程序進(jìn)行序列化及向量化表示,基于子詞表示的序列化方法能夠兼顧使用字符級別和單詞級別序列化方法的優(yōu)點(diǎn),并且在縮小序列化詞匯表范圍的同時(shí),可以保留全部用戶(hù)自定義標識符信息,這些信息包含充分的與缺陷修復相關(guān)的文本語(yǔ)義信息,可以提升模型推斷補丁生成的能力;最后利用基于 Encoder-Decoder 的補丁生成模型自動(dòng)地學(xué)習缺陷修復模式。

  (3)設計并實(shí)現缺陷修復模型的原型系統 VulRepair,并對 VulRepair 的缺陷修復能力進(jìn)行評估。

  設計并實(shí)現本文提出的缺陷修復模型,詳細介紹 VulRepair 的各個(gè)模塊和具體功能。并且在基準數據集和開(kāi)源倉庫數據集上對比 VulRepair 和其他 11 種先進(jìn)方法的缺陷修復能力,證明 VulRepair 和已有的工作相比,能夠對基準數據集和真實(shí)場(chǎng)景中的缺陷生成更多有效補丁。并且通過(guò)實(shí)驗分別評估本文提出的基于子詞表示的序列化方法、基于控制流和數據流對程序切片的數據預處理方法、以及基于程序 AST 結構特征的缺陷預分類(lèi)模型對系統修復能力的影響。

  1.4 本文組織結構

  本文主要從基于深度學(xué)習的程序自動(dòng)修復方法展開(kāi),針對目前程序修復研究領(lǐng)域中存在的問(wèn)題與挑戰,提出一種相應的解決方案,并詳細說(shuō)明具體的缺陷修復過(guò)程。

  本文一共劃分為五個(gè)章節對基于 Github 程序自動(dòng)修復方法研究展開(kāi)詳細論述,各章節的主要研究?jì)热萑缦拢?/p>

  第一章 引言首先介紹了程序缺陷修復工作的研究背景和意義,然后通過(guò)簡(jiǎn)要概括程序缺陷修復領(lǐng)域的研究進(jìn)展,進(jìn)一步分析當前研究所面臨的問(wèn)題和挑戰。接著(zhù)根據目前所存在的問(wèn)題給出本文的研究思路,簡(jiǎn)要描述研究方法及主要貢獻,最后介紹文章的組織結構。

  第二章 程序缺陷修復方法本章將詳細闡述程序缺陷修復領(lǐng)域的研究歷程和相關(guān)技術(shù),對每一種類(lèi)型的缺陷修復技術(shù)展開(kāi)描述,并且討論當前技術(shù)的局限性。

  第三章 基于大規模開(kāi)源倉庫的高質(zhì)量數據優(yōu)化方法本章將針對已有方法從開(kāi)源倉庫中獲取數據時(shí)存在的不足,介紹本文提出的高質(zhì)量數據優(yōu)化方法過(guò)程,首先介紹從開(kāi)源倉庫獲得高質(zhì)量數據的提取方法,然后介紹對數據的篩選過(guò)程,最后介紹對數據的預處理方法。經(jīng)過(guò)一系列優(yōu)化操作,可以顯著(zhù)提升從開(kāi)源倉庫中獲取數據的質(zhì)量,是下一章進(jìn)行缺陷修復工作的基礎。

  第四章 基于 Encoder-Decoder 的程序缺陷修復模型本章將系統的介紹提出的基于 Encoder-Decoder 的程序缺陷修復模型,是本文研究的重點(diǎn)內容。首先介紹對源代碼的兩種向量化方式,然后詳細介紹提出的缺陷預分類(lèi)模型及補丁生成模型的模型結構和訓練過(guò)程,通過(guò)缺陷預分類(lèi)模型可以為待修復缺陷選擇最匹配的補丁生成模型。最后介紹補丁的生成和評估過(guò)程。

  第五章 系統實(shí)驗評估與分析本章將介紹對第三章、第四章所提出模型的系統設計、實(shí)現,以及實(shí)驗評估過(guò)程,首先介紹缺陷修復系統的設計與實(shí)現,然后介紹對系統進(jìn)行評估實(shí)驗的細節,包括實(shí)驗數據、實(shí)驗環(huán)境、實(shí)驗設置等內容,然后展示和幾種先進(jìn)方法的對比結果,從多個(gè)方面對系統進(jìn)行評估。

  總結與展望

  本章將對本文的研究工作進(jìn)行總結,簡(jiǎn)要描述研究動(dòng)機、解決方案、以及最終的修復結果。特別地,還分析了研究過(guò)程中存在的不足,并提出合理的展望。

  第二章 程序缺陷修復方法

  2.1 研究現狀

  2.1.1 基于生成-驗證的缺陷修復技術(shù)

  2.1.2 基于語(yǔ)義合成的缺陷修復技術(shù)

  2.1.3 基于手工提取修復模式的缺陷修復技術(shù)

  2.1.4 基于深度學(xué)習提取修復模式的缺陷修復技術(shù)

  2.2 當前研究的局限性

  2.3 本章小結

  第三章 基于大規模開(kāi)源倉庫的高質(zhì)量數據優(yōu)化方法

  3.1 高質(zhì)量數據優(yōu)化方法概述

  3.2 Github 倉庫獲取

  3.2.1 Github 倉庫與 commit 介紹

  3.2.2 commit 存在問(wèn)題

  3.2.3 基于排序的 Github 倉庫獲取

  3.3 commit 篩選

  3.3.1 基于變更類(lèi)型的一次篩選

  3.3.2 基于正則表達式的二次篩選

  3.3.3 基于 BiLSTM 分類(lèi)模型的三次篩選

  3.3.4 基于關(guān)鍵詞模式匹配的 commit 分類(lèi)

  3.4 數據預處理

  3.4.1 解析變更文件對

  3.4.2 提取變更函數對

  3.4.3 基于程序控制流和數據流的切片方法

  3.5 本章小結

  第四章 基于 Encoder-Decoder 的程序缺陷修復模型

  4.1 程序缺陷修復模型介紹

  4.2 源代碼特征提取與向量化表示

  4.2.1 基于文本特征與子詞表示的源碼向量化

  4.2.2 基于 AST 結構特征與注意力機制的源碼向量化

  4.3 基于程序 AST 結構特征的 BiLSTM 缺陷預分類(lèi)模型

  4.3.1 BiLSTM 神經(jīng)網(wǎng)絡(luò )介紹

  4.3.2 學(xué)習分類(lèi)特征

  4.4 基于 Encoder-Decoder 的補丁生成模型

  4.4.1 基于局部注意力機制的 Encoder-Decoder 模型介紹

  4.4.2 學(xué)習缺陷修復模式

  4.4.3 補丁生成與驗證

  4.5 本章小結

  第五章 系統實(shí)驗評估與分析

  5.1 VulRepair 原型系統設計與實(shí)現

  5.1.1 系統實(shí)現與模塊設計

  5.1.2 系統界面展示

  5.2 VulRepair 系統實(shí)驗設計

  5.2.1 實(shí)驗數據

  5.2.2 實(shí)驗環(huán)境與配置

  5.2.3 實(shí)驗設置

  5.2.4 對比工作介紹

  5.2.5 評估指標

  5.3 不同序列化方法對模型修復效果的影響實(shí)驗

  5.4 不同預處理方法對模型修復效果的影響實(shí)驗

  5.5 缺陷預分類(lèi)模型對模型修復效果的影響實(shí)驗

  5.6 與其他缺陷修復工具的對比實(shí)驗

  5.6.1 基于 Java 基準數據集的對比

  5.6.2 基于開(kāi)源倉庫數據集的對比

  5.7 修復實(shí)例分析

  5.7.1 在 Java 基準數據集上的修復結果

  5.7.2 在 Github 數據集上的修復結果

  5.8 本章小結

  總結與展望

  總結

  隨著(zhù)軟件規模的擴大,軟件缺陷越來(lái)越成為阻礙軟件發(fā)展的重要因素。目前的程序缺陷自動(dòng)修復方法研究中,基于生成-驗證的方法普遍存在搜索空間不能捕獲正確補丁分布的問(wèn)題,導致生成的候選補丁中,很少有和缺陷程序語(yǔ)義保持一致的正確補丁。其中基于手工提取修復模式的缺陷修復方法不僅需要人工定義修復特征,而且在修復缺陷時(shí)采用單一的代碼修改粒度,因此只能應用于修復某些特定類(lèi)型的缺陷。基于深度學(xué)習提取修復模式的缺陷修復方法依賴(lài)大數據可以改善手工提取修復模式的不足,在修改缺陷語(yǔ)句上的操作粒度更加多樣化,解決了自動(dòng)化提取修復模式并生成有效補丁的難題。

  但基于深度學(xué)習的缺陷修復方法在修復實(shí)際開(kāi)發(fā)過(guò)程中開(kāi)發(fā)人員編寫(xiě)的缺陷時(shí),其生成補丁的有效率和正確率有待進(jìn)一步提升,原因主要有以下幾點(diǎn):

  (1)目前基于深度學(xué)習提取修復模式的缺陷修復方法通常使用簡(jiǎn)單的規則從開(kāi)源倉庫中篩選訓練數據,這種方式無(wú)法去除一些低質(zhì)量的數據,不能使缺陷修復模型發(fā)揮出最好的修復能力,導致模型學(xué)習的特征有限,影響修復效果。

  (2)現有的方法在處理程序上下文信息時(shí),將缺陷和修復所在的單一語(yǔ)句輸入模型中進(jìn)行訓練,包含的缺陷上下文信息有限,使模型難以捕捉到對缺陷修復有意義的重點(diǎn)上下文依賴(lài)特征,阻礙模型提取缺陷修復模式的能力。

  (3)已有的方法使用單一的粒度對源碼進(jìn)行序列化處理,并且抽象表示源碼中大量存在的用戶(hù)自定義標識符,導致序列化形成的詞匯表中丟失了許多對缺陷修復有意義的上下文信息,影響模型修復缺陷的效果。

  (4)現有研究方法對所有缺陷使用同一個(gè)缺陷修復模型進(jìn)行修復,忽略關(guān)注不同缺陷類(lèi)型對應修復模式的不同,使模型無(wú)法針對每種缺陷類(lèi)型學(xué)習具體的修復模式,阻礙模型對待修復缺陷生成精確匹配補丁的能力。

  針對上述存在問(wèn)題,本文做出以下改進(jìn):

  (1)通過(guò)構建基于大規模開(kāi)源倉庫的高質(zhì)量數據優(yōu)化方法,提升從開(kāi)源平臺挖掘訓練數據的質(zhì)量,并提出一種基于 Encoder-Decoder 的程序缺陷修復模型。

  (2)使用基于程序控制流和數據流的切片方法對缺陷及對應修復程序進(jìn)行切片,去除代碼中無(wú)關(guān)的上下文信息,減輕模型訓練壓力,使模型能夠從中提取和缺陷緊密相關(guān)的上下文特征,從而學(xué)習更精確的缺陷修復模式。

  (3)使用基于子詞表示的序列化方法對源碼進(jìn)行預處理,盡可能多的保留源碼中的語(yǔ)義信息。實(shí)驗證明這種方式優(yōu)于基于單詞粒度和字符粒度的兩種序列化方式。 (4)通過(guò)學(xué)習不同缺陷類(lèi)型的程序 AST 結構特征,在生成補丁之前對缺陷進(jìn)行預分類(lèi),根據匹配結果選擇不同的補丁生成模型進(jìn)行缺陷修復,實(shí)驗證明這種方法相比較不區分缺陷種類(lèi)的模型修復效果要好。

  本文實(shí)現了所提出的程序缺陷修復模型的原型系統 VulRepair,并從開(kāi)源倉庫上選擇多種缺陷類(lèi)型數據、以及多種先進(jìn)的缺陷修復方法對 VulRepair 進(jìn)行實(shí)驗評估和對比分析。最后得出結論,VulRepair 無(wú)論是對基準數據集上的缺陷,還是來(lái)自開(kāi)源倉庫中的缺陷,其直接生成有效補丁和正確補丁的效果均優(yōu)于現有的方法,并且避免了對同一個(gè)缺陷多個(gè)候選補丁進(jìn)行驗證的搜索過(guò)程。

  展望

  本文提出的缺陷修復模型,盡管和目前的研究方法相比表現較好,但本文仍然不可避免的存在一些局限性,有待接下來(lái)進(jìn)一步研究。

  (1)目前本文提出的缺陷修復方法主要在 Java 程序上進(jìn)行實(shí)驗和評估,但是該方法是與語(yǔ)言無(wú)關(guān)的,并不局限于某種具體編程語(yǔ)言,因此未來(lái)的工作可以將本文提出的缺陷修復方法遷移到對其他編程語(yǔ)言的缺陷修復中,研究其在 C、Python 等語(yǔ)言中的修復效果差異。

  (2)目前評估了本文提出的缺陷修復模型在十種常見(jiàn)缺陷類(lèi)型上的修復結果,接下來(lái)將計劃使用該方法來(lái)修復更多具有挑戰性的軟件缺陷問(wèn)題,對比在不同缺陷上的修復能力。

  (3)與目前的缺陷修復方法相同,本文提出的方法在實(shí)施缺陷修復時(shí)依然需要依賴(lài)于缺陷定位技術(shù),因此,在接下來(lái)的研究中,可以探索使用深度學(xué)習技術(shù)和細粒度切片技術(shù)將缺陷定位過(guò)程和缺陷修復過(guò)程結合,實(shí)現對缺陷定位的同時(shí),完成自動(dòng)化的缺陷修復。

  參考文獻

  [1] Synopsys OSSRA Report. [EB/OL]. https://www.synopsys.com/software-integrity/resources/analyst-reports/2020-open-source-security-risk-analysis.html.

  [2] Britton T., Jeng L., Carver G., et al. Reversible debugging software[J]. Tech. Rep., 2013:157-165.

  [3] Goues C. L., Nguyen T. V., Forrest S., et al. Genprog: a generic method for automatic softwarerepair[C]. IEEE Transactions on Software Engineering, 2012, 38(1): 54-72.

  [4] Fan L., Rinard M. Staged program repair with condition synthesis[C]. In Proceedings of the 201510th Joint Meeting on Foundations of Software Engineering, 2015: 166-178.

  [5] Durieux T., Monperrus M. DynaMoth: Dynamic Code Synthesis for Automatic Program Repair[C].International Workshop on Automation of Software Test, 2016: 85-91.

  [6] Yang J., Zhikhartsev A., Liu Y., et al. Better test cases for better automated program repair[C]. InProceedings of the 2017 11th Joint Meeting on Foundations of Software Engineering, 2017: 831-841.

  [7] Fan L., Rinard M. An Analysis of the Search Spaces for Generate and Validate Patch GenerationSystems[C]. International Conference, IEEE, 2016: 702-713.

  [8] Alexandru C. V. Guided code synthesis using deep neural networks[C]. In Proceedings of the 201624th ACM SIGSOFT International Symposium on Foundations of Software Engineering, 2016:1068-1070.

  [9] Eddie A. S., Joshua C. C., Abram H., et al. Finding and correcting syntax errors using recurrentneural networks[J]. PeerJ PrePrints, 2017, 5: e3123v1.

  [10] 王贊, 郜健, 陳翔,等。 自動(dòng)程序修復方法研究述評[J]. 計算機學(xué)報, 2018, 41(003):588-610.

  [11] Weimer W., Fry Z. P., Forrest S. Leveraging program equivalence for adaptive program repair:Models and first results[C]. Automated Software Engineering (ASE), ACM, 2013:356-366.

  [12] Fan L., Rinard M. Automatic patch generation by learning correct code[J]. ACM SIGPLAN Notices,2016, 51(1):298-312.

  [13] Kim D., Nam J., Song J., et al. Automatic patch generation learned from human-written patches[C].

  2013 35th International Conference on Software Engineering (ICSE), 2013:802-811.

  [14] Qi Y., Mao X., Yan L., et al. The strength of random search on automated program repair[C]. The36th International Conference on Software Engineering (ICSE 2014), ACM, 2014:254-265.

  [15] Martinez M., Weimer W., Monperrus M. Do the Fix Ingredients Already Exist? An EmpiricalInquiry into the Redundancy Assumptions of Program Repair Approaches, ACM, 2014:492-495.

  [16] Jiang J., Xiong Y., Zhang H., et al. Shaping Program Repair Space with Existing Patches and SimilarCode[C]. International Symposium on Software Testing & Analysis, 2018:298-309.

  [17] Ke Y., Stolee K T., Goues C L., et al. Repairing Programs with Semantic Code Search(T)[C].

  IEEE/ACM International Conference on Automated Software Engineering, ACM, 2016:295-306.

  [18] Liu K., Koyuncu A., Kim K., et al. LSRepair: Live Search of Fix Ingredients for Automated ProgramRepair[C]. 2018 25th Asia-Pacific Software Engineering Conference (APSEC), 2018:658-662.

  [19] Debroy V., Wong W E. Using Mutation to Automatically Suggest Fixes for Faulty Programs[C].Third International Conference on Software Testing, 2010:65-74.

  [20] Jha S., Gulwani S., Seshia S. A., et al. Oracle-guided component-based program synthesis[C].Acm/ieee International Conference on Software Engineering, IEEE, 2010:215-224.

  [21] Chandra S., Torlak E., Barman S., et al. Angelic debugging[J]. Proceedings of the InternationalConference on Software Engineering, 2011:121-130.

  [22] Nguyen H. D. T., Qi D. W., Roychoudhury A., et al. SemFix: Program repair via semanticanalysis[C]. Proceedings of the International Conference on Software Engineering, 2013:772-781.

  [23] Mechtaev S., Yi J., Roychoudhury A. DirectFix: Looking for simple program repairs[C].Proceedings of the International Conference on Software Engineering, 2015: 448-458.

  [24] Xuan J. F., Martinez M., DeMarco F., et al. Nopol: Automatic repair of conditional statement bugsin Java programs[J]. IEEE Transactions on Software Engineering, 2017, 43(1):34-55.

  [25] DeMarco F., Xuan J. F., Berre D. L., et al. Automatic repair of buggy if conditions and missingpreconditions with SMT[C]. ACM, 2014:30-39.

  [26] Marcote S., Monperrus M. Automatic Repair of Infinite Loops[J]. Computer Science, Arxiv:1504.05078v1, 2015.

  [27] Saha R. K., Yoshida H., Prasad M. R., et al. Elixir: an automated repair tool for Java programs[C].ICSE, 2018: 77-80.

  [28] Le X., Lo D., Goues C. L. History Driven Program Repair[C]. 23rd IEEE International Conferenceon Software Analysis, Evolution, and Reengineering (SANER), 2016:213-224.

  [29] Liu K., Koyuncu A., Kim D., et al. TBar: Revisiting Template-based Automated Program Repair[C].the 28th ACM SIGSOFT International Symposium. ACM, 2019:31-42.

  [30] Gupta R., Pal S., Kanade A., et al. DeepFix: Fixing Common C Language Errors by DeepLearning[C]. In AAAI, 2017: 1345-1351.

  [31] Tufano M., Watson C., Bavota G., et al. An empirical investigation into learning bug-fixing patchesin the wild via neural machine translation[C]. the 33rd ACM/IEEE International Conference. ACM,2018:832-837.

  [32] Chen Z., Kommrusch S., Tufano M., et al. SequenceR: Sequence-to-Sequence Learning for End-toEnd Program Repair[J]. CoRR abs/1901.01808, 2019.

  [33] Gu J., Lu Z., Li H., et al. Incorporating Copying Mechanism in Sequence-to-Sequence Learning[C].

  Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics, 2016: 199-208.

  [34] Just R., Jalali D., MD Ernst. Defects4J: a database of existing faults to enable controlled testingstudies for Java programs[C]. International Symposium on Software Testing & Analysis. ACM,2014: 437-440.

  [35] Lutellier T., Pang L., Pham V H., et al. ENCORE: Ensemble Learning using Convolution NeuralMachine Translation for Automatic Program Repair[J]. CoRR abs/1906.08691 (2019)。

  [36] Zhou Y., Sharma A. Automated identification of security issues from commit messages and bugreports[C]. Joint Meeting, 2017:914-919.

  [37] Github REST API. [EB/OL]. https://docs.Github.com/cn/rest/overview/resources-in-the-rest-api.

  [38] Serena E. P., Henrik P., Antonino S., et al. Cédric Dangremont:A manually-curated dataset of fixesto vulnerabilities of open-source software[C]. MSR, 2019: 383-387.

  [39] Tomas M., Ilya S., Kai C., et al. Distributed representations of words and phrases and theircompositionality[C]. In Advances in neural information processing systems, 2013:3111-3119.

  [40] GumTree. [EB/OL]. https://Github.com/GumTreeDiff/gumtree.

  [41] 柯鑫。 基于大型開(kāi)源倉庫的軟件源代碼漏洞檢測方法研究與實(shí)現[D]. 西北大學(xué), 2020.

  [42] Silva J. A vocabulary of program slicing-based techniques[J]. ACM Computing Surveys, 2012,44(3):1-41.

  [43] Li Z., Zou D., Xu S., et al. VulDeepecker:A deep learning-based system for vulnerability detection[J].NDSS, 2018: 18-21.

  [44] Sennrich R., Haddow B., Birch A. Neural Machine Translation of Rare Words with SubwordUnits[J]. Computer Science, CoRR abs/1508.07909, 2015.

  [45] Hochreiter S., Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8):1735-1780.

  [46] 凌波。 基于缺陷上下文深度學(xué)習的程序修復方法[D]. 哈爾濱工業(yè)大學(xué), 2020.

  [47] Cho K., Merrienboer B V., Bahdanau D., et al. On the Properties of Neural Machine Translation:Encoder-Decoder Approaches[J]. Computer Science, 2014:103-111.

  [48] Sutskever I., Vinyals O., Le Q. V. Sequence to Sequence Learning with Neural Networks[J].Advances in neural information processing systems, arXiv:1409.3215, 2014.

  [49] Luong M T., Pham H., Manning C. D. Effective Approaches to Attention-based Neural MachineTranslation[J]. Computer ence, 2015: 1412-1421.

  [50] EvoSuite. [EB/OL]. https://www.evosuite.org/.

  [51] JGenProg. [DB/OL]. https://github.com/SpoonLabs/astor/tree/master/src-jgenprog.

  [52] Xiong Y., Wang J., Yan R., et al. Precise Condition Synthesis for Program Repair[C]. ICSE, 2017:416-426.

  [53] Saha R. K., Yoshida H., Prasad M. R., et al. Elixir: an automated repair tool for Java programs[C].

  ICSE (Companion Volume), 2018: 77-80.

  [54] ssFix Repair. [DB/OL]. https://github.com/sharpFix18/sharpFix.

  [55] Li Y., Wang S., Nguyen T. N. DLFix: Context-based Code Transformation Learning for AutomatedProgram Repair[C]. ICSE, 2020:602-614.

  致謝

  光陰荏苒、歲月如梭,美好的日子總是轉瞬即逝,不經(jīng)意間已在西北大學(xué)度過(guò)了人生中最充實(shí)的七年時(shí)光。這一路走來(lái),我不僅掌握了相關(guān)專(zhuān)業(yè)技能,還學(xué)會(huì )了如何在團隊中和其他人溝通合作,也在成長(cháng)的過(guò)程中懂得了感恩。

  回首往事,總有一些人在前行的途中給予我無(wú)私的幫助、陪伴和關(guān)懷,因此在文章的最后,我由衷的向大家表示感謝。首先我要以最崇高的敬意感謝我的導師房鼎益教授,早在本科時(shí)期,受房老師嚴謹認真的治學(xué)態(tài)度影響,使我堅定了在計算機領(lǐng)域深入研究的信念,并且有幸在房老師的引領(lǐng)下來(lái)到 NISL 網(wǎng)絡(luò )安全實(shí)驗室繼續學(xué)習。

  其次,我由衷的感謝湯戰勇教授在科研過(guò)程中對我的悉心指導,正是因為您的認真指導使我意識到自身存在的不足和優(yōu)勢,也正是因為您對實(shí)驗室的嚴格管理督促我養成了良好的作息習慣。這些諄諄教誨讓我終生受益匪淺。我還要感謝葉貴鑫老師,當我剛進(jìn)入實(shí)驗室時(shí),被分配到了您的課題組,在您的帶領(lǐng)下逐漸上手了對驗證碼安全性分析這個(gè)課題,這個(gè)過(guò)程使我不僅明白了網(wǎng)絡(luò )安全的重要性,也學(xué)會(huì )了如何參與團隊協(xié)作,如何在動(dòng)手實(shí)踐中學(xué)習,還要感謝您在日常生活及科研中對我相關(guān)困惑的指導與答疑,您嚴謹的科研態(tài)度一直影響著(zhù)我。我要感謝柯鑫學(xué)姐、孔維星、田超雄兩位學(xué)長(cháng)在我遇到實(shí)際編程問(wèn)題時(shí)對我的幫助和支持。還要感謝一同并肩奮斗的范天賜、馮暉、賀怡、李朋、田洋、王煥廷、薛永康、姚厚友、張夢(mèng)歡、張宇翔十位同學(xué),感謝你們與我一起分享知識和生活中的快樂(lè ),相聚是一種緣,正是因為有了你們的陪伴,才使得這三年的時(shí)光趣味與收獲并存。我還要感謝我生命中的另一半任博先生,感謝你對我的包容、理解與支持,感謝你在找工作期間對我的指導以及論文撰寫(xiě)期間對我論文的認真校對,亦祝愿你未來(lái)的科研之路順利坦蕩、碩果累累。最后,感謝父母二十三年如一日對我的辛勤撫養,感謝爺爺、姑姑、姑父對我讀研的支持與關(guān)懷,正是因為您們對家庭的無(wú)私付出,才使得我可以無(wú)憂(yōu)無(wú)慮的完成學(xué)業(yè)。

  最后,祝愿母校西北大學(xué)枝繁葉茂、人才濟濟,也祝愿 NISL 實(shí)驗室的發(fā)展日新月異,培育出更高層次的棟梁之才,最后祝愿相逢一場(chǎng)的各位前途似錦,平安順遂。

(如您需要查看本篇畢業(yè)設計全文,請您聯(lián)系客服索取)

相關(guān)內容
相關(guān)標簽:Java畢業(yè)設計
好優(yōu)論文定制中心主要為您提供代做畢業(yè)設計及各專(zhuān)業(yè)畢業(yè)論文寫(xiě)作輔導服務(wù)。 網(wǎng)站地圖
所有論文、資料均源于網(wǎng)上的共享資源以及一些期刊雜志,所有論文僅免費供網(wǎng)友間相互學(xué)習交流之用,請特別注意勿做其他非法用途。
如有侵犯您的版權或其他有損您利益的行為,請聯(lián)系指出,論文定制中心會(huì )立即進(jìn)行改正或刪除有關(guān)內容!