摘要
軟件缺陷制約軟件產業發展,嚴重影響軟件質量。探索高效、自動的軟件缺陷修復方法是目前軟件工程領域的重要課題之一。深度學習技術的發展和大規模開源代碼庫的出現為改進傳統基于"生成-驗證"的缺陷修復方法帶來了可能,正在成為目前研究的熱點方向。
目前基于深度學習的缺陷修復方法主要依賴來自開源代碼庫中的數據集構建模型,盡管與傳統基于手工提取缺陷修復模式的修復方法相比,能夠生成可通過配套測試用例集的有效補丁,但生成的補丁往往偏離了原始程序的語義,正確性依然有待提升,其主要原因在于:
。1)因為這些方法使用簡單的規則從開源倉庫中獲取數據,由于開源倉庫的多樣性,這種單一的數據篩選方式獲取的訓練數據質量低,影響模型的學習效果;
。2)現有方法忽略關注程序中的控制流和數據流信息;
。3)現有方法在序列化處理源代碼時粒度單一,并且對其中的用戶自定義標識符抽象表示,使生成的詞匯表中損失了一部分程序語義信息,影響模型生成補丁的效果。
本文針對以上問題對現有缺陷修復方法進行改進,并提出一種基于深度學習技術的缺陷修復解決方案,具體研究內容總結如下:
。1)面對開源倉庫的數據存在質量分布不均衡的挑戰,本文提出了一種基于大規模開源倉庫的數據優化方法,通過數據篩選過程對開源倉庫中的數據進行提純,并且為了捕獲程序上下文中對缺陷修復有意義的重點特征,構建一種基于程序控制流和數據流的程序切片方法對數據進行預處理,提升從開源倉庫獲取數據的質量。
。2)提出一種使用編碼器-解碼器結構的程序缺陷修復模型。針對現有方法在源碼序列化過程中存在粒度單一、損失部分程序信息的問題,本文使用基于子詞表示的序列化方法對源碼進行處理,盡可能多的保留程序上下文中的用戶自定義標識符信息。
再通過基于局部注意力機制的編碼器-解碼器模型學習缺陷的修復模式,實現補丁的自動生成?紤]到每種缺陷的修復操作具有相似性,本文通過構建一個基于程序抽象語法樹 (Abstract Syntax Tree, AST) 結構特征的缺陷預分類模型,為待修復缺陷選擇最匹配的補丁生成模型。
。3)設計并實現了一個基于 Github 的 Java 程序缺陷修復原型系統 VulRepair.
并且為了驗證 VulRepair 的缺陷修復效果,還設計并實現了一組評估對比實驗,從多個角度評估驗證本文提出的缺陷修復模型和系統。實驗結果表明,本文提出的缺陷修復方法在基準數據集和來自開源倉庫的數據集上,相比已有的缺陷修復方法,VulRepair 生成的有效補丁和正確補丁數量更多,并且具有修復多行缺陷的潛力。
關鍵詞: 自動缺陷修復,深度學習,開源倉庫
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
目錄
第一章 引言
本章節首先闡述本文的研究內容,包括軟件缺陷自動修復的研究背景和意義,之后通過梳理該方向的歷史研究進程,進一步分析當前研究所面臨的局限和主要挑戰。
最后再針對現有研究中存在的問題,給出本文的研究思路,并簡要介紹本文的研究方法和文章的組織結構。
1.1 研究背景與意義
在軟件的開發過程中,由于需求不明確,設計不合理,開發人員編碼錯誤等各方面原因,不可避免的會在系統中引入各種各樣的缺陷。這些軟件缺陷隨著軟件規模和復雜度的提升,成為限制軟件發展的重要阻礙,甚至會被不法攻擊者利用,威脅系統安全,產生難以預計的嚴峻后果。
由于開源平臺快速發展帶來的開發便利性,很多開發者直接使用公開的開源代碼庫進行編碼,并且忽略檢查其中的內部流程和具體實現操作。有關報告[1]顯示:在 2019年,平均每個軟件使用了 445 個開源代碼庫,和往年相比平均使用率增長了 85%,還指出幾乎所有(99%)被統計的軟件中都使用了開源代碼庫,而這些被使用的開源代 碼庫中,超過 75%都含有缺陷。進一步說明在減少開發時間的同時,開源代碼庫的使用也加快了缺陷的數量增長和危害范圍,帶來巨大的隱患。因為開源代碼庫自身隱藏的缺陷會隨著被大量復用而快速傳播,而且很多開源代碼庫并不會公開自己存在的缺陷,這些缺陷對代碼審查人員和開發人員來說并不明顯,甚至是隱蔽的,分析和修復它們顯得更加困難。
因此,對于開發人員來說,發現缺陷,并對其進行修復仍然是一項耗時且繁瑣的工作,在缺陷排查過程中首先需要借助代碼審查,理解程序的執行過程,以找到引起缺陷的原因,然后對缺陷進行相應的修改,最后通過回歸測試驗證修復的正確性。盡管對于每個階段已經有很多相關的工具,然而這一過程依然需要必不可少的人工參與,Britton 等人通過相關的訪談和調查發現,開發人員在調試 bug 上面花費的時間幾乎占據其總編程時間的一半,除了耗時以外,調試所消耗的資金開支也同樣不容小覷,約占整體資金開支的 50%,每年消耗在調試 bug 上的開支近乎 1560 億美元[2].
由此可見,隨著系統規模的擴大,對軟件缺陷修復的研究提出了更嚴峻的要求,以人工為主的缺陷修復過程不僅延長了軟件開發的時間周期,還極大地增加了軟件開發的人力成本。因此,對缺陷修復的自動化研究迫在眉睫。
1.2 本文研究動機
為了提升軟件開發的效率,研究人員對程序缺陷的自動修復展開了一系列研究。
目前基于生成-驗證的缺陷修復方法[3-6]是該領域主流的技術之一,通過使用一些特定的轉換規則對缺陷程序進行變換來生成候選補丁,然后對候選補丁執行配套的測試用例集進行排序和驗證,從包含全部候選補丁的搜索空間中篩選出排名最高并且通過全部測試用例的可編譯補丁作為修復結果。
盡管基于生成-驗證的修復方法已經能夠成功修復一些數據集中的缺陷,但最新的一項研究表明[7]這類修復方法普遍存在搜索空間不能捕獲正確補丁分布的不足:即生成的候選補丁中,包含的正確補丁極少,進一步說明搜索空間已經成為制約基于生 成-驗證的缺陷修復方法修復效果的重要因素。即使一些方法采用從項目上下文中手工提取修復模式的操作來提升生成候選補丁的質量,但在實際修復過程中,基于手工提取修復模式的修復方法從程序中提取的修復特征有限,并且對不同缺陷修復的操作不夠靈活,限制搜索空間的多樣性。因此目前這種基于手工提取修復模式的缺陷修復方法亟需探索一種更新穎更智能的方式去提取缺陷修復特征,生成更精確的候選補丁。
神經機器翻譯 (Neural Machine Translation,NMT) 模型是一種主要處理自然語言翻譯任務的深度學習技術,近幾年已經被廣泛應用于程序分析領域[8],可以利用神經翻譯模型學習從缺陷程序到修復程序的修復過程。這種基于深度學習提取修復模式的方法相比傳統手工提取修復模式的方法,所提取的缺陷修復模式更多樣化,并且可以基于更靈活的修改粒度生成補丁。Santos 等人[9]探索使用神經翻譯模型檢測并修復小規模程序中存在的語法和編譯問題,表明了使用深度學習技術解決缺陷修復問題的潛力,但由于訓練數據有限,并且只對程序語言中的簡單語法特征進行學習,導致這些方法修復的程序規模和缺陷類型有限,只能處理一些簡單的語法、編譯問題,對實際開發過程中開發人員常出現的缺陷往往無能為力。
為了進一步豐富訓練數據,改善模型修復缺陷的效果,研究人員選擇從大型開源倉庫中挖掘缺陷數據對模型進行訓練,使基于深度學習提取修復模式的缺陷修復方法學習到更真實更多樣化的缺陷特征,提升模型解決實際缺陷的能力。
即使基于深度學習提取修復模式的缺陷修復方法可以有效改善人工提取修復模式過程中需要手工定義特征、提取特征的問題,并且可以從海量真實數據中自動學習程序缺陷修復模式,真正實現自動化修復,但是目前這種基于深度學習的方法對實際開發場景中的真實缺陷進行修復時效果不佳,原因主要有以下幾點:
。1)現有基于深度學習的相關工作,從 Github 開源平臺上獲取數據集進行建模時,僅使用簡單的關鍵詞篩選數據,這種基于簡單規則的數據獲取方法無法避免一些低質量的數據,導致模型學習修復模式時捕捉不到有用的信息,影響模型修復效果。
。2)程序的上下文信息對缺陷修復過程具有指導作用,但現有的方法通常將缺陷所在的單一語句輸入模型進行訓練,所包含的缺陷上下文信息有限,影響模型從中學習缺陷修復模式的能力。
。3)現有的方法在序列化源代碼時根據空格將其分割為單獨的單詞,并對源代碼中存在的變量名、函數名等用戶自定義標識符統一抽象表示,導致序列化形成的詞匯表中損失了部分缺陷上下文語義信息,阻礙模型生成有效補丁的能力。
。4)目前基于深度學習的修復方法粒度過粗,缺陷類型和對應修復模式之間沒有建立映射關系,而是將缺陷全部視為單一類型,這種方式使模型在學習過程中需要關注多種修復模式,無法捕捉和輸入缺陷緊密相關的修復特征,難以生成更有針對性的補丁。
1.3 本文研究內容根據
1.2 節提出的現有相關方法在數據獲取、數據處理等方面存在的不足,本文提出一種基于深度學習技術的缺陷修復解決方案,具體研究內容如下:
。1)研究從開源倉庫中獲取訓練數據的方法。
通過分析現有基于簡單規則從開源倉庫中獲取數據的方法中存在的不足,提出一種基于大規模開源倉庫的數據優化方法,利用數據篩選過程對開源倉庫中的數據進行提純,并且為了捕獲對缺陷修復有意義的上下文信息,提出一種基于程序控制流和數據流的程序切片方法對數據進行預處理。
。2)研究使用深度學習技術從缺陷-修復數據中學習缺陷修復模式并生成補丁的方 法。
因為每種缺陷的修復操作具有相似性,本文通過提取源代碼的 AST 結構特征,訓練一個基于代碼語法特征和結構特征的相似性缺陷預分類模型,為待修復缺陷匹配最相似的補丁生成模型。并構建基于局部注意力機制的 Encoder-Decoder 模型學習缺陷的修復模式,實現自動生成補丁的目標。
本文的主要貢獻有以下幾點:
。1)提出一種基于大規模開源倉庫的"多篩選與預處理融合"的數據優化方法。
首先,基于 commit 的變更類型、正則表達式以及分類模型對開源倉庫中的缺陷數據進行三次篩選,剔除了 91%的低質量數據,并根據 CWE 描述對數據進行分類,經過這些步驟可以得到來自開源倉庫的高質量數據樣本。再使用程序控制流和數據流信息對缺陷程序進行切片,這種預處理方法能夠去除無關的上下文信息,使模型能夠從與缺陷緊密相關的控制流和數據流中學習更精確的缺陷修復模式。
。2)提出一種基于 Encoder-Decoder 的程序缺陷修復模型。
首先,提取源代碼的 AST 路徑作為其結構特征,并使用注意力機制從中學習源代碼的向量化表示,這種源代碼表示方法能夠充分捕捉缺陷程序所蘊含的語法特征和層次結構特征,利用雙向長短時記憶網絡 (Bi-directional Long Short-Term Memory, BiLSTM) 自動地學習這種缺陷特征,根據程序語法特征和結構特征訓練一個可以檢測缺陷相似性的缺陷預分類模型;同時使用基于子詞表示的序列化方法對每種類型的缺陷程序及修復程序進行序列化及向量化表示,基于子詞表示的序列化方法能夠兼顧使用字符級別和單詞級別序列化方法的優點,并且在縮小序列化詞匯表范圍的同時,可以保留全部用戶自定義標識符信息,這些信息包含充分的與缺陷修復相關的文本語義信息,可以提升模型推斷補丁生成的能力;最后利用基于 Encoder-Decoder 的補丁生成模型自動地學習缺陷修復模式。
。3)設計并實現缺陷修復模型的原型系統 VulRepair,并對 VulRepair 的缺陷修復能力進行評估。
設計并實現本文提出的缺陷修復模型,詳細介紹 VulRepair 的各個模塊和具體功能。并且在基準數據集和開源倉庫數據集上對比 VulRepair 和其他 11 種先進方法的缺陷修復能力,證明 VulRepair 和已有的工作相比,能夠對基準數據集和真實場景中的缺陷生成更多有效補丁。并且通過實驗分別評估本文提出的基于子詞表示的序列化方法、基于控制流和數據流對程序切片的數據預處理方法、以及基于程序 AST 結構特征的缺陷預分類模型對系統修復能力的影響。
1.4 本文組織結構
本文主要從基于深度學習的程序自動修復方法展開,針對目前程序修復研究領域中存在的問題與挑戰,提出一種相應的解決方案,并詳細說明具體的缺陷修復過程。
本文一共劃分為五個章節對基于 Github 程序自動修復方法研究展開詳細論述,各章節的主要研究內容如下:
第一章 引言首先介紹了程序缺陷修復工作的研究背景和意義,然后通過簡要概括程序缺陷修復領域的研究進展,進一步分析當前研究所面臨的問題和挑戰。接著根據目前所存在的問題給出本文的研究思路,簡要描述研究方法及主要貢獻,最后介紹文章的組織結構。
第二章 程序缺陷修復方法本章將詳細闡述程序缺陷修復領域的研究歷程和相關技術,對每一種類型的缺陷修復技術展開描述,并且討論當前技術的局限性。
第三章 基于大規模開源倉庫的高質量數據優化方法本章將針對已有方法從開源倉庫中獲取數據時存在的不足,介紹本文提出的高質量數據優化方法過程,首先介紹從開源倉庫獲得高質量數據的提取方法,然后介紹對數據的篩選過程,最后介紹對數據的預處理方法。經過一系列優化操作,可以顯著提升從開源倉庫中獲取數據的質量,是下一章進行缺陷修復工作的基礎。
第四章 基于 Encoder-Decoder 的程序缺陷修復模型本章將系統的介紹提出的基于 Encoder-Decoder 的程序缺陷修復模型,是本文研究的重點內容。首先介紹對源代碼的兩種向量化方式,然后詳細介紹提出的缺陷預分類模型及補丁生成模型的模型結構和訓練過程,通過缺陷預分類模型可以為待修復缺陷選擇最匹配的補丁生成模型。最后介紹補丁的生成和評估過程。
第五章 系統實驗評估與分析本章將介紹對第三章、第四章所提出模型的系統設計、實現,以及實驗評估過程,首先介紹缺陷修復系統的設計與實現,然后介紹對系統進行評估實驗的細節,包括實驗數據、實驗環境、實驗設置等內容,然后展示和幾種先進方法的對比結果,從多個方面對系統進行評估。
總結與展望
本章將對本文的研究工作進行總結,簡要描述研究動機、解決方案、以及最終的修復結果。特別地,還分析了研究過程中存在的不足,并提出合理的展望。
第二章 程序缺陷修復方法
2.1 研究現狀
2.1.1 基于生成-驗證的缺陷修復技術
2.1.2 基于語義合成的缺陷修復技術
2.1.3 基于手工提取修復模式的缺陷修復技術
2.1.4 基于深度學習提取修復模式的缺陷修復技術
2.2 當前研究的局限性
2.3 本章小結
第三章 基于大規模開源倉庫的高質量數據優化方法
3.1 高質量數據優化方法概述
3.2 Github 倉庫獲取
3.2.1 Github 倉庫與 commit 介紹
3.2.2 commit 存在問題
3.2.3 基于排序的 Github 倉庫獲取
3.3 commit 篩選
3.3.1 基于變更類型的一次篩選
3.3.2 基于正則表達式的二次篩選
3.3.3 基于 BiLSTM 分類模型的三次篩選
3.3.4 基于關鍵詞模式匹配的 commit 分類
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 缺陷預分類模型
4.3.1 BiLSTM 神經網絡介紹
4.3.2 學習分類特征
4.4 基于 Encoder-Decoder 的補丁生成模型
4.4.1 基于局部注意力機制的 Encoder-Decoder 模型介紹
4.4.2 學習缺陷修復模式
4.4.3 補丁生成與驗證
4.5 本章小結
第五章 系統實驗評估與分析
5.1 VulRepair 原型系統設計與實現
5.1.1 系統實現與模塊設計
5.1.2 系統界面展示
5.2 VulRepair 系統實驗設計
5.2.1 實驗數據
5.2.2 實驗環境與配置
5.2.3 實驗設置
5.2.4 對比工作介紹
5.2.5 評估指標
5.3 不同序列化方法對模型修復效果的影響實驗
5.4 不同預處理方法對模型修復效果的影響實驗
5.5 缺陷預分類模型對模型修復效果的影響實驗
5.6 與其他缺陷修復工具的對比實驗
5.6.1 基于 Java 基準數據集的對比
5.6.2 基于開源倉庫數據集的對比
5.7 修復實例分析
5.7.1 在 Java 基準數據集上的修復結果
5.7.2 在 Github 數據集上的修復結果
5.8 本章小結
總結與展望
總結
隨著軟件規模的擴大,軟件缺陷越來越成為阻礙軟件發展的重要因素。目前的程序缺陷自動修復方法研究中,基于生成-驗證的方法普遍存在搜索空間不能捕獲正確補丁分布的問題,導致生成的候選補丁中,很少有和缺陷程序語義保持一致的正確補丁。其中基于手工提取修復模式的缺陷修復方法不僅需要人工定義修復特征,而且在修復缺陷時采用單一的代碼修改粒度,因此只能應用于修復某些特定類型的缺陷;谏疃葘W習提取修復模式的缺陷修復方法依賴大數據可以改善手工提取修復模式的不足,在修改缺陷語句上的操作粒度更加多樣化,解決了自動化提取修復模式并生成有效補丁的難題。
但基于深度學習的缺陷修復方法在修復實際開發過程中開發人員編寫的缺陷時,其生成補丁的有效率和正確率有待進一步提升,原因主要有以下幾點:
。1)目前基于深度學習提取修復模式的缺陷修復方法通常使用簡單的規則從開源倉庫中篩選訓練數據,這種方式無法去除一些低質量的數據,不能使缺陷修復模型發揮出最好的修復能力,導致模型學習的特征有限,影響修復效果。
。2)現有的方法在處理程序上下文信息時,將缺陷和修復所在的單一語句輸入模型中進行訓練,包含的缺陷上下文信息有限,使模型難以捕捉到對缺陷修復有意義的重點上下文依賴特征,阻礙模型提取缺陷修復模式的能力。
。3)已有的方法使用單一的粒度對源碼進行序列化處理,并且抽象表示源碼中大量存在的用戶自定義標識符,導致序列化形成的詞匯表中丟失了許多對缺陷修復有意義的上下文信息,影響模型修復缺陷的效果。
。4)現有研究方法對所有缺陷使用同一個缺陷修復模型進行修復,忽略關注不同缺陷類型對應修復模式的不同,使模型無法針對每種缺陷類型學習具體的修復模式,阻礙模型對待修復缺陷生成精確匹配補丁的能力。
針對上述存在問題,本文做出以下改進:
。1)通過構建基于大規模開源倉庫的高質量數據優化方法,提升從開源平臺挖掘訓練數據的質量,并提出一種基于 Encoder-Decoder 的程序缺陷修復模型。
。2)使用基于程序控制流和數據流的切片方法對缺陷及對應修復程序進行切片,去除代碼中無關的上下文信息,減輕模型訓練壓力,使模型能夠從中提取和缺陷緊密相關的上下文特征,從而學習更精確的缺陷修復模式。
。3)使用基于子詞表示的序列化方法對源碼進行預處理,盡可能多的保留源碼中的語義信息。實驗證明這種方式優于基于單詞粒度和字符粒度的兩種序列化方式。 (4)通過學習不同缺陷類型的程序 AST 結構特征,在生成補丁之前對缺陷進行預分類,根據匹配結果選擇不同的補丁生成模型進行缺陷修復,實驗證明這種方法相比較不區分缺陷種類的模型修復效果要好。
本文實現了所提出的程序缺陷修復模型的原型系統 VulRepair,并從開源倉庫上選擇多種缺陷類型數據、以及多種先進的缺陷修復方法對 VulRepair 進行實驗評估和對比分析。最后得出結論,VulRepair 無論是對基準數據集上的缺陷,還是來自開源倉庫中的缺陷,其直接生成有效補丁和正確補丁的效果均優于現有的方法,并且避免了對同一個缺陷多個候選補丁進行驗證的搜索過程。
展望
本文提出的缺陷修復模型,盡管和目前的研究方法相比表現較好,但本文仍然不可避免的存在一些局限性,有待接下來進一步研究。
。1)目前本文提出的缺陷修復方法主要在 Java 程序上進行實驗和評估,但是該方法是與語言無關的,并不局限于某種具體編程語言,因此未來的工作可以將本文提出的缺陷修復方法遷移到對其他編程語言的缺陷修復中,研究其在 C、Python 等語言中的修復效果差異。
。2)目前評估了本文提出的缺陷修復模型在十種常見缺陷類型上的修復結果,接下來將計劃使用該方法來修復更多具有挑戰性的軟件缺陷問題,對比在不同缺陷上的修復能力。
。3)與目前的缺陷修復方法相同,本文提出的方法在實施缺陷修復時依然需要依賴于缺陷定位技術,因此,在接下來的研究中,可以探索使用深度學習技術和細粒度切片技術將缺陷定位過程和缺陷修復過程結合,實現對缺陷定位的同時,完成自動化的缺陷修復。
參考文獻
[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] 王贊, 郜健, 陳翔,等。 自動程序修復方法研究述評[J]. 計算機學報, 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] 柯鑫。 基于大型開源倉庫的軟件源代碼漏洞檢測方法研究與實現[D]. 西北大學, 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] 凌波。 基于缺陷上下文深度學習的程序修復方法[D]. 哈爾濱工業大學, 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.
致謝
光陰荏苒、歲月如梭,美好的日子總是轉瞬即逝,不經意間已在西北大學度過了人生中最充實的七年時光。這一路走來,我不僅掌握了相關專業技能,還學會了如何在團隊中和其他人溝通合作,也在成長的過程中懂得了感恩。
回首往事,總有一些人在前行的途中給予我無私的幫助、陪伴和關懷,因此在文章的最后,我由衷的向大家表示感謝。首先我要以最崇高的敬意感謝我的導師房鼎益教授,早在本科時期,受房老師嚴謹認真的治學態度影響,使我堅定了在計算機領域深入研究的信念,并且有幸在房老師的引領下來到 NISL 網絡安全實驗室繼續學習。
其次,我由衷的感謝湯戰勇教授在科研過程中對我的悉心指導,正是因為您的認真指導使我意識到自身存在的不足和優勢,也正是因為您對實驗室的嚴格管理督促我養成了良好的作息習慣。這些諄諄教誨讓我終生受益匪淺。我還要感謝葉貴鑫老師,當我剛進入實驗室時,被分配到了您的課題組,在您的帶領下逐漸上手了對驗證碼安全性分析這個課題,這個過程使我不僅明白了網絡安全的重要性,也學會了如何參與團隊協作,如何在動手實踐中學習,還要感謝您在日常生活及科研中對我相關困惑的指導與答疑,您嚴謹的科研態度一直影響著我。我要感謝柯鑫學姐、孔維星、田超雄兩位學長在我遇到實際編程問題時對我的幫助和支持。還要感謝一同并肩奮斗的范天賜、馮暉、賀怡、李朋、田洋、王煥廷、薛永康、姚厚友、張夢歡、張宇翔十位同學,感謝你們與我一起分享知識和生活中的快樂,相聚是一種緣,正是因為有了你們的陪伴,才使得這三年的時光趣味與收獲并存。我還要感謝我生命中的另一半任博先生,感謝你對我的包容、理解與支持,感謝你在找工作期間對我的指導以及論文撰寫期間對我論文的認真校對,亦祝愿你未來的科研之路順利坦蕩、碩果累累。最后,感謝父母二十三年如一日對我的辛勤撫養,感謝爺爺、姑姑、姑父對我讀研的支持與關懷,正是因為您們對家庭的無私付出,才使得我可以無憂無慮的完成學業。
最后,祝愿母校西北大學枝繁葉茂、人才濟濟,也祝愿 NISL 實驗室的發展日新月異,培育出更高層次的棟梁之才,最后祝愿相逢一場的各位前途似錦,平安順遂。
(如您需要查看本篇畢業設計全文,請您聯系客服索。