基於深度學習的編譯器模糊測試

Compiler Fuzzing through Deep Learning

基於深度學習的編譯器模糊測試

論文摘要:

模糊測試是發現編譯器中錯誤的有效技術手段,但成功的模糊測試需要對編譯器支持的每種語言進行大量的開發工作,並且通常會遺漏部分對於語言空間的測試。本文介紹DeepSmith,一種通過推斷編譯器輸入的生成模型來加速編譯器的驗證方法。本方法基於大量的開源代碼構建真實項目中代碼結構的學習模型,並使用該模型自動生成數以萬計的程序。最後,本文通過差分測試方法來揭示編譯器中的錯誤。

技術介紹:

在進行模糊測試時,隨機生成的有效或部分有效的數據被作為輸入投給編譯器。任何類型的異常行為,包括崩潰、凍結和錯誤的二進制文件,都意味著編譯器的Bug。編譯器中的崩潰和凍結很容易檢測,但是二進制文件是否正確編譯卻很難判斷。為解決這個問題,本文通過差分測試,通過將生成的代碼和一組輸入形成一個測試用例,在多個測試平臺上編譯和執行。如果測試用例應該具有確定性行為,但是在測試床上的輸出不同時,進而發現Bug。

目前先進的CSmith方法通過定義和採樣C編程語言的語法來生成大型的隨機程序。複雜的靜態和動態分析可確保程序不受未定義行為的影響。雖然CSmith已成功應用於識別編譯器中的數百個錯誤,但它和類似的方法有一個明顯的缺點,即它們代表了一項龐大的任務,需要徹底瞭解目標編程語言。

DeepSmith利用深度學習技術來自動構建人類如何編寫代碼的概率模型,而不是刻意地將語法定義到同一端。通過在手寫代碼語料庫上訓練深度神經網絡,它能夠推斷出編程語言的語法和語義以及常見的結構和模式。本方法極大地簡化並加速了該過程。生成的程序的表現力僅受語料庫中包含的內容的限制,而不受開發人員的專業知識或可用時間的限制。

DeepSmith包含三個核心組件:1)隨機程序的生成模型;2)測試工具;3)用於差分測試的投票啟發式算法。

1)生成模型。為編譯器生成測試用例比較困難,因為它們的輸入是高度結構化的。使用正確的結構生成文本需要專業的知識,並且對於每一種新的語言都要從頭開始。在DeepSmith中,我們將該測試用例生成問題視為無監督的機器學習任務,採用深度學習技術來構建編寫程序的模型。

2)測試工具。本文開發了一種首先預定預期的函數原型的參數併為它們隨機生成數據。起初,本工作使用了CLSmith測試工具。該工具是基於內核沒有輸入和ulong緩衝區作為寫入結果的單個參數的假設。然而只有0.2%的GitHub內核共享此結構。本工作開發了一個首先從函數原型確定預期的參數,再為這些參數生成數值的工具。與生成模型不同,該測試工具是基於特定語言和領域知識的。

3)用於差分測試的投票啟發式算法。在先前的工作中,對編譯器的程序輸出進行投票已被用於規避oracle問題並檢測錯誤編譯。本文擴展了此方法,不僅能夠描述錯誤編譯,還能夠描述異常構建和崩潰。

基於深度學習的編譯器模糊測試

本文貢獻:

1)本文提出了一種新穎、自動和快速的用於編譯器模糊測試的程序,通過真實的代碼而不是專家定義的語法來推斷編程語言的語法和結構。本方法代碼量比現有方法少兩個數量級、並且僅需要不到一天的時間來訓練模型;

2)在發現Bug的能力上,本方法發現的Bug數量總數與現有方法相似,但是能夠找到現有工具未能發現的Bug,並且能夠覆蓋更多的編譯器組件;

3)在對真實代碼進行建模時,本方法產生的測試用例比其他方法更易於解釋,沒有任何昂貴的還原過程。

致謝

本文由南京大學軟件學院2019級博士生章許帆翻譯轉述

相關推薦

推薦中...