本申請要求2014年6月13日提交的美國臨時申請第62/012,127號的權(quán)益。以上申請的全部教示通過引用合并于此。
政府支持
本發(fā)明是在來自美國空軍的授權(quán)號FA8750-14-C-0056和來自國防高級研究計劃局的授權(quán)號FA8750-15-C-0242的政府支持下進(jìn)行的。政府對本發(fā)明具有一定的權(quán)利。
背景技術(shù):
當(dāng)今,軟件開發(fā)、維護(hù)和修復(fù)是手動過程。軟件供應(yīng)商隨著時間計劃、實(shí)現(xiàn)、記錄、測試、部署和維護(hù)計算機(jī)程序。初始計劃、實(shí)現(xiàn)、記錄、測試和部署通常是不完整的,并且總是缺少所需的功能或包含缺陷。很多供應(yīng)商有生命周期維護(hù)計劃以通過隨著軟件成熟推出迭代故障修復(fù)、安全補(bǔ)丁和功能增強(qiáng)來解決這些缺陷。
世界上部署了數(shù)十億行的大量的軟件代碼,并且維護(hù)和故障修復(fù)花費(fèi)大量的時間和金錢來解決。歷史上,軟件維護(hù)一直是專門的和反應(yīng)的(即,響應(yīng)于故障報告、安全漏洞報告和用戶對特征增強(qiáng)的請求)手動過程。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的實(shí)施例使軟件開發(fā)、維護(hù)和修復(fù)生命周期的關(guān)鍵方面自動化,包括例如查找和修復(fù)程序缺陷,例如故障(代碼中的錯誤)、安全漏洞和協(xié)議缺點(diǎn)。本發(fā)明的示例實(shí)施例提供了可以利用大量軟件文件的系統(tǒng)和方法,包括公開可用的或?qū)S械能浖募?/p>
某些示例實(shí)施例可以自動標(biāo)識和提供針對軟件文件的最新版本或補(bǔ)丁。另外的實(shí)施例可以自動定位已知存在于某些軟件文件中的設(shè)計模式、例如軟件缺陷(例如,故障、安全漏洞、協(xié)議缺點(diǎn))并提供修復(fù)。其他實(shí)施例可以通過先前前不知道文件包含缺陷的軟件文件中定位已知缺陷來利用已知缺陷。另外的實(shí)施例可以自動定位設(shè)計模式,例如標(biāo)識源代碼或二進(jìn)制代碼的部分,以標(biāo)識文件、程序、函數(shù)或代碼塊。
當(dāng)標(biāo)識出軟件缺陷時,對于一些實(shí)施例,可以使用對應(yīng)的軟件修復(fù)模式生成修復(fù)規(guī)范。例如,該修復(fù)規(guī)范可以用于以源或二進(jìn)制(也稱為機(jī)器語言)補(bǔ)丁的形式來合成適當(dāng)?shù)能浖迯?fù)。某些示例實(shí)施例可以支持對二進(jìn)制代碼和源代碼二者執(zhí)行自動軟件維護(hù),例如缺陷標(biāo)識和修復(fù),從而實(shí)現(xiàn)針對傳統(tǒng)系統(tǒng)的廣泛的自動化軟件維護(hù)。
根據(jù)本發(fā)明的一個實(shí)施例,一種用于標(biāo)識軟件的方法包括獲取軟件文件,確定針對軟件文件的多個產(chǎn)物,訪問存儲針對多個參考軟件文件中的每個參考軟件文件的多個參考產(chǎn)物的數(shù)據(jù)庫,將多個產(chǎn)物與多個參考產(chǎn)物進(jìn)行比較,以及通過標(biāo)識具有與多個產(chǎn)物匹配的多個參考產(chǎn)物的參考軟件文件來標(biāo)識軟件文件。
根據(jù)另外的實(shí)施例,針對軟件文件的多個產(chǎn)物可以包括調(diào)用圖、控制流圖、使用定義鏈、定義使用鏈、支配樹、基本塊、變量、常數(shù)、分支語義和協(xié)議中的一個或多個。對于其他另外的實(shí)施例,多個產(chǎn)物可以包括系統(tǒng)調(diào)用跟蹤和執(zhí)行跟蹤中的一個或多個。對于另一示例實(shí)施例,多個產(chǎn)物可以包括循環(huán)不變量、類型信息、Z語言和標(biāo)簽轉(zhuǎn)移系統(tǒng)表示中的一個或多個。對于某些示例實(shí)施例,多個產(chǎn)物可以包括根據(jù)內(nèi)聯(lián)代碼注釋、提交歷史、文檔文件和常見漏洞和披露源條目(entry)中的任一個確定的一個或多個產(chǎn)物。對于一些示例實(shí)施例,多個產(chǎn)物每個是圖產(chǎn)物或開發(fā)產(chǎn)物。對于另外的實(shí)施例,多個產(chǎn)物每個是靜態(tài)產(chǎn)物、動態(tài)產(chǎn)物、導(dǎo)出的產(chǎn)物或元數(shù)據(jù)產(chǎn)物。對于某些實(shí)施例,當(dāng)在多個參考產(chǎn)物與多個產(chǎn)物之間至少存在模糊匹配時,多個參考產(chǎn)物匹配多個產(chǎn)物。
根據(jù)另外的實(shí)施例,該方法還可以通過分析存儲在數(shù)據(jù)庫中與所標(biāo)識的參考軟件文件相關(guān)聯(lián)的參考產(chǎn)物中的至少一個參考產(chǎn)物來確定是否存在軟件文件的較新版本。對于一些實(shí)施例,該方法還可以自動提供軟件文件的較新版本。
根據(jù)其他實(shí)施例,該方法還可以包括通過分析與所標(biāo)識的參考軟件文件相關(guān)聯(lián)的參考產(chǎn)物中的至少一個參考產(chǎn)物來確定是否存在針對軟件文件的補(bǔ)丁。某些實(shí)施例還可以向軟件文件自動應(yīng)用補(bǔ)丁。其他實(shí)施例還可以分析補(bǔ)丁以確定與軟件文件中的缺陷的修復(fù)對應(yīng)的補(bǔ)丁的修復(fù)部分,并且僅將補(bǔ)丁的修復(fù)部分應(yīng)用于軟件文件。對于某些實(shí)施例,分析補(bǔ)丁和軟件文件包括將補(bǔ)丁轉(zhuǎn)換為中間表示,并且對于某些實(shí)施例將軟件文件也轉(zhuǎn)換為中間表示,并且根據(jù)中間表示確定產(chǎn)物中的至少一個產(chǎn)物。
本發(fā)明的某些實(shí)施例可以通過將軟件文件轉(zhuǎn)換為中間表示并且根據(jù)中間表示確定多個產(chǎn)物中的至少一個產(chǎn)物來確定針對軟件文件的多個產(chǎn)物。另外的實(shí)施例還可以在例如虛擬機(jī)的儀器化環(huán)境中運(yùn)行軟件文件以確定產(chǎn)物。某些實(shí)施例還可以通過從軟件文件提取字符串來確定產(chǎn)物中的一些產(chǎn)物,包括當(dāng)軟件文件是源代碼格式或二進(jìn)制代碼格式時。
示例方法的另外的實(shí)施例可以通過分析與所標(biāo)識的參考軟件文件相關(guān)聯(lián)的參考產(chǎn)物中的至少一個參考產(chǎn)物以及與對于某些實(shí)施例的軟件文件相關(guān)聯(lián)的產(chǎn)物中的至少一個產(chǎn)物來確定軟件文件中是否存在缺陷。另外的實(shí)施例可以自動修復(fù)軟件文件中的缺陷。對于這些實(shí)施例中的某些實(shí)施例,自動修復(fù)缺陷包括用源代碼修復(fù)塊替換源代碼塊。對于這些實(shí)施例中的某些實(shí)施例,自動修復(fù)缺陷包括用二進(jìn)制代碼修復(fù)塊替換二進(jìn)制代碼塊。對于這些實(shí)施例中的某些實(shí)施例,自動修復(fù)缺陷包括用中間表示修復(fù)塊替換軟件文件的中間表示塊。這些塊可以是連續(xù)的,但不一定是連續(xù)的,并且可以包括遍布文件的代碼。
根據(jù)本發(fā)明的另一實(shí)施例,一種用于標(biāo)識代碼的方法包括獲取一個或多個軟件文件,確定針對軟件文件的多個產(chǎn)物,訪問存儲多個參考產(chǎn)物的數(shù)據(jù)庫,以及通過將與程序片段對應(yīng)的多個產(chǎn)物和與程序片段對應(yīng)的多個參考產(chǎn)物相匹配來標(biāo)識軟件文件中的程序片段。匹配也可以基于模糊匹配,在模糊匹配中,接近匹配被認(rèn)為是匹配。
對于一些實(shí)施例,確定針對軟件文件的多個產(chǎn)物包括將軟件文件轉(zhuǎn)換為中間表示格式,并且根據(jù)中間表示確定多個產(chǎn)物中的至少一個產(chǎn)物。對于示例方法的一些實(shí)施例,軟件文件每個是源代碼格式。對于其他實(shí)施例,軟件文件每個是二進(jìn)制代碼格式。對于一些實(shí)施例,程序片段與軟件文件中的缺陷對應(yīng),例如故障、安全漏洞或協(xié)議缺點(diǎn)。對于某些示例實(shí)施例,多個產(chǎn)物包括圖產(chǎn)物和/或開發(fā)產(chǎn)物,或者多個產(chǎn)物每個是元數(shù)據(jù)產(chǎn)物。對于某些示例實(shí)施例,一個或多個軟件文件可以是軟件項目內(nèi)的文件。
對于某些實(shí)施例,與程序片段對應(yīng)的參考產(chǎn)物先前已經(jīng)在數(shù)據(jù)庫中被標(biāo)識為與缺陷對應(yīng)。對于一些實(shí)施例,該方法還包括自動修復(fù)軟件文件中的缺陷,向用戶提供一個或多個修復(fù)選項以修復(fù)缺陷,和/或?qū)σ粋€或多個修復(fù)選項排序,包括基于由用戶選擇的一個或多個先前修復(fù)選項或基于針對每個修復(fù)選項的成功的可能性。自動修復(fù)缺陷包括在沒有來自用戶的針對該文件的任何輸入的情況下修復(fù)缺陷,包括通過參考配置文件、設(shè)置或標(biāo)志(包括可以由用戶(例如管理員)先前設(shè)置的那些)來確定是否需要或允許自動修復(fù)缺陷。
對于某些示例實(shí)施例,程序片段已經(jīng)在數(shù)據(jù)庫中被標(biāo)識為與特征對應(yīng)。某些實(shí)施例還可以利用特征增強(qiáng)來自動加強(qiáng)特征,包括通過應(yīng)用二進(jìn)制或源代碼補(bǔ)丁。
本發(fā)明的另外的實(shí)施例提供一種用于標(biāo)識軟件的系統(tǒng),其包括能夠與具有軟件文件的源通信的接口、存儲針對多個參考軟件文件中的每個參考軟件文件的多個參考產(chǎn)物的存儲設(shè)備、通信地耦合到接口和存儲設(shè)備并且被配置為進(jìn)行以下操作的處理器:獲取軟件文件,確定針對軟件文件的多個產(chǎn)物,訪問存儲設(shè)備中的多個參考產(chǎn)物,將多個產(chǎn)物與多個參考產(chǎn)物相比較,以及通過標(biāo)識具有與多個產(chǎn)物相匹配的多個參考產(chǎn)物的參考軟件文件來標(biāo)識軟件文件。
系統(tǒng)的另外的實(shí)施例可以使處理器被配置為除了其他以外通過以下操作來確定針對軟件文件的多個產(chǎn)物:將軟件文件轉(zhuǎn)換為中間表示,并且根據(jù)中間表示確定多個產(chǎn)物中的至少一個產(chǎn)物。其他實(shí)施例使處理器還被配置為通過分析與所標(biāo)識的參考軟件文件相關(guān)聯(lián)的參考產(chǎn)物中的至少一個參考產(chǎn)物來確定是否存在針對軟件文件的補(bǔ)丁。某些另外的實(shí)施例使處理器還被配置為將補(bǔ)丁自動應(yīng)用于軟件文件。某些其他實(shí)施例使處理器還被配置為分析補(bǔ)丁和軟件文件以確定與軟件文件中的缺陷的修復(fù)對應(yīng)的補(bǔ)丁的修復(fù)部分,并且僅將補(bǔ)丁的修復(fù)部分應(yīng)用于軟件文件。
本發(fā)明的另外的實(shí)施例提供了一種用于標(biāo)識代碼的系統(tǒng),其包括能夠與具有一個或多個軟件文件的源通信的接口、用于存儲多個參考產(chǎn)物的存儲設(shè)備、以及通信地耦合到接口和存儲設(shè)備并且被配置為進(jìn)行以下操作的處理器:引起一個或多個軟件文件被獲取,確定針對一個或多個軟件文件的多個產(chǎn)物,訪問存儲多個參考產(chǎn)物的數(shù)據(jù)庫,以及通過將與程序片段對應(yīng)的多個產(chǎn)物和與程序片段對應(yīng)的多個參考產(chǎn)物相匹配來標(biāo)識針對一個或多個軟件文件的程序片段。對于某些示例實(shí)施例,程序片段已經(jīng)在數(shù)據(jù)庫中被標(biāo)識為與缺陷對應(yīng)。這種缺陷的示例包括故障、安全漏洞和協(xié)議缺點(diǎn)。這些缺陷可以在一個或多個軟件文件內(nèi),或者可以與軟件文件之間的一個或多個接口相關(guān)。另外的實(shí)施例也可以使處理器被配置為自動修復(fù)一個或多個軟件文件中的缺陷。
根據(jù)本發(fā)明的另一實(shí)施例,提供了一種其上存儲有可執(zhí)行程序的非暫態(tài)計算機(jī)可讀介質(zhì),其中程序指令處理設(shè)備執(zhí)行以下步驟:獲取軟件文件,確定針對軟件文件的多個產(chǎn)物,訪問存儲針對多個參考軟件文件中的每個參考軟件文件的多個參考產(chǎn)物的數(shù)據(jù)庫,將多個產(chǎn)物與多個參考產(chǎn)物進(jìn)行比較,以及通過標(biāo)識具有與多個產(chǎn)物相匹配的多個參考產(chǎn)物的參考軟件文件來標(biāo)識軟件文件。
附圖說明
根據(jù)如附圖中所示的本發(fā)明的示例實(shí)施例的以下更具體的描述,上述內(nèi)容將是顯而易見的,其中在不同的視圖中相同的附圖標(biāo)記表示相同的部分。附圖不一定是按比例的,重點(diǎn)在于示出本發(fā)明的實(shí)施例。
圖1是示出用于提供針對軟件文件的語料庫的方法的示例實(shí)施例的流程圖。
圖2是示出根據(jù)本發(fā)明的實(shí)施例的用于從針對語料庫的輸入軟件文件提取中間表示(IR)的示例處理的流程圖。
圖3是示出根據(jù)本發(fā)明的實(shí)施例的用于軟件文件的產(chǎn)物之間的層級關(guān)系的框圖。
圖4是示出用于提供針對軟件文件的產(chǎn)物的語料庫的系統(tǒng)的示例實(shí)施例的框圖。
圖5是示出用于標(biāo)識設(shè)計模式的方法的示例實(shí)施例的框圖。
圖6是示出用于標(biāo)識缺陷的方法的示例實(shí)施例的流程圖。
圖7是示出根據(jù)本發(fā)明的實(shí)施例的用于標(biāo)識設(shè)計模式的產(chǎn)物的聚類的框圖。
圖8是示出用于使用語料庫來標(biāo)識軟件文件的方法的示例實(shí)施例的流程圖。
圖9是示出用于標(biāo)識程序片段的方法的示例實(shí)施例的流程圖。
圖10是示出根據(jù)本發(fā)明的實(shí)施例的使用語料庫的系統(tǒng)的框圖。
具體實(shí)施方式
以下是本發(fā)明的示例實(shí)施例的描述。本文引用的任何專利或出版物的全部教導(dǎo)通過引用并入本文檔中。
根據(jù)本公開的示例實(shí)施例的軟件分析允許利用來自現(xiàn)有軟件文件的知識,包括來自公共可用來源或者是專有軟件的文件。然后,該知識可以應(yīng)用于其他軟件文件,包括以修復(fù)缺陷,標(biāo)識漏洞,標(biāo)識協(xié)議缺點(diǎn)或建議代碼改進(jìn)。
本發(fā)明的示例實(shí)施例可以涉及軟件分析的各個方面,包括創(chuàng)建、更新、維護(hù)或以其他方式提供針對知識數(shù)據(jù)庫的軟件文件的語料庫和關(guān)于軟件文件的相關(guān)產(chǎn)物。根據(jù)本發(fā)明的方面,該語料庫可以用于各種目的,包括自動標(biāo)識軟件文件的較新版本、可用于軟件文件的補(bǔ)丁、已知具有這些缺陷的文件中的缺陷、以及在以前未知包含這些錯誤的文件中的已知缺陷。本發(fā)明的實(shí)施例還可以利用來自語料庫的知識來解決這些問題。
圖1是示出根據(jù)本發(fā)明的實(shí)施例的針對語料庫的輸入軟件文件的示例處理的流程圖。第一圖示步驟是獲取多個軟件文件110。這些軟件文件可以是源代碼格式,其通常是純文本、或者以二進(jìn)制代碼格式或某種其他格式。此外,對于本發(fā)明的某些示例實(shí)施例,源代碼格式可以是可以被編譯的任何計算機(jī)語言,包括Ada、C/C++、D、Erlang、Haskell、Java、Lua、Objective C/C++、PHP、Python和Ruby。對于某些另外的示例實(shí)施例,還可以獲取用于與本發(fā)明的實(shí)施例一起使用的解釋語言,包括PERL和bash腳本。
所獲取的軟件文件不僅包括源代碼或二進(jìn)制文件,還可以包括與這些文件或?qū)?yīng)的軟件項目相關(guān)聯(lián)的任何文件。例如,軟件文件還包括相關(guān)聯(lián)的構(gòu)建文件、make文件、庫、文檔文件、提交日志、修訂歷史、bugzilla條目、常見漏洞和披露(CVE)條目和其他非結(jié)構(gòu)化文本。
可以從各種源獲取軟件文件。例如,可以經(jīng)由因特網(wǎng)通過網(wǎng)絡(luò)接口從例如GitHUB、SourceForge、BitBucket、GoogleCode或(例如由MITRE公司維護(hù)的)常見漏洞和披露系統(tǒng)的公共可用軟件存儲庫獲取軟件文件。通常,這些存儲庫包含文件和對文件所進(jìn)行的改變的歷史。此外,例如,可以提供統(tǒng)一資源定位符(URL)以指向可以從其獲取文件的站點(diǎn)。軟件文件還可以經(jīng)由接口從專用網(wǎng)絡(luò)或本地地從本地硬盤驅(qū)動器或其他存儲設(shè)備來獲取。接口提供用于通信地耦合到源。
本發(fā)明的示例實(shí)施例可以從源獲取一些、大多數(shù)或所有可用文件。此外,一些示例實(shí)施例還自動獲取文件,并且例如可以自動下載文件、整個軟件項目(例如,修訂歷史、提交日志、源代碼)、項目或程序的所有修訂、目錄中的所有文件、或從源可獲得的所有文件。一些實(shí)施例爬過針對整個存儲庫的每個修訂以獲取所有可用軟件文件。某些示例實(shí)施例為語料庫中的每個軟件項目獲取整個源控制存儲庫,以支持自動獲取針對項目的所有相關(guān)聯(lián)的文件,包括獲取每個軟件文件修訂。針對存儲庫的示例源控制系統(tǒng)包括Git、Mercurial、Subversion、并發(fā)版本系統(tǒng)、BitKeeper和Perforce。某些實(shí)施例還可以連續(xù)地或周期性地返回檢查源以辨別源是否已經(jīng)改變或更新,并且如果是,則可以僅從源獲取改變或更新,或者也可以再次獲取所有軟件文件。很多源具有用于確定對源的改變的方法,例如示例實(shí)施例可以用于從源獲取更新的日期添加或日期改變字段。
本發(fā)明的某些示例實(shí)施例還可以單獨(dú)獲取庫軟件文件,這些庫軟件文件可以由從存儲庫獲取的源代碼文件使用以在存儲庫不包含庫的情況下解決對這樣的文件的需要。這些實(shí)施例中的某些實(shí)施例嘗試獲取從任何公共源合理地可獲取的或從軟件供應(yīng)商獲取的任何庫軟件文件以包括在語料庫中。另外,某些實(shí)施例允許用戶提供由軟件文件使用的庫或者標(biāo)識所使用的庫,使得能夠獲取這些庫。某些實(shí)施例刮除(scrape)針對每個項目的軟件文件以標(biāo)識由項目使用的庫,使得能夠根據(jù)需要來獲取并且也安裝這些庫。
根據(jù)本發(fā)明的示例方法中的下一步驟是確定針對多個軟件文件120中的每個軟件文件的多個產(chǎn)物。軟件產(chǎn)物可以描述軟件文件的功能、架構(gòu)或設(shè)計。產(chǎn)物類型的示例包括靜態(tài)產(chǎn)物、動態(tài)產(chǎn)物、導(dǎo)出的產(chǎn)物和元數(shù)據(jù)產(chǎn)物。
示例方法的最后一步是將針對多個軟件文件中的每個軟件文件的多個產(chǎn)物存儲在數(shù)據(jù)庫130中。多個產(chǎn)物以如下方式存儲:該方式使得這些產(chǎn)物能夠被標(biāo)識為與能夠根據(jù)其來確定這些產(chǎn)物的特定軟件文件對應(yīng)。可以以眾所周知的各種方式中的任何一種來完成該標(biāo)識,例如由數(shù)據(jù)庫模式表示的數(shù)據(jù)庫中的字段、指針、存儲位置或者例如文件名等任何其他標(biāo)識符??梢灶愃频馗檶儆谕豁椖炕驑?gòu)建的文件,使得能夠維持關(guān)系。
對于不同的實(shí)施例,數(shù)據(jù)庫可以采取不同的形式,例如圖數(shù)據(jù)庫、關(guān)系數(shù)據(jù)庫或平面文件。一個優(yōu)選實(shí)施例使用OrientDB,其是由Orient Technologies領(lǐng)導(dǎo)的OrientDB開源項目提供的分布式圖數(shù)據(jù)庫。另一優(yōu)選實(shí)施例使用Titan(其是被優(yōu)化用于存儲和查詢分布在多機(jī)器集群上的圖的可擴(kuò)展圖數(shù)據(jù)庫)以及Apache Cassandra存儲后端。某些示例實(shí)施例還可以使用SciDB,其是來自范例4的也存儲和操作圖產(chǎn)物的數(shù)組數(shù)據(jù)庫。
靜態(tài)產(chǎn)物、動態(tài)產(chǎn)物、導(dǎo)出的產(chǎn)物和元數(shù)據(jù)產(chǎn)物通常可以根據(jù)源代碼文件、二進(jìn)制文件或其他產(chǎn)物來確定。下面提供這些類型的產(chǎn)物的示例。示例實(shí)施例可以確定針對源代碼或二進(jìn)制軟件文件的這些產(chǎn)物中的一個或多個產(chǎn)物。某些實(shí)施例沒有確定這些類型的產(chǎn)物中的每個產(chǎn)物或針對特定類型的產(chǎn)物中的每個產(chǎn)物,而是可以確定產(chǎn)物類型的子集和/或一個類型內(nèi)的產(chǎn)物的子集,和/或沒有確定任何具體的類型。
靜態(tài)產(chǎn)物
針對軟件文件的靜態(tài)產(chǎn)物包括調(diào)用圖、控制流圖、使用定義鏈、定義使用鏈、支配樹、基本塊、變量、常量、分支語義和協(xié)議。
調(diào)用圖(CG)是被函數(shù)調(diào)用的函數(shù)的有向圖。CG表示高級程序結(jié)構(gòu)并且被描繪為節(jié)點(diǎn),其中圖的每個節(jié)點(diǎn)表示函數(shù),并且節(jié)點(diǎn)之間的每個邊是定向的并且示出函數(shù)是否可以調(diào)用另一函數(shù)。
控制流圖(CFG)是在函數(shù)內(nèi)部的基本塊之間的控制流的有向圖。CFG表示函數(shù)級程序結(jié)構(gòu)。CFG中的每個節(jié)點(diǎn)表示基本塊,節(jié)點(diǎn)之間的邊是定向的,并且示出流中的潛在路徑。
用戶定義鏈(UD)和定義用戶鏈(DU)是在基本代碼塊中執(zhí)行的輸入(使用)、輸出(定義)和操作的有向無環(huán)圖。例如,UD鏈?zhǔn)亲兞康氖褂?、以及可以達(dá)到該使用而沒有中間的重新定義的該變量的所有定義。DU鏈?zhǔn)亲兞康亩x以及可以從該定義達(dá)到而沒有中間的重新定義的所有使用。這些鏈?zhǔn)沟媚軌蜿P(guān)于所接受的輸入類型、所生成的輸出類型以及在基本代碼塊內(nèi)執(zhí)行的操作實(shí)現(xiàn)基本代碼塊的語義分析。
支配樹(DT)是表示CFG中的哪些節(jié)點(diǎn)主導(dǎo)其他節(jié)點(diǎn)(在其他節(jié)點(diǎn)的路徑中)的矩陣。例如,如果從入口節(jié)點(diǎn)到第二節(jié)點(diǎn)的每個路徑必須通過第一節(jié)點(diǎn),則第一節(jié)點(diǎn)支配第二節(jié)點(diǎn)。DT用Pre(從入口前進(jìn))和Post(從出口后退)形式來表示。當(dāng)路徑改變到CFG中的特定節(jié)點(diǎn)時,DT突出顯示。
基本塊是CFG的每個節(jié)點(diǎn)內(nèi)的指令和操作數(shù)??梢员容^基本塊,并且可以產(chǎn)生兩個基本塊之間的相似性度量。
變量對于任何函數(shù)參數(shù)、局部變量或全局變量是針對信息及其類型(表示其可以存儲的信息的類型)的存儲單位,并且包括默認(rèn)值(如果有的話)。它們可以提供關(guān)于程序的初始狀態(tài)和基本約束,并且示出類型或初始值的改變,這可以影響程序行為。
常數(shù)是任何常數(shù)的類型和值,并且可以提供關(guān)于程序的初始狀態(tài)和基本約束。它們可以示出類型或初始值的改變,這可以影響程序行為。
分支語義是if語句和循環(huán)內(nèi)的布爾估計。分支控制執(zhí)行它們的基本塊的條件。
協(xié)議是協(xié)議、庫、系統(tǒng)調(diào)用和由程序使用的其他已知函數(shù)的名稱和引用。
本發(fā)明的示例實(shí)施例可以根據(jù)例如由公共可用的LLVM(以前的低級虛擬機(jī))編譯器基礎(chǔ)設(shè)施項目提供的軟件源代碼文件的中間表示(IR)自動確定靜態(tài)產(chǎn)物。LLVM IR是一種低級公共語言,其可以有效地表示高級語言,并且獨(dú)立于指令集架構(gòu)(ISA),例如ARM、X86、X64、MIPS和PPC。可以使用針對不同計算機(jī)語言的不同LLVM編譯器(也稱為前端)來將源代碼轉(zhuǎn)換為公共LLVM IR。至少針對Ada、C/C++、D、Erlang、Haskell、Java、Lua、Objective C/C++、PHP、Pure、Python和Ruby的前端是公開可用的。此外,可以容易地編程針對另外的語言的前端。LLVM還具有可用的優(yōu)化器以及可以將LLVM IR轉(zhuǎn)換為針對各種不同ISA的機(jī)器語言的后端。另外的示例實(shí)施例可以根據(jù)源代碼文件確定靜態(tài)產(chǎn)物。
圖2是示出根據(jù)本發(fā)明的實(shí)施例的可以使用的針對語料庫的輸入軟件文件的另外的示例處理的流程圖。除了其他以外,示例實(shí)施例可以獲取源代碼205和二進(jìn)制代碼210軟件文件二者。當(dāng)LLVM編譯器220可用于源代碼文件205的語言時,可以使用針對該語言的LLVM編譯器220將源代碼轉(zhuǎn)變成LLVM IR 250。對于沒有可用LLVM編譯器的編譯語言,可以首先使用針對該語言的任何支持的編譯器215將源代碼205編譯成二進(jìn)制文件230。然后,使用例如Fracture等反編譯器235來反編譯二進(jìn)制文件230,F(xiàn)racture是由Draper Laboratory提供的公開可用的開源反編譯器。反編譯器235將機(jī)器代碼230轉(zhuǎn)變成LLVM IR 250。對于以二進(jìn)制形式210獲取的文件(其是機(jī)器代碼230),使用反編譯器235對它們進(jìn)行反編譯以獲取LLVM IR 250。示例實(shí)施例可以從LLVM IR提取與語言無關(guān)的產(chǎn)物和與ISA無關(guān)的產(chǎn)物。
本發(fā)明的示例實(shí)施例可以自動獲取針對每個源代碼軟件文件的IR。例如,示例實(shí)施例可以在存儲庫中自動搜索針對標(biāo)準(zhǔn)構(gòu)建文件(例如autocomf、cmake、automake或make文件或供應(yīng)商指令)的項目。示例實(shí)施例可以通過監(jiān)視構(gòu)建過程并將編譯器調(diào)用轉(zhuǎn)換為針對源代碼的特定語言的LLVM前端調(diào)用來自動地選擇性地嘗試使用這樣的文件來構(gòu)建項目。針對構(gòu)建文件的選擇過程可以遍歷每個文件以確定哪個文件存在并提供完成的構(gòu)建或部分完成的構(gòu)建。
另外的示例實(shí)施例可以在從存儲庫自動獲取文件、將文件轉(zhuǎn)換為LLVM IR和/或確定針對文件的產(chǎn)物時使用分布式計算機(jī)系統(tǒng)。示例分布式系統(tǒng)可以使用主計算機(jī)向從屬機(jī)器推送項目和構(gòu)建以進(jìn)行處理。從屬可以各自處理它們被分配的項目、版本、修訂或構(gòu)建,并且可以將源或二進(jìn)制文件轉(zhuǎn)變?yōu)長LVM IR和/或確定產(chǎn)物并且提供結(jié)果用于存儲在語料庫中。某些示例實(shí)施例可以采用Hadoop,其是用于非常大的數(shù)據(jù)集的分布式存儲和分布式處理的開源軟件框架。從源存儲庫獲取文件也可以分布在一組機(jī)器中。
根據(jù)示例實(shí)施例,軟件文件和LLVM IR也可以被存儲在語料庫中,包括被存儲在分布式存儲中。示例實(shí)施例還可以確定軟件文件或LLVM IR代碼已經(jīng)被存儲在數(shù)據(jù)庫中并且選擇不再次存儲文件。指針、圖數(shù)據(jù)庫中的邊或其他引用標(biāo)識符可以用于將文件與特定項目、目錄或其他文件集合相關(guān)聯(lián)。
動態(tài)產(chǎn)物
動態(tài)產(chǎn)物表示程序行為,并且通過在例如虛擬機(jī)、仿真器(例如,快速仿真器(“QEMU”))或管理程序等儀器化環(huán)境中運(yùn)行軟件來生成。動態(tài)產(chǎn)物包括系統(tǒng)調(diào)用跟蹤/庫跟蹤和執(zhí)行跟蹤。
系統(tǒng)調(diào)用跟蹤或庫跟蹤是執(zhí)行系統(tǒng)調(diào)用或庫調(diào)用的順序和頻率。系統(tǒng)調(diào)用是程序如何從操作系統(tǒng)的內(nèi)核請求服務(wù),內(nèi)核管理輸入/輸出請求。庫調(diào)用是對軟件庫的調(diào)用,軟件庫是可以重新用于開發(fā)軟件程序和應(yīng)用程序的編程代碼的集合。
執(zhí)行跟蹤是包括指令字節(jié)、堆棧幀、存儲器使用(例如,駐留/工作集大小)、用戶/內(nèi)核時間和其他運(yùn)行時間信息的每指令跟蹤。
本發(fā)明的示例實(shí)施例可以產(chǎn)生虛擬環(huán)境(包括針對各種操作系統(tǒng)的),并且可以運(yùn)行和編譯源代碼和二進(jìn)制文件。這些環(huán)境可以允許確定動態(tài)產(chǎn)物。例如,可以使用例如Valgrind或Daikon等公共可用程序來提供關(guān)于程序的運(yùn)行時間信息以用作產(chǎn)物。Valgrind是除了其他以外用于調(diào)試存儲器、檢測存儲器泄漏和分析。Daikon是可以檢測代碼中的不變量的程序;不變量是在代碼中的某些點(diǎn)處成立的條件。
其他實(shí)施例可以使用公開可用的另外的診斷和調(diào)試程序或?qū)嵱贸绦?,例如strace和dtrace。Strace用于監(jiān)視進(jìn)程與內(nèi)核之間的交互,包括系統(tǒng)調(diào)用。Dtrace可以用于為系統(tǒng)提供運(yùn)行時信息,包括所使用的存儲器量、CPU時間、特定函數(shù)調(diào)用以及訪問特定文件的進(jìn)程。示例實(shí)施例還可以在程序的多個運(yùn)行中跟蹤執(zhí)行跟蹤(例如,使用Valgrind)。
另外的實(shí)施例可以通過KLEE引擎運(yùn)行LLVM IR。KLEE是符號虛擬機(jī),其是公開可用的開源代碼。KLEE符號地執(zhí)行LLVM IR并且自動生成執(zhí)行所有代碼程序路徑的測試。符號執(zhí)行除了其它以外涉及分析代碼以確定什么輸入引起代碼的每個部分執(zhí)行。使用KLEE在發(fā)現(xiàn)功能正確性錯誤和行為不一致性方面非常有效,因此使得本發(fā)明的示例實(shí)施例能夠快速地標(biāo)識類似代碼中的差異(例如,跨修訂)。
導(dǎo)出的產(chǎn)物
導(dǎo)出的產(chǎn)物代表復(fù)雜的高級程序行為并且提取表征這些行為的屬性和事實(shí)。導(dǎo)出的產(chǎn)物包括程序特性、循環(huán)不變量、擴(kuò)展類型信息、Z語言和標(biāo)簽轉(zhuǎn)移系統(tǒng)表示。
程序特性是關(guān)于根據(jù)執(zhí)行跟蹤導(dǎo)出的程序的事實(shí)。這些事實(shí)包括最小、最大和平均存儲器大小;執(zhí)行時間;和堆棧深度。
循環(huán)不變量是在循環(huán)的所有迭代(或選擇的迭代組)上被維持的屬性。循環(huán)不變量可以被映射到分支語義以揭示類似的行為。
擴(kuò)展類型信息包括關(guān)于類型的事實(shí),包括變量可以保存的值的范圍、與其他變量的關(guān)系以及可以被抽象的其他特征。類型約束可以揭示關(guān)于代碼的行為和功能。
Z語言基于Zermelo-Fraenkel集合理論。其提供了類型代數(shù)符號,以實(shí)現(xiàn)基本塊與整個函數(shù)之間的比較度量,而忽略結(jié)構(gòu)、順序和類型。
標(biāo)簽轉(zhuǎn)移系統(tǒng)(LTS)表示是表示根據(jù)程序抽象的高級狀態(tài)的圖系統(tǒng)。圖的節(jié)點(diǎn)是狀態(tài),并且邊用轉(zhuǎn)移中的相關(guān)聯(lián)的動作來標(biāo)記。
對于某些示例實(shí)施例,可以根據(jù)其他產(chǎn)物,根據(jù)源代碼文件(包括使用上面描述的針對動態(tài)產(chǎn)物的程序)并且根據(jù)LLVM IR來確定導(dǎo)出的產(chǎn)物。
元數(shù)據(jù)產(chǎn)物
元數(shù)據(jù)產(chǎn)物表示程序上下文,并且包括與代碼相關(guān)聯(lián)的元數(shù)據(jù)。這些產(chǎn)物與計算機(jī)程序具有上下文關(guān)系。元數(shù)據(jù)產(chǎn)物包括文件名、版本號、文件的時間戳、哈希值以及文件的位置,例如屬于特定目錄或項目。元數(shù)據(jù)產(chǎn)物的子集可以被稱為開發(fā)產(chǎn)物,其是與文件、程序或項目的開發(fā)過程相關(guān)的產(chǎn)物。開發(fā)產(chǎn)物可以包括內(nèi)聯(lián)代碼注釋、提交歷史、bugzilla條目、CVE條目、構(gòu)建信息、配置腳本和文檔文件,例如README.*TODO.*。
示例實(shí)施例可以使用Doxygen,其是公開可用的文檔生成器。Doxygen可以根據(jù)特別注釋的源代碼文件(即內(nèi)聯(lián)代碼文檔)為程序員和/或最終用戶生成軟件文檔。
另外的實(shí)施例可以使用解析器,例如用于語言識別的另一種工具(ANTLR)4生成的解析器,以產(chǎn)生抽象語法樹(AST)從而提取高級語言特征,其也可以用作產(chǎn)物。ANTLR4采用針對語言的字符串的語法、產(chǎn)生規(guī)則,并且生成可以構(gòu)建和運(yùn)行(walk)解析樹的解析器。得到的解析器發(fā)出各種類型、函數(shù)定義/調(diào)用以及與程序結(jié)構(gòu)相關(guān)的其他數(shù)據(jù)。用ANTLR4生成的解析器提取的低級屬性包括復(fù)雜類型/結(jié)構(gòu)、循環(huán)不變量/計數(shù)器(例如,從針對每個范例)和結(jié)構(gòu)化注釋(例如,正式的前/后條件語句)。示例實(shí)施例可以將該提取的數(shù)據(jù)映射到其在LLVM IR中的被引用位置,因?yàn)槲募?、行和列號信息存在于解析器和LLVM IR兩者中。
本發(fā)明的示例實(shí)施例可以通過從源軟件文件提取字符串(例如,內(nèi)聯(lián)注釋)來自動確定一個或多個元數(shù)據(jù)產(chǎn)物。其他實(shí)施例自動確定來自文件系統(tǒng)或源控制系統(tǒng)的元數(shù)據(jù)產(chǎn)物。
層級的產(chǎn)物間關(guān)系
圖3是示出根據(jù)本發(fā)明的實(shí)施例的針對軟件文件的產(chǎn)物之間的層級關(guān)系的框圖。示例實(shí)施例可以維護(hù)和利用這些層級的產(chǎn)物間關(guān)系。此外,不同的實(shí)施例可以使用不同的模式和不同的層級關(guān)系。對于圖3的示例實(shí)施例,產(chǎn)物層級的頂部是LTS產(chǎn)物310。每個LTS節(jié)點(diǎn)310可以映射到函數(shù)和特定的可變狀態(tài)的集合或子集。在LTS產(chǎn)物310下面的是CG產(chǎn)物320。每個CG節(jié)點(diǎn)320可以利用CFG產(chǎn)物330映射到特定函數(shù),CFG產(chǎn)物330的邊可以包含循環(huán)不變量和分支語義330。每個CFG節(jié)點(diǎn)330可以包含基本塊和DT 340。在這些產(chǎn)物下面是變量、常數(shù)、UD/DU鏈和IR指令350。圖3清楚地示出了產(chǎn)物可以被映射到層級的不同級別,從描述動態(tài)信息的范圍向下直到單獨(dú)的IR指令的LTS節(jié)點(diǎn)。這些層級關(guān)系可以由示例實(shí)施例用于各種用途,包括更有效地搜索匹配產(chǎn)物,例如通過首先比較更靠近層級頂部的產(chǎn)物(與更接近底部的產(chǎn)物相比)以便包括或排除與較高級產(chǎn)物相關(guān)聯(lián)的較低級產(chǎn)物的整個集合,這取決于較高級產(chǎn)物是否是匹配。另外的實(shí)施例還可以在針對缺陷或特征增強(qiáng)定位或建議修復(fù)代碼時利用層級關(guān)系,包括通過在層級中進(jìn)行到更高來定位針對具有匹配的更高級產(chǎn)物的缺陷的修復(fù)代碼。
圖4是示出用于提供針對軟件文件的產(chǎn)物的語料庫的系統(tǒng)的示例實(shí)施例的框圖。示例實(shí)施例可以具有能夠與具有多個軟件文件的源430通信的接口420。對于某些實(shí)施例,該接口420可以通信地耦合到本地源430,例如本地硬盤驅(qū)動器或盤。在其他實(shí)施例中,接口420可以是用于通過公共或?qū)S镁W(wǎng)絡(luò)獲取文件的網(wǎng)絡(luò)接口420。這些軟件文件的公共源430的示例包括GitHUB、SourceForge、BitBucket、GoogleCode或常見漏洞和披露系統(tǒng)。專用源的示例包括公司的內(nèi)部網(wǎng)絡(luò)和存儲在其上的文件,包括在共享網(wǎng)絡(luò)驅(qū)動器和私人存儲庫中。該示例系統(tǒng)還具有耦合到接口420以從源430獲取多個軟件文件的一個或多個處理器410。處理器410還可以用于確定針對多個軟件文件中的每個軟件文件的多個產(chǎn)物。這些產(chǎn)物可以是靜態(tài)產(chǎn)物、動態(tài)產(chǎn)物、導(dǎo)出的產(chǎn)物和/或元數(shù)據(jù)產(chǎn)物。對于另外的實(shí)施例,處理器410還可以被配置為將每個軟件文件轉(zhuǎn)換為中間表示并且根據(jù)中間表示確定產(chǎn)物。
示例系統(tǒng)還具有一個或多個存儲設(shè)備440a到440n,其用于存儲針對每個軟件文件的產(chǎn)物,并且耦合到處理器410。這些存儲設(shè)備440a到440n可以是硬盤驅(qū)動器、硬盤驅(qū)動器陣列、其他類型的存儲設(shè)備和分布式存儲,例如通過在Hadoop文件系統(tǒng)(HDFS)上使用Titan和Cassandra提供的。同樣,示例系統(tǒng)可以具有一個處理器410或者采用分布式處理并且具有多于一個的處理器410。另外的實(shí)施例還提供了在接口420與存儲設(shè)備440a到440n之間的直接通信耦合。
圖5是示出用于定位設(shè)計模式的方法的示例實(shí)施例的框圖。設(shè)計模式的示例包括故障、修復(fù)、漏洞、安全補(bǔ)丁、協(xié)議、協(xié)議擴(kuò)展、功能和功能增強(qiáng)。每個設(shè)計模式可以與在軟件項目層級的各個級別處提取的產(chǎn)物(例如,規(guī)范、CG、CFG、定義使用鏈、指令序列、類型和常量)相關(guān)聯(lián)。
示例方法提供訪問具有與多個軟件文件對應(yīng)的多個產(chǎn)物的數(shù)據(jù)庫510。數(shù)據(jù)庫可以是圖數(shù)據(jù)庫、關(guān)系數(shù)據(jù)庫或平面文件。數(shù)據(jù)庫可以位于本地、在專用網(wǎng)絡(luò)上、或通過因特網(wǎng)或云可用。一旦已經(jīng)訪問了數(shù)據(jù)庫,則該方法可以基于針對多個文件中的第一文件的多個產(chǎn)物中的至少一個產(chǎn)物自動標(biāo)識設(shè)計模式520。對于某些示例實(shí)施例,多個產(chǎn)物中的每個產(chǎn)物可以是靜態(tài)產(chǎn)物、動態(tài)產(chǎn)物、導(dǎo)出的產(chǎn)物或元數(shù)據(jù)產(chǎn)物。其他實(shí)施例可以具有不同類型的產(chǎn)物的混合。此外,文件的格式不受限制,并且例如可以是二進(jìn)制代碼格式、源代碼格式或中間表示(IR)格式。
對于某些實(shí)施例,可以通過開發(fā)產(chǎn)物的關(guān)鍵字搜索或自然語言搜索來標(biāo)識設(shè)計模式。例如,源代碼文件的修訂中的內(nèi)聯(lián)代碼注釋可以標(biāo)識被發(fā)現(xiàn)和修復(fù)的缺陷。評論可以使用例如缺陷、故障、錯誤、問題、缺點(diǎn)或失靈等詞。這些字可以用于元數(shù)據(jù)的關(guān)鍵字搜索。提交日志還可以包括描述為什么應(yīng)用新修訂和補(bǔ)丁的文本,例如以解決缺陷或增強(qiáng)特征。此外,可以將訓(xùn)練和反饋應(yīng)用于搜索以改進(jìn)搜索結(jié)果。
另外的示例實(shí)施例可以從CVE源搜索開發(fā)產(chǎn)物,其標(biāo)識文本中的常見漏洞和錯誤,并且可以描述缺陷和可用修復(fù)(如果有的話)。該文本可作為產(chǎn)物被獲取并且被存儲在數(shù)據(jù)庫中。某些源對缺陷編碼,使得代碼可以用作關(guān)鍵字來定位哪個文件包含缺陷。另外,可以在軟件文件的標(biāo)識中考慮和加權(quán)產(chǎn)物的源。例如,與沒有溯源或內(nèi)聯(lián)注釋的存儲庫相比,CVE源在標(biāo)識缺陷中可能更可靠。其他實(shí)施例可以使用例如文件名和修訂號的元數(shù)據(jù)產(chǎn)物來至少初步標(biāo)識軟件文件,并且基于匹配另外的產(chǎn)物(例如CG或CFG)來確認(rèn)標(biāo)識。
本發(fā)明的某些實(shí)施例執(zhí)行示例方法,并且嘗試標(biāo)識針對一些、大多數(shù)或所有源代碼和LLVM IR文件的設(shè)計模式。另外,每當(dāng)將文件被添加到語料庫時,某些實(shí)施例訪問數(shù)據(jù)庫并且嘗試標(biāo)識任何設(shè)計模式。某些實(shí)施例還可以標(biāo)記所標(biāo)識的設(shè)計模式以供稍后使用。
某些實(shí)施例還找到與已經(jīng)被存儲在數(shù)據(jù)庫中的文件相關(guān)聯(lián)的源代碼或LLVM IR中的缺陷的位置。例如,開發(fā)產(chǎn)物可以規(guī)定源代碼中哪里存在缺陷以及補(bǔ)丁中哪里存在修復(fù)。此外,可以分析源代碼或LLVM IR,并且將其與具有缺陷的文件和文件的較新修復(fù)版本進(jìn)行比較,以隔離差異并辨別缺陷和修復(fù)的位置。對于某些實(shí)施例,在開發(fā)產(chǎn)物中標(biāo)識的缺陷類型也可以用于縮小針對缺陷位置的代碼的搜索。另外的實(shí)施例還可以標(biāo)識設(shè)計模式,例如使用標(biāo)簽,并且將標(biāo)識符存儲在針對文件的數(shù)據(jù)庫中。這使得數(shù)據(jù)庫能夠容易地搜索某些缺陷或某些類型的缺陷。這樣的標(biāo)簽的示例包括從針對軟件文件的開發(fā)產(chǎn)物或從源代碼獲取的字符串。該相同的方法可以應(yīng)用于標(biāo)識特征和特征增強(qiáng)并且對它們進(jìn)行標(biāo)記。
對于某些示例實(shí)施例,設(shè)計模式位于軟件文件中。對于某些示例實(shí)施例,設(shè)計模式可以涉及文件之間的交互,例如接口。示例實(shí)施例可以通過使標(biāo)識基于針對多個軟件文件(例如都屬于軟件項目的第一和第二文件)的產(chǎn)物來自動標(biāo)識設(shè)計模式。例如,表示設(shè)計模式(例如,接口不匹配錯誤)的預(yù)先標(biāo)識的模式可以被存儲在數(shù)據(jù)庫中或其他地方,這些地方使得能夠?qū)碜缘谝缓偷诙募漠a(chǎn)物用于標(biāo)識針對這些文件存在接口錯誤。針對示例實(shí)施例的示例設(shè)計模式包括缺陷、修復(fù)、特征、特征增強(qiáng)或預(yù)先標(biāo)識的程序片段。
對于某些示例實(shí)施例,該方法在產(chǎn)物中定位表示缺陷或修復(fù)的字符串。通常,這樣的字符串(例如故障、錯誤或缺陷)、以及關(guān)于修復(fù)的字符串以及在代碼中可以找到字符串的位置存在于開發(fā)產(chǎn)物中。這些開發(fā)產(chǎn)物還可以具有表示特征或特征增強(qiáng)的字符串。
對于某些示例實(shí)施例,設(shè)計模式基于表示設(shè)計模式的預(yù)先標(biāo)識的模式。這些預(yù)先標(biāo)識的模式可以由用戶創(chuàng)建,可以通過與本公開相關(guān)聯(lián)的方法在先前標(biāo)識,或者可以以某種其他方式標(biāo)識。這些預(yù)先標(biāo)識的模式可以對應(yīng)于缺陷、修復(fù)、特征、特征增強(qiáng)或感興趣的項目或其他重要性。
圖6是示出用于定位缺陷的方法的示例實(shí)施例的流程圖。該方法包括訪問具有與多個軟件文件對應(yīng)的多個軟件產(chǎn)物的數(shù)據(jù)庫,例如語料庫610。然后,分析產(chǎn)物以從數(shù)據(jù)量中標(biāo)識模式。例如,該分析可以包括聚類多個產(chǎn)物620。通過聚類數(shù)據(jù),可以找到不被知道包含已知缺陷的文件中的已知缺陷。因此,根據(jù)聚類,示例方法可以基于一個或多個先前標(biāo)識的缺陷標(biāo)識先前未標(biāo)識的缺陷630。
本發(fā)明的某些示例實(shí)施例可以對語料庫使用機(jī)器學(xué)習(xí)。機(jī)器學(xué)習(xí)涉及通過以下方式來學(xué)習(xí)數(shù)據(jù)的層級結(jié)構(gòu):從低級產(chǎn)物開始來捕獲數(shù)據(jù)中的相關(guān)特征,然后建立更復(fù)雜的表示。某些示例實(shí)施例可以對語料庫使用深度學(xué)習(xí)。深度學(xué)習(xí)是基于數(shù)據(jù)的學(xué)習(xí)表示的更廣泛的機(jī)器學(xué)習(xí)方法家族的子集。對于某些實(shí)施例,可以使用自動編碼器用于聚類。
對于某些示例實(shí)施例,可以由一組自動編碼器處理產(chǎn)物以自動發(fā)現(xiàn)未標(biāo)記圖和文檔產(chǎn)物的緊湊表示。圖產(chǎn)物包括可以以圖形式表示的那些產(chǎn)物,例如CG、CFG、UD鏈、DU鏈和DT。然后可以聚類圖產(chǎn)物的緊湊表示以發(fā)現(xiàn)軟件設(shè)計模式。從對應(yīng)的元數(shù)據(jù)產(chǎn)物提取的知識可以用于標(biāo)記設(shè)計模式(例如,故障、修復(fù)、漏洞、安全補(bǔ)丁、協(xié)議、協(xié)議擴(kuò)展、特征和特征增強(qiáng))。
對于某些示例實(shí)施例,自動編碼器是結(jié)構(gòu)化稀疏自動編碼器(SSAE),其可以將向量作為輸入并提取公共特征。對于某些實(shí)施例,為了自動發(fā)現(xiàn)程序的特征,首先以矩陣形式表示所提取的圖產(chǎn)物。很多提取的產(chǎn)物可以表示為鄰接矩陣,包括例如CFG、UD鏈和DU鏈??梢栽谲浖募晚椖繉蛹壗Y(jié)構(gòu)的每個級別處學(xué)習(xí)結(jié)構(gòu)特征。
圖產(chǎn)物中的節(jié)點(diǎn)的數(shù)目可以廣泛地變化;因此,可以提供中間產(chǎn)物作為深度學(xué)習(xí)的輸入。一個這樣的中間產(chǎn)物是圖拉普拉斯算子的前k個特征值,以使得深度學(xué)習(xí)能夠執(zhí)行類似于頻譜聚類的處理。其他中間產(chǎn)物包括聚類系數(shù),以提供圖中的節(jié)點(diǎn)趨向于聚類在一起的程度的度量,例如全局聚類系數(shù)、網(wǎng)絡(luò)平均聚類系數(shù)和傳遞率。另一個中間產(chǎn)物是圖的蔭度(arboricity),即圖如何密集的度量。具有很多邊的圖具有高的蔭度,具有高蔭度的圖具有密集的子圖。另一中間產(chǎn)物是等周數(shù),即圖是否具有瓶頸的數(shù)值度量。這些中間產(chǎn)物捕獲圖的結(jié)構(gòu)的不同方面用于在機(jī)器學(xué)習(xí)方法中使用。
機(jī)器學(xué)習(xí)、包括深度學(xué)習(xí),例如實(shí)施例可以采用使用如下多步驟過程訓(xùn)練的算法:其從簡單的自動編碼器結(jié)構(gòu)開始,并且迭代地改進(jìn)該方法以開發(fā)SSAE。SSAE還可以被訓(xùn)練以從中間產(chǎn)物學(xué)習(xí)特征。自動編碼器學(xué)習(xí)未標(biāo)記數(shù)據(jù)的緊湊表示。它可以通過神經(jīng)網(wǎng)絡(luò)來建模,該神經(jīng)網(wǎng)絡(luò)由至少一個隱藏層組成并且具有相同數(shù)目的輸入和輸出,其學(xué)習(xí)身份函數(shù)的近似。自動編碼器將輸入信號脫水(編碼)為一組基本的描述性參數(shù),并且對這些信號進(jìn)行再水化(解碼)以重新創(chuàng)建原始信號。描述性參數(shù)可以在訓(xùn)練期間被自動選擇以優(yōu)化所有訓(xùn)練信號的再水化。脫水信號的基本性質(zhì)提供了用于將信號分組成簇的基礎(chǔ)。
自動編碼器可以通過將輸入信號映射到較低維度特征空間來降低輸入信號的維度。示例實(shí)施例然后可以對由自動編碼器發(fā)現(xiàn)的特征空間中的代碼執(zhí)行聚類和分類。k均值算法聚類所學(xué)習(xí)的特征。k均值算法是迭代改進(jìn)技術(shù),其將特征分成k個簇,這使所得到的簇均值最小化??梢曰谔崛〉闹黝}的數(shù)目來選擇簇的初始數(shù)目k。搜索潛在簇的數(shù)目非常有效,為很多不同k中的每個計算新的結(jié)果,因?yàn)獒槍均值聚類的操作度量基于歐幾里得距離。示例實(shí)施例可以使用在從其導(dǎo)出聚類特征的軟件文件內(nèi)最頻繁出現(xiàn)的主題的標(biāo)簽來對所得到的簇分類。
盡管特征向量是稀疏和緊湊的,但可能難以僅通過檢查特征向量來理解輸入向量。因此,示例實(shí)施例可以利用與先前學(xué)習(xí)的權(quán)重參數(shù)相關(guān)聯(lián)的先驗(yàn)。給定足夠的語料庫,例如針對“修復(fù)”代碼,參數(shù)空間中的模式應(yīng)當(dāng)出現(xiàn)。示例實(shí)施例可以使用由直到該點(diǎn)收集的數(shù)據(jù)集給出的先驗(yàn)信息將特定模式合并到自動編碼器中。具體地,當(dāng)標(biāo)簽被系統(tǒng)學(xué)習(xí)時,示例實(shí)施例可以將該信息合并到自動編碼器操作中。
示例實(shí)施例可以使用數(shù)據(jù)庫管理(例如,連接、過濾器)和分析操作(例如,奇異值分解(SVD)、雙聚類)的混合。示例實(shí)施例的圖論(例如,譜聚類)和機(jī)器學(xué)習(xí)或深度學(xué)習(xí)算法都可以使用類似的算法原語用于特征提取。SVD還可以用于對用于學(xué)習(xí)算法的輸入數(shù)據(jù)進(jìn)行去噪,并且使用更少的維度來近似數(shù)據(jù),并且因此執(zhí)行數(shù)據(jù)簡化。
示例實(shí)施例可以通過文檔產(chǎn)物的無監(jiān)督語義標(biāo)簽生成(包括通過文本分析)來封裝人隨著時間和跨程序?qū)Υa狀態(tài)的理解。文本分析的示例是潛在狄利克雷分配(LDA)??梢允褂肔DA和主題建模從文檔產(chǎn)物中提取語義信息。這些方法是“詞袋”技術(shù),這些技術(shù)考慮單詞或短語的出現(xiàn),而忽略順序。例如,表示“科學(xué)計算”的袋子可以具有例如“FFT”、“小波”、“sin”和“atan”等種子術(shù)語。示例實(shí)施例可以使用來自源的提取的文檔產(chǎn)物,例如源評論、CG/CFG節(jié)點(diǎn)標(biāo)簽,并且通過對術(shù)語的出現(xiàn)進(jìn)行計數(shù)來提交消息以填充“袋子”。所得到的固定區(qū)間直方圖可以被饋送到受限玻爾茲曼機(jī)(RBM),其是適于文本應(yīng)用的深度學(xué)習(xí)算法的實(shí)現(xiàn)。提取的主題捕獲與所提取的文檔產(chǎn)物相關(guān)聯(lián)的語義信息,并且可以用作通過經(jīng)由自動編碼器的圖產(chǎn)物的無人監(jiān)督學(xué)習(xí)形成的簇的標(biāo)簽(例如,故障/修復(fù)、漏洞/補(bǔ)丁)??梢杂闪硗獾氖纠龑?shí)施例使用的其他形式的文本分析包括自然語言處理、詞法分析和預(yù)測分析。
從文檔產(chǎn)物提取的主題標(biāo)簽可以提供標(biāo)簽信息以通知自動編碼器的結(jié)構(gòu)化。示例實(shí)施例可以基于學(xué)習(xí)的主題、表示順序軟件模式(即,在軟件修訂之前/之后)的語義共性來在語料庫數(shù)據(jù)庫中查詢訓(xùn)練數(shù)據(jù)群體。這些模式可以捕獲嵌入軟件開發(fā)文件(例如提交日志、更改日志和注釋)中的改變,這些改變隨著時間與軟件開發(fā)生命周期相關(guān)聯(lián)。這些改變的關(guān)聯(lián)提供了對與檢測和修復(fù)(例如故障/修復(fù)、漏洞/安全補(bǔ)丁和特征/增強(qiáng))相關(guān)的軟件的演變的深入理解。該信息還可以用于理解和標(biāo)記從產(chǎn)物語料庫自動提取的知識。
圖7示出了圖示根據(jù)本發(fā)明的實(shí)施例的用于標(biāo)識設(shè)計模式的產(chǎn)物的聚類的框圖。可以在軟件文件層級結(jié)構(gòu)(包括系統(tǒng)、程序、函數(shù)和框710)的每個級別處學(xué)習(xí)結(jié)構(gòu)特征??梢葬槍垲?15分析圖產(chǎn)物,例如CG,CFG和DT。這些圖產(chǎn)物然后可以轉(zhuǎn)換成圖不變量特征720。這些圖特征740然后可以被提供作為圖分析模塊760(例如自動編碼器)的輸入、以及所得到的聚類審查被聚類在一起的類似的設(shè)計模式780??梢詫⑽谋?例如來自源代碼文件或來自開發(fā)產(chǎn)物的一個或多個字符串)映射到標(biāo)簽730。這些標(biāo)簽750可以由文本分析模塊770來分析,例如通過使用LDA或其他自然語言處理,并且標(biāo)簽可以與從其導(dǎo)出標(biāo)簽的對應(yīng)發(fā)現(xiàn)的簇780相關(guān)聯(lián)。這些模塊760、770可以用軟件,硬件或其組合來實(shí)現(xiàn)。
圖8示出了圖示用于使用語料庫標(biāo)識軟件的方法的示例實(shí)施例的流程圖。該示例實(shí)施例獲取軟件文件810。文件可以經(jīng)由網(wǎng)絡(luò)接口從公共或?qū)S迷磥慝@取,例如經(jīng)由因特網(wǎng)、云或私人公司的服務(wù)器從公共存儲庫來獲取。某些示例實(shí)施例還可以從本地源(例如本地硬盤驅(qū)動器、便攜式硬盤驅(qū)動器或盤)獲取軟件文件。示例實(shí)施例可以從源獲取單個文件或多個文件,并且可以例如通過使用腳本語言自動地或者通過用戶交互手動地這樣做。示例方法然后可以確定針對軟件文件的多個產(chǎn)物820,例如本文所描述的任何其他產(chǎn)物。示例方法然后可以訪問數(shù)據(jù)庫830,數(shù)據(jù)庫存儲針對多個參考軟件文件中的每個參考軟件文件的多個參考產(chǎn)物。參考產(chǎn)物可以被存儲在語料庫數(shù)據(jù)庫中。對于某些示例實(shí)施例,這些參考文件可以包括先前已經(jīng)被獲取的并且其產(chǎn)物(對于某些實(shí)施例連同軟件文件一起)已經(jīng)被存儲在數(shù)據(jù)庫中的軟件文件。將針對所獲取的軟件文件已經(jīng)確定的產(chǎn)物或其多個子集與被存儲在數(shù)據(jù)庫中的參考產(chǎn)物或其多個子集進(jìn)行比較840。示例實(shí)施例可以通過標(biāo)識具有與多個產(chǎn)物相匹配的多個參考產(chǎn)物的參考軟件文件來標(biāo)識軟件文件850。因?yàn)楸容^的產(chǎn)物和參考產(chǎn)物匹配,所以軟件文件和參考軟件文件被標(biāo)識為是相同的文件。
然后可以比較另外的產(chǎn)物或代碼部分以增加做出正確標(biāo)識的置信水平。置信度可以是固定的或可調(diào)整的,并且可以基于各種各樣的標(biāo)準(zhǔn),例如匹配的產(chǎn)物的數(shù)目、哪些產(chǎn)物匹配、以及數(shù)目和哪些產(chǎn)物的組合。例如,可以對特定數(shù)據(jù)集及其觀察進(jìn)行該調(diào)整。此外,對于某些實(shí)施例,匹配可以包括模糊匹配,例如具有小于100%匹配的百分比的可調(diào)節(jié)設(shè)置,以具有聲明的匹配。
對于某些示例實(shí)施例,在匹配和標(biāo)識過程中可以給予某些產(chǎn)物更多或更少的權(quán)重。例如,常見產(chǎn)物、例如指令是否與32位還是64位處理器相關(guān)聯(lián)可以被給予權(quán)重零或一些其他更小權(quán)重。一些產(chǎn)物在轉(zhuǎn)換下可以是或多或少不變的,并且對于某些示例實(shí)施例,可以相應(yīng)地調(diào)整針對這些產(chǎn)物的權(quán)重。例如,文件名或CG產(chǎn)物可以被認(rèn)為在建立文件的身份中是高信息性的,而某些產(chǎn)物(例如LTS或DT)例如可以被認(rèn)為是更少決定性的并且對于某些示例實(shí)施例和源被給予更小的權(quán)重。另外的實(shí)施例可以給予產(chǎn)物的某些組合更大的權(quán)重以在進(jìn)行比較時標(biāo)識匹配。例如,與使得基本塊產(chǎn)物和DT產(chǎn)物相匹配相比,使得CFG和CG產(chǎn)物相匹配可以在進(jìn)行標(biāo)識時被給予更多的權(quán)重。同樣,在進(jìn)行文件的標(biāo)識時,可以給予不匹配的某些產(chǎn)物更多或更少的權(quán)重。在標(biāo)識過程中評估權(quán)重的另外的示例可以包括表示標(biāo)識閾值,例如以匹配產(chǎn)物的百分比或一些其他度量。另外的實(shí)施例可以改變標(biāo)識閾值,包括基于例如文件的源、文件的類型、時間戳(包括文件的日期)、文件的大小、或者某些產(chǎn)物是否針對該文件不能確定或以其他方式不可用。
另外的實(shí)施例可以通過將軟件文件轉(zhuǎn)換為例如LLVM IR的中間表示并且根據(jù)中間表示確定多個產(chǎn)物中的至少一個產(chǎn)物來確定針對軟件文件的多個產(chǎn)物中的一些產(chǎn)物。其他實(shí)施例可以通過從軟件文件中提取字符串(例如源代碼文件或文檔文件)來確定多個產(chǎn)物中的一些產(chǎn)物。
示例實(shí)施例還可以包括通過分析與所標(biāo)識的參考軟件文件相關(guān)聯(lián)的參考產(chǎn)物中的至少一個參考產(chǎn)物來確定是否存在軟件文件的較新版本。例如,一旦已經(jīng)標(biāo)識了軟件文件,則可以檢查數(shù)據(jù)庫以查看軟件文件的較新修訂是否可用,例如通過檢查對應(yīng)參考文件的修訂號或時間戳、或者可以將參考文件標(biāo)識為另一文件的更老修訂的與數(shù)據(jù)庫中的產(chǎn)物和文件相關(guān)聯(lián)的標(biāo)簽。另外的示例實(shí)施例還可以自動提供軟件文件的較新版本,包括給用戶或公共或?qū)S迷础?/p>
某些另外的實(shí)施例可以通過分析與所標(biāo)識的參考軟件文件相關(guān)聯(lián)的參考產(chǎn)物中的至少一個參考產(chǎn)物來確定是否存在針對軟件文件的補(bǔ)丁。例如,示例實(shí)施例可以檢查與參考軟件文件相關(guān)聯(lián)的產(chǎn)物,并且確定針對文件存在補(bǔ)丁,包括尚未應(yīng)用于軟件文件的補(bǔ)丁。另外的實(shí)施例可以將補(bǔ)丁自動應(yīng)用于軟件文件或者提示用戶他們是否想要應(yīng)用補(bǔ)丁。
某些另外的實(shí)施例可以分析補(bǔ)丁以及針對某些實(shí)施例還可以分析軟件文件(或者參考軟件文件,因?yàn)樗鼈兤ヅ?,以確定與軟件文件中缺陷的修復(fù)對應(yīng)的補(bǔ)丁的修復(fù)部分。針對某些實(shí)施例,該分析可以在獲取軟件文件之前或之后發(fā)生。另外的實(shí)施例可以僅將補(bǔ)丁的修復(fù)部分應(yīng)用于軟件文件,包括自動或提示用戶他們是否想要應(yīng)用補(bǔ)丁的修復(fù)部分。另外的實(shí)施例可以將補(bǔ)丁的修復(fù)部分提供給源以在源處應(yīng)用補(bǔ)丁。此外,補(bǔ)丁和軟件文件的分析可以包括將補(bǔ)丁和軟件文件轉(zhuǎn)換為中間表示,并且根據(jù)中間表示確定多個產(chǎn)物中的至少一個產(chǎn)物。類似地,另外的實(shí)施例可以分析補(bǔ)丁和軟件文件(或者參考軟件文件,因?yàn)樗鼈儽黄ヅ?,以確定與軟件文件中的特征的改進(jìn)或改變對應(yīng)的補(bǔ)丁的特征增強(qiáng)部分。另外的實(shí)施例可以僅將補(bǔ)丁的特征增強(qiáng)部分應(yīng)用于軟件文件,包括自動或提示用戶他們是否想要應(yīng)用補(bǔ)丁的特征增強(qiáng)部分。
另外的示例實(shí)施例可以通過分析與所標(biāo)識的參考軟件文件相關(guān)聯(lián)的參考產(chǎn)物中的至少一個參考產(chǎn)物來確定軟件文件中是否存在缺陷。例如,參考軟件文件可以具有將其標(biāo)識為具有修復(fù)可用的缺陷的產(chǎn)物。另外的實(shí)施例可以自動修復(fù)軟件文件中的缺陷,包括通過用源代碼的修復(fù)塊自動替換源代碼塊或者用中間表示的修復(fù)塊自動替換軟件文件中的中間表示塊。另外的實(shí)施例可以通過用二進(jìn)制補(bǔ)丁替換二進(jìn)制文件的部分來修復(fù)二進(jìn)制文件中的缺陷。對于某些實(shí)施例,修復(fù)的文件可以被發(fā)送到軟件文件的源。另外的實(shí)施例可以提供要被提供給軟件文件的源修復(fù)代碼,以便在源處修復(fù)文件。
圖9是示出用于標(biāo)識代碼的方法的示例實(shí)施例的流程圖。該示例方法可以獲取一個或多個軟件文件910。對于軟件文件,可以確定多個產(chǎn)物920。如果產(chǎn)物已經(jīng)被確定,則某些實(shí)施例可以替代地獲取產(chǎn)物,而不是確定產(chǎn)物??梢栽L問存儲多個參考產(chǎn)物的數(shù)據(jù)庫930。參考產(chǎn)物是如本文中所述的產(chǎn)物,并且可以對應(yīng)于參考軟件文件、參考設(shè)計模式或感興趣的其他代碼塊。數(shù)據(jù)庫可以被存儲在很多位置,例如本地存儲,或者存儲在網(wǎng)絡(luò)驅(qū)動器上,或者可以通過因特網(wǎng)或云訪問,并且還可以跨多個存儲設(shè)備分布。然后,可以通過將與程序片段對應(yīng)的多個產(chǎn)物和與程序片段對應(yīng)的多個參考產(chǎn)物相匹配來標(biāo)識在一個或多個軟件文件中的或與它們相關(guān)聯(lián)的程序片段(例如接口故障)940。程序片段是文件、程序、基本塊、函數(shù)或函數(shù)之間的接口的子部分。程序片段可以小至單個指令,或者與整個文件、程序、基本塊、函數(shù)或接口一樣大。所選擇的部分可以足以以任何期望的置信度來標(biāo)識程序片段,該置信度對于某些實(shí)施例可以是可設(shè)置或可調(diào)整的,并且可以變化,例如上文關(guān)于標(biāo)識文件所描述的。
對于某些實(shí)施例,確定針對軟件文件的產(chǎn)物包括將軟件文件轉(zhuǎn)換為中間表示,并且根據(jù)中間表示確定產(chǎn)物中的至少一個產(chǎn)物。對于某些實(shí)施例,軟件文件和參考軟件文件每個是源代碼格式,或者每個是二進(jìn)制代碼格式。對于另外的實(shí)施例,程序片段對應(yīng)于軟件文件中的缺陷并且已經(jīng)在數(shù)據(jù)庫中被標(biāo)識為對應(yīng)于缺陷。另外的實(shí)施例可以自動修復(fù)軟件文件中的缺陷,或者向用戶提供一個或多個修復(fù)選項以修復(fù)缺陷。某些實(shí)施例可以對修理選項排序,包括例如基于由用戶選擇的一個或多個先前修復(fù)選項,或者基于針對修復(fù)選項的成功的可能性。
圖10是示出根據(jù)本發(fā)明的實(shí)施例的使用軟件文件的數(shù)據(jù)庫語料庫的系統(tǒng)的框圖。示例系統(tǒng)包括可以與具有至少一個軟件文件的源1010通信的接口1020。接口1020還通信地耦合到處理器1030。對于另外的實(shí)施例,接口1020還可以直接耦合到存儲設(shè)備1040。該存儲設(shè)備1040可以是各種各樣公知的存儲設(shè)備或系統(tǒng),例如網(wǎng)絡(luò)或本地存儲設(shè)備,例如單個硬盤驅(qū)動器或具有多個硬盤驅(qū)動器的分布式存儲系統(tǒng)。存儲設(shè)備1040可以存儲參考產(chǎn)物,包括針對多個參考軟件文件中的每個參考軟件文件的參考產(chǎn)物,并且可以通信地耦合到處理器1030。處理器1030可以被配置為引起從源1010獲取軟件文件。該軟件文件的身份以及該文件是否有較新版本可用、是否有補(bǔ)丁可用、或該文件是否包含缺陷或未增強(qiáng)特征都是示例系統(tǒng)可以解決的問題的示例。處理器1030還被配置為確定針對軟件文件的多個產(chǎn)物,訪問存儲設(shè)備1040中的參考產(chǎn)物,將針對軟件文件的產(chǎn)物與存儲在存儲設(shè)備1040中的參考產(chǎn)物進(jìn)行比較,并且通過標(biāo)識具有與比較的針對軟件文件的產(chǎn)物對應(yīng)的參考產(chǎn)物的參考軟件文件來標(biāo)識軟件文件。
在示例系統(tǒng)的另外的實(shí)施例中,處理器1030可以被配置為在存儲設(shè)備1040中有可用于文件的補(bǔ)丁時向軟件文件自動應(yīng)用補(bǔ)丁。在另外的實(shí)施例中,處理器還可以被配置為分析標(biāo)識的補(bǔ)丁和軟件文件以確定是否存在與軟件文件中的缺陷的修復(fù)對應(yīng)的補(bǔ)丁的修復(fù)部分,并且如果存在,則僅將補(bǔ)丁的修復(fù)部分自動應(yīng)用于軟件文件,或提示用戶。
圖10的框圖還可以示出根據(jù)本發(fā)明的實(shí)施例的使用數(shù)據(jù)庫語料庫的另一示例系統(tǒng)。該另一個示出的示例系統(tǒng)包括可以與具有一個或多個軟件文件的源1010通信的接口1020。接口1020還通信地耦合到處理器1030。對于另外的實(shí)施例,接口1020還可以直接耦合到存儲設(shè)備1040。該存儲設(shè)備1040可以是各種各樣公知的存儲設(shè)備或系統(tǒng),例如網(wǎng)絡(luò)或本地存儲設(shè)備,例如單個硬盤驅(qū)動器或具有多個硬盤驅(qū)動器的分布式存儲系統(tǒng)。存儲設(shè)備1040可以存儲參考產(chǎn)物,并且可以通信地耦合到處理器1030。處理器1030可以被配置為引起一個或多個軟件文件被獲取,確定針對一個或多個軟件文件的多個產(chǎn)物,訪問存儲多個參考產(chǎn)物的數(shù)據(jù)庫,以及通過將與程序片段對應(yīng)的多個產(chǎn)物和與程序片段對應(yīng)的多個參考產(chǎn)物相匹配來標(biāo)識針對一個或多個軟件文件的程序片段。對于某些示例實(shí)施例,程序片段已經(jīng)在數(shù)據(jù)庫中被標(biāo)識為對應(yīng)于缺陷。這樣的缺陷的示例包括故障、安全漏洞和協(xié)議缺點(diǎn)。這些缺陷可以在一個或多個軟件文件內(nèi),或者可以與軟件文件之間的一個或多個接口相關(guān)。另外的實(shí)施例還可以使處理器被配置為自動修復(fù)一個或多個軟件文件中的缺陷。對于某些示例實(shí)施例,程序片段在數(shù)據(jù)庫中已經(jīng)被標(biāo)識為對應(yīng)于特征,并且某些實(shí)施例還可以自動提供特征增強(qiáng),包括以源代碼或二進(jìn)制文件的補(bǔ)丁的形式。
修復(fù)
示例實(shí)施例支持用于自動修復(fù)的程序合成,包括通過替換CG節(jié)點(diǎn)(函數(shù))、CFG節(jié)點(diǎn)(基本塊)、特定指令或特定變量和常數(shù)來實(shí)例化所選擇的修復(fù)。這些元素(例如,函數(shù)、基本塊、指令)與具有兼容接口(即,相同數(shù)目的參數(shù)、類型和輸出)的元素可交換,并且可以通過用LLVM IR的修復(fù)塊替換LLVM IR的缺陷塊來轉(zhuǎn)換LLVM IR。
某些實(shí)施例還可以選擇用函數(shù)調(diào)用和具有一個或多個基本塊的函數(shù)調(diào)用來交換基本塊。某些實(shí)施例可以修補(bǔ)源代碼和二進(jìn)制代碼。另外的實(shí)施例還可以當(dāng)元素不存在時創(chuàng)建用于交換的合適元素。高級產(chǎn)物(例如,LTS和Z謂詞)可以用于導(dǎo)出用于軟件補(bǔ)丁的兼容實(shí)現(xiàn)。示例實(shí)施例可以利用所提取的圖表示的層級,首先將層級升級到修復(fù)模式的合適表示,然后(經(jīng)由編譯)將層級降級到具體實(shí)現(xiàn)。產(chǎn)物的層級性質(zhì)可以幫助形成修復(fù)代碼。
示例實(shí)施例可以使得用戶能夠提交目標(biāo)程序(源或二進(jìn)制),并且示例實(shí)施例發(fā)現(xiàn)任何缺陷設(shè)計模式的存在。對于每個缺陷,可以向用戶提供候選修復(fù)策略(即,修復(fù)設(shè)計模式)。用戶可以選擇針對要合成的修復(fù)和要修補(bǔ)的目標(biāo)的策略。某些示例實(shí)施例還可以從用戶選擇中學(xué)習(xí)以對未來的修復(fù)解決方案最佳地評級,并且也可以按評級順序向用戶呈現(xiàn)修復(fù)策略。某些實(shí)施例還可以自主運(yùn)行,修復(fù)整個軟件語料庫上的缺陷或漏洞,包括連續(xù)地、周期性地和/或在設(shè)計環(huán)境中。
除了上面討論的實(shí)施例之外,本發(fā)明可以用于各種各樣的用途。例如,可以在軟件代碼的編程期間使用示例實(shí)施例來輔助程序員,包括標(biāo)識缺陷或建議代碼重用。另外的示例實(shí)施例可以用于發(fā)現(xiàn)缺陷和漏洞并且可選地自動修復(fù)它們。又一其他示例實(shí)施例可以用于優(yōu)化代碼,包括標(biāo)識未使用的代碼、低效代碼和建議代碼以替換效率較低的代碼。
示例實(shí)施例還可以用于風(fēng)險管理和評估,包括關(guān)于在某些代碼中可能存在什么漏洞。另外的實(shí)施例也可以用在設(shè)計認(rèn)證過程中,包括提供軟件文件沒有已知缺陷(例如故障、安全漏洞和協(xié)議缺點(diǎn))的認(rèn)證。
本發(fā)明的又一其他另外的示例實(shí)施例包括:代碼重用發(fā)現(xiàn)器(尋找在代碼庫中執(zhí)行相同事情的代碼)、代碼質(zhì)量測量、對代碼轉(zhuǎn)變器的文本描述、庫生成器、測試案例生成器、代碼數(shù)據(jù)分離器、代碼映射和探索工具、現(xiàn)有代碼的自動架構(gòu)生成、架構(gòu)改進(jìn)建議器、故障/錯誤估計器、無用代碼發(fā)現(xiàn)、代碼特征映射、自動補(bǔ)丁審查器、代碼改進(jìn)決策工具(將特征列表映射到最小改變)、對現(xiàn)有設(shè)計工具(例如,企業(yè)架構(gòu))的擴(kuò)展、替代實(shí)現(xiàn)建議器、代碼探索和學(xué)習(xí)工具(例如,用于教學(xué))、系統(tǒng)級代碼許可證范圍(footprint)和企業(yè)軟件使用映射。
應(yīng)當(dāng)理解,上述示例實(shí)施例可以用很多不同的方式來實(shí)現(xiàn)。在一些情況下,本文中描述的各種方法和機(jī)器可以都用具有中央處理器、存儲器、盤或其他大容量存儲、(多個)通信接口、(多個)輸入/輸出(I/O)設(shè)備和其他外圍設(shè)備的物理、虛擬或混合通用計算機(jī)來實(shí)現(xiàn)。通用計算機(jī)被轉(zhuǎn)換為執(zhí)行上述方法的機(jī)器,例如通過將軟件指令加載到數(shù)據(jù)處理器中,然后引起指令的執(zhí)行以執(zhí)行本文中描述的功能。軟件指令還可以被模塊化,例如具有用于攝取文件以形成語料庫的攝取模塊,用于確定針對語料庫的文件和/或要被標(biāo)識或分析用于設(shè)計模式的文件的產(chǎn)物的分析模塊,用于執(zhí)行機(jī)器學(xué)習(xí)的圖分析模塊和文本分析模塊,用于標(biāo)識文件或設(shè)計模式的標(biāo)識模塊,以及用于修復(fù)代碼或提供更新或修復(fù)的文件的修復(fù)模塊。對于某些示例實(shí)施例,這些模塊可以組合或分離成另外的模塊。
如本領(lǐng)域中已知的,這種計算機(jī)可以包含系統(tǒng)總線,其中總線是用于在計算機(jī)或處理系統(tǒng)的部件之間進(jìn)行數(shù)據(jù)傳送的一組硬件線。總線是連接計算機(jī)系統(tǒng)的不同元件(例如,處理器、盤存儲、存儲器、輸入/輸出端口、網(wǎng)絡(luò)端口等)的基本上共享的(多個)導(dǎo)管,其實(shí)現(xiàn)信息在元件之間傳送。一個或多個中央處理器單元附接到系統(tǒng)總線并且提供計算機(jī)指令的執(zhí)行。還連接到系統(tǒng)總線的通常是用于將各種輸入和輸出設(shè)備(例如鍵盤、鼠標(biāo)、顯示器、打印機(jī)、揚(yáng)聲器等)連接到計算機(jī)的I/O設(shè)備接口。(多個)網(wǎng)絡(luò)接口使得計算機(jī)能夠連接到附接至網(wǎng)絡(luò)的各種其他設(shè)備。存儲器為用于實(shí)現(xiàn)實(shí)施例的計算機(jī)軟件指令和數(shù)據(jù)提供易失性存儲。盤或其他大容量存儲為用于實(shí)現(xiàn)例如本文所述的各種過程的計算機(jī)軟件指令和數(shù)據(jù)提供非易失性存儲。
因此,實(shí)施例通??梢杂糜布?、固件、軟件或其任何組合來實(shí)現(xiàn)。此外,示例實(shí)施例可以完全或部分地駐留在云上,并且可以經(jīng)由因特網(wǎng)或其他網(wǎng)絡(luò)架構(gòu)來訪問。
在某些實(shí)施例中,本文中描述的過程、設(shè)備和處理構(gòu)成計算機(jī)程序產(chǎn)品,包括非暫態(tài)計算機(jī)可讀介質(zhì),例如可移除存儲介質(zhì),例如一個或多個DVD-ROM、CD-ROM、磁盤、磁帶等,其提供用于系統(tǒng)的軟件指令的至少部分。這樣的計算機(jī)程序產(chǎn)品可以通過本領(lǐng)域公知的任何合適的軟件安裝過程來安裝。在另一實(shí)施例中,軟件指令的至少部分也可以通過線纜、通信和/或無線連接來下載。
此外,固件、軟件、例程或指令在本文中可以被描述為執(zhí)行數(shù)據(jù)處理器的某些動作和/或功能。然而,應(yīng)當(dāng)理解,本文中包含的這樣的描述僅僅是為了方便,并且這樣的動作實(shí)際上起因于計算設(shè)備、處理器、控制器或執(zhí)行固件、軟件、例程、指令等的其他設(shè)備。
還應(yīng)當(dāng)理解,流程圖、框圖和網(wǎng)絡(luò)圖可以包括更多或更少的元件,這些元件不同地布置或者不同地表示。但是還應(yīng)當(dāng)理解,某些實(shí)現(xiàn)可以規(guī)定圖示以特定方式實(shí)現(xiàn)的實(shí)施例的執(zhí)行的塊和網(wǎng)絡(luò)圖以及塊和網(wǎng)絡(luò)圖的數(shù)目。
因此,另外的實(shí)施例還可以用各種計算機(jī)體系結(jié)構(gòu)、物理、虛擬、云計算機(jī)和/或其某種組合來實(shí)現(xiàn),因此,本文中描述的數(shù)據(jù)處理器僅用于說明的目的,而非作為實(shí)施例的限制。
雖然已經(jīng)參考其示例實(shí)施例具體地示出和描述了本發(fā)明,但是本領(lǐng)域技術(shù)人員將理解,可以在不脫離由所附權(quán)利要求包括的本發(fā)明的范圍的情況下在形式和細(xì)節(jié)方面做出各種變化。