本申請(qǐng)要求2014年6月13日提交的美國(guó)臨時(shí)申請(qǐng)No.62/012,127的權(quán)益。上述申請(qǐng)的全部教導(dǎo)內(nèi)容通過(guò)引用而被整體結(jié)合到本文中。
政府支持
本發(fā)明是根據(jù)來(lái)自美國(guó)空軍的許可號(hào)FA8750-14-C-0056和來(lái)自國(guó)防高級(jí)研究項(xiàng)目管理局的許可號(hào)FA8750-15-C-0242在政府支持下完成的。政府在本發(fā)明中具有一些權(quán)益。
背景技術(shù):
現(xiàn)在,軟件開發(fā)、維護(hù)以及修復(fù)是手動(dòng)過(guò)程。軟件供應(yīng)商隨時(shí)間推移而規(guī)劃、實(shí)現(xiàn)、文件編制、測(cè)試、部署和維護(hù)計(jì)算機(jī)程序。初始的規(guī)劃、實(shí)現(xiàn)、文件編制、測(cè)試和部署常常是不完整的,并且總是缺少期望的特征或包含缺陷。許多供應(yīng)商使用生命周期維護(hù)計(jì)劃以通過(guò)隨著軟件的成熟推送迭代修正版、安全補(bǔ)丁以及特征增強(qiáng)來(lái)解決這些缺點(diǎn)。
在全世界數(shù)十億的線路中部署了大量的軟件代碼,并且花費(fèi)大量的時(shí)間和金錢來(lái)解決維護(hù)和修正版。歷史上,軟件維護(hù)是自組織且是反應(yīng)性(即,對(duì)錯(cuò)誤報(bào)告、安全漏洞報(bào)告以及用戶針對(duì)特征增強(qiáng)的請(qǐng)求進(jìn)行響應(yīng))的手動(dòng)過(guò)程。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的實(shí)施方式有助于使軟件開發(fā)、維護(hù)以及修復(fù)生命周期的關(guān)鍵方面自動(dòng)化,包括例如找到程序缺陷,諸如錯(cuò)誤(代碼中的錯(cuò)誤)、安全漏洞以及協(xié)議缺陷。本發(fā)明的示例性實(shí)施方式提供了可以利用大量軟件文件(包括公開可用的那些軟件文件或?qū)S密浖?的系統(tǒng)和方法。
示例性實(shí)施方式中的特定實(shí)施方式可以自動(dòng)地識(shí)別用于軟件文件的最新版本或補(bǔ)丁。附加實(shí)施方式可以自動(dòng)地對(duì)已知存在于特定軟件文件中的設(shè)計(jì)模式(諸如軟件缺陷(例如,錯(cuò)誤、漏洞、協(xié)議缺陷)和修復(fù)進(jìn)行定位。其它實(shí)施方式可以通過(guò)在軟件文件(對(duì)于該軟件文件,先前并不知道該文件包含缺陷)中對(duì)已知缺陷進(jìn)行定位來(lái)利用該已知缺陷。附加實(shí)施方式可以自動(dòng)地定位設(shè)計(jì)模式,諸如識(shí)別源或二進(jìn)制代碼的各部分,以識(shí)別文件、程序、函數(shù)或代碼塊。
根據(jù)本發(fā)明的一個(gè)實(shí)施方式,一種用于提供語(yǔ)料庫(kù)(corpus)的示例性方法包括:獲得多個(gè)軟件文件,針對(duì)所述軟件文件的每一個(gè)確定多個(gè)產(chǎn)物(artifacts),并將針對(duì)所述軟件文件的每一個(gè)的產(chǎn)物存儲(chǔ)在數(shù)據(jù)庫(kù)中。附加實(shí)施方式通過(guò)將軟件文件的每一個(gè)轉(zhuǎn)換成中間表示并根據(jù)用于軟件文件的每一個(gè)的中間表示來(lái)確定產(chǎn)物中的至少一個(gè),而確定針對(duì)軟件文件的每一個(gè)的一些產(chǎn)物。一些示例性實(shí)施方式通過(guò)從所述多個(gè)軟件文件中的至少一些提取字符串,來(lái)確定用于軟件文件的每一個(gè)的產(chǎn)物中的至少一些。
附加實(shí)施方式還可以自動(dòng)地獲得軟件文件,包括通過(guò)使多個(gè)計(jì)算機(jī)共同地獲得軟件文件,諸如從公共軟件儲(chǔ)存庫(kù)獲取。附加實(shí)施方式可以在所述多個(gè)軟件文件中定位構(gòu)建(build)文件(諸如autocomf文件、cmake文件、automake文件、make文件以及供應(yīng)商指令)并使用該構(gòu)建文件來(lái)生成編譯器調(diào)用。特定實(shí)施方式可以通過(guò)首先使用系統(tǒng)調(diào)用掛鉤從原始構(gòu)建過(guò)程獲得構(gòu)建步驟而生成編譯器調(diào)用。系統(tǒng)調(diào)用掛鉤是可以攔截(也稱為鉤住)調(diào)用、消息或事件(包括攔截操作系統(tǒng)調(diào)用或在軟件組件之間傳遞的調(diào)用)的代碼。附加實(shí)施方式還可以將編譯器調(diào)用轉(zhuǎn)換成底層虛擬機(jī)(LLVM)前端調(diào)用。針對(duì)特定實(shí)施方式,轉(zhuǎn)換編譯器調(diào)用包括執(zhí)行鉤住,諸如s軌跡鉤住。針對(duì)特定實(shí)施方式,可以對(duì)LLVM前端調(diào)用進(jìn)行修改或設(shè)備化以產(chǎn)生產(chǎn)物。針對(duì)一些實(shí)施方式,使用構(gòu)建文件來(lái)生成編譯器調(diào)用包括嘗試使用構(gòu)建文件來(lái)進(jìn)行至少部分地完成的構(gòu)建,其是進(jìn)行編譯但并未適當(dāng)?shù)劓溄拥臉?gòu)建文件。針對(duì)特定實(shí)施方式,使用構(gòu)建文件是自動(dòng)地使用的。針對(duì)特定示例性實(shí)施方式,所述多個(gè)產(chǎn)物可以包括靜態(tài)產(chǎn)物、動(dòng)態(tài)產(chǎn)物、導(dǎo)出產(chǎn)物和/或元數(shù)據(jù)產(chǎn)物。針對(duì)特定示例性實(shí)施方式,所述多個(gè)產(chǎn)物可以包括圖形產(chǎn)物和/或開發(fā)產(chǎn)物。針對(duì)特定實(shí)施方式,所述多個(gè)軟件文件包括軟件包的至少一個(gè)修訂版,其是文件與關(guān)于那些文件的信息的組合件。特定附加實(shí)施方式還包括在軟件包的修訂版的產(chǎn)物中的至少一些之間的多個(gè)關(guān)系,并且該關(guān)系被存儲(chǔ)在數(shù)據(jù)庫(kù)中。
附加示例性實(shí)施方式還可以將軟件文件中的一個(gè)或多個(gè)分布在多個(gè)計(jì)算機(jī)之間,并且使計(jì)算機(jī)共同地將軟件文件的每一個(gè)轉(zhuǎn)換成中間表示且根據(jù)用于軟件文件的每一個(gè)的中間表示來(lái)確定產(chǎn)物中的至少一個(gè)。其它附加實(shí)施方式還可以生成用于軟件文件的每一個(gè)的產(chǎn)物并將其布置成分級(jí)交互關(guān)系。特定示例性實(shí)施方式還可以將軟件文件存儲(chǔ)在數(shù)據(jù)庫(kù)中。
針對(duì)本發(fā)明的一些附加實(shí)施方式,確定用于軟件文件的每一個(gè)的產(chǎn)物包括在設(shè)備化環(huán)境(諸如虛擬機(jī)、模擬器或系統(tǒng)管理程序)中運(yùn)行軟件文件。此特征允許確定多種附加產(chǎn)物,并且可以支持許多操作系統(tǒng)。
針對(duì)特定示例性實(shí)施方式,產(chǎn)物可以包括調(diào)用圖、控制流程圖、use-def鏈、def-use鏈、支配樹、基本塊、變量、常量、分支語(yǔ)義以及協(xié)議。針對(duì)特定示例性實(shí)施方式,產(chǎn)物可以包括系統(tǒng)調(diào)用軌跡和執(zhí)行軌跡。針對(duì)特定示例性實(shí)施方式,產(chǎn)物可以包括循環(huán)不變量、類型信息、Z符號(hào)(Z notation)以及標(biāo)簽遷移系統(tǒng)表示。針對(duì)一些示例性實(shí)施方式,產(chǎn)物可以包括內(nèi)聯(lián)代碼注釋、提交歷史、文件編制文件以及公共漏洞和暴露源入口。示例性方法的特定附加實(shí)施方式還可以自動(dòng)地從軟件儲(chǔ)存庫(kù)檢索軟件文件。針對(duì)特定示例性實(shí)施方式,軟件文件采取源代碼格式或二進(jìn)制代碼格式。
本發(fā)明的附加示例性實(shí)施方式是一種用于提供數(shù)據(jù)庫(kù)語(yǔ)料庫(kù)的裝置。示例性裝置是可以存儲(chǔ)用于軟件文件的產(chǎn)物的一個(gè)或多個(gè)存儲(chǔ)設(shè)備,其中可以根據(jù)軟件文件的中間表示來(lái)確定所述產(chǎn)物中的至少一個(gè)。
附加示例性實(shí)施方式是一種用于提供語(yǔ)料庫(kù)的系統(tǒng),該系統(tǒng)包括:接口,其能夠與具有多個(gè)軟件文件的源進(jìn)行通信;一個(gè)或多個(gè)存儲(chǔ)設(shè)備,其用于存儲(chǔ)用于軟件文件的每一個(gè)的產(chǎn)物;以及處理器,該處理器被通信耦合到所述接口和所述存儲(chǔ)設(shè)備,并被配置成:從所述源獲得所述多個(gè)軟件文件,并針對(duì)所述軟件文件的每一個(gè)確定產(chǎn)物。針對(duì)特定實(shí)施方式,可以自動(dòng)地獲得所述文件,并且可以自動(dòng)地完成確定產(chǎn)物。
針對(duì)示例性系統(tǒng)的特定實(shí)施方式,所述接口可以是網(wǎng)絡(luò)接口。針對(duì)特定示例性實(shí)施方式,所述處理器還被配置成通過(guò)將軟件文件的每一個(gè)轉(zhuǎn)換成中間表示并根據(jù)用于軟件文件的每一個(gè)的中間表示來(lái)確定一些產(chǎn)物,來(lái)確定所述產(chǎn)物中的一些。針對(duì)特定示例性實(shí)施方式,所述處理器還被配置成通過(guò)從軟件文件中的至少一些提取一串字符來(lái)確定所述產(chǎn)物中的一些。針對(duì)附加示例性實(shí)施方式,所述處理器被配置成自動(dòng)地從軟件儲(chǔ)存庫(kù)檢索軟件文件。
本發(fā)明的另一示例性實(shí)施方式是其上存儲(chǔ)有可執(zhí)行程序的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中所述程序命令處理設(shè)備執(zhí)行以下步驟:自動(dòng)地獲得軟件文件;通過(guò)以下操作來(lái)針對(duì)軟件文件的每一個(gè)確定產(chǎn)物:(i)將軟件文件的每一個(gè)轉(zhuǎn)換成中間表示,(ii)根據(jù)用于軟件文件的每一個(gè)的中間表示來(lái)確定一些產(chǎn)物,以及(iii)通過(guò)從軟件文件中的至少一些提取一串字符來(lái)確定一些產(chǎn)物;以及,將用于軟件文件的每一個(gè)的所述多個(gè)產(chǎn)物存儲(chǔ)在數(shù)據(jù)庫(kù)中。
附圖說(shuō)明
根據(jù)如附圖中所示的本發(fā)明的示例性實(shí)施方式的以下更特定描述,前述內(nèi)容將是顯見的,在附圖中相同的附圖標(biāo)記貫穿不同視圖指代相同部分。附圖不一定按比例,而是著重于圖示本發(fā)明的實(shí)施方式。
圖1是圖示出用于提供用于軟件文件的語(yǔ)料庫(kù)的方法的示例性實(shí)施方式的流程圖。
圖2是圖示出根據(jù)本發(fā)明的實(shí)施方式的用以從用于語(yǔ)料庫(kù)的輸入軟件文件提取中間表示(IR)的示例性處理的流程圖。
圖3是圖示出根據(jù)本發(fā)明的實(shí)施方式的用于軟件文件的產(chǎn)物之間的分級(jí)關(guān)系的框圖。
圖4是圖示出用于提供用于軟件文件的產(chǎn)物的語(yǔ)料庫(kù)的系統(tǒng)的示例性實(shí)施方式的框圖。
圖5是圖示出用于識(shí)別設(shè)計(jì)模式的方法的示例性實(shí)施方式的框圖。
圖6是圖示出用于識(shí)別缺陷的方法的示例性實(shí)施方式的流程圖。
圖7是圖示出根據(jù)本發(fā)明的實(shí)施方式的用于識(shí)別設(shè)計(jì)模式的產(chǎn)物的聚類的框圖。
圖8是圖示出用于使用語(yǔ)料庫(kù)來(lái)識(shí)別軟件文件的方法的示例性實(shí)施方式的流程圖。
圖9是圖示出用于識(shí)別程序片段的方法的示例性實(shí)施方式的流程圖。
圖10是圖示出根據(jù)本發(fā)明的實(shí)施方式的使用所述語(yǔ)料庫(kù)的系統(tǒng)的框圖。
具體實(shí)施方式
下面是本發(fā)明的示例性實(shí)施方式的描述。在本文中引用的任何專利或公開的全部教導(dǎo)內(nèi)容被通過(guò)引用結(jié)合到本文中。
根據(jù)本公開的示例性實(shí)施方式的軟件分析允許利用來(lái)自現(xiàn)有軟件文件的知識(shí),所述現(xiàn)有文件包括來(lái)自公開可用源或作為專用軟件的文件。此知識(shí)然后可以應(yīng)用于其它軟件文件,包括修復(fù)缺陷、識(shí)別漏洞、識(shí)別協(xié)議缺陷或建議代碼改進(jìn)。
本發(fā)明的示例性實(shí)施方式可以針對(duì)軟件分析的變化方面,包括創(chuàng)建、更新、維護(hù)或者以其他方式提供軟件文件的語(yǔ)料庫(kù)和用于知識(shí)數(shù)據(jù)庫(kù)的關(guān)于軟件文件的相關(guān)產(chǎn)物。根據(jù)本發(fā)明的各方面,此語(yǔ)料庫(kù)可以被用于多種目的,包括自動(dòng)地識(shí)別軟件文件的更新版本、可用于軟件文件的補(bǔ)丁、已知具有缺陷的文件中的這些缺陷以及先前未被已知包含這些錯(cuò)誤的文件中的已知缺陷。本發(fā)明的實(shí)施方式還利用來(lái)自語(yǔ)料庫(kù)的知識(shí)來(lái)解決這些問(wèn)題。
圖1是圖示出根據(jù)本發(fā)明的實(shí)施方式的用于語(yǔ)料庫(kù)的輸入軟件文件的示例性處理的流程圖。首先示出的步驟是獲得多個(gè)軟件文件110。這些軟件文件可以采取源代碼格式(其通常是純文本),或者采取二進(jìn)制代碼格式或一些其它格式。此外,針對(duì)本發(fā)明的特定示例性實(shí)施方式,源代碼格式可以是可被編譯的任何計(jì)算機(jī)語(yǔ)言,包括Ada、C/C++、D、Erlang、Haskell、Java、Lua、Objective C/C++、PHP、Pure、Python以及Ruby。針對(duì)特定附加示例性實(shí)施方式,還可以獲得解釋語(yǔ)言以供本發(fā)明的實(shí)施方式使用,包括PERL和bash腳本。
獲得的軟件文件不僅包括源代碼或二進(jìn)制文件,而且可以包括與那些文件或相應(yīng)軟件項(xiàng)目相關(guān)聯(lián)的任何文件。例如,軟件文件還包括關(guān)聯(lián)構(gòu)建文件、make文件、庫(kù)、文件編制文件、提交日志、修訂歷史、bugzilla入口、公共漏洞和暴露(CVE)條目及其它非結(jié)構(gòu)化文本。
可以從各種源獲得軟件文件。例如,可以通過(guò)網(wǎng)絡(luò)接口經(jīng)由因特網(wǎng)從諸如GitHUB、SourceForge、BitBucket、GoogleCode或公共漏洞和暴露系統(tǒng)之類的公開可用軟件儲(chǔ)存庫(kù)(諸如由MITRE公司維護(hù)的軟件儲(chǔ)存庫(kù))來(lái)獲得軟件文件。一般地,這些儲(chǔ)存庫(kù)包含文件和對(duì)該文件所進(jìn)行的改變的歷史。并且,例如,可以提供統(tǒng)一資源定位符(URL)以指向可以從其獲得文件的站點(diǎn)。還可以經(jīng)由接口從私有網(wǎng)絡(luò)獲得或者從本地硬盤驅(qū)動(dòng)器或其它存儲(chǔ)設(shè)備本地獲得軟件文件。該接口提供到源的通信耦合。
本發(fā)明的示例性實(shí)施方式可以獲得從源可獲得的一些、大多數(shù)或所有文件。此外,一些示例性實(shí)施方式還使獲得文件自動(dòng)化,并且例如可以自動(dòng)地下載文件、整個(gè)軟件項(xiàng)目(例如,修訂歷史、提交日志、源代碼)、項(xiàng)目或程序的所有修訂版、目錄中的所有文件或從源可獲得的所有文件。一些實(shí)施方式通過(guò)針對(duì)整個(gè)儲(chǔ)存庫(kù)的每個(gè)修訂版進(jìn)行爬取來(lái)獲得所有可用軟件文件。特定示例性實(shí)施方式獲得用于語(yǔ)料庫(kù)中的每個(gè)軟件項(xiàng)目的整個(gè)源控制儲(chǔ)存庫(kù),以促進(jìn)自動(dòng)地獲得用于該項(xiàng)目的所有關(guān)聯(lián)文件,包括獲得每個(gè)軟件文件修訂版。用于儲(chǔ)存庫(kù)的示例性源控制系統(tǒng)包括Git、Mercurial、Subversion、Concurrent Versions System(并發(fā)版本系統(tǒng))、BitKeeper以及Perforce。特定實(shí)施方式還可以連續(xù)地或周期性地核對(duì)源,以辨別該源是否已被改變或更新,并且如果是這樣,則可以僅僅從該源獲得該改變或更新,或者還再次獲得所有軟件文件。許多源具有確定對(duì)源的改變的方法,諸如示例性實(shí)施方式在從源獲得更新時(shí)可以使用的添加日期或改變?nèi)掌谧侄巍?/p>
本發(fā)明的特定示例性實(shí)施方式還可以分別地獲得庫(kù)軟件文件,所述庫(kù)軟件文件可以在儲(chǔ)存庫(kù)不包含這些庫(kù)的情況下由從儲(chǔ)存庫(kù)獲得的源代碼文件用來(lái)解決對(duì)此類文件的需要。這些實(shí)施方式中的特定實(shí)施方式嘗試獲得合理地從任何公開源可用的或者從軟件供應(yīng)商獲得的任何庫(kù)軟件文件,以便包括在語(yǔ)料庫(kù)中。另外,特定實(shí)施方式允許用戶提供由軟件文件使用的庫(kù)或者識(shí)別所使用的庫(kù),以使得可以獲得這些庫(kù)。一些實(shí)施方式抓取用于每個(gè)項(xiàng)目的軟件文件,以識(shí)別由該項(xiàng)目使用的庫(kù),使得這些庫(kù)可以被獲得且也被安裝,如果需要的話。
根據(jù)本發(fā)明的示例性方法中的下一步驟是針對(duì)所述多個(gè)軟件文件120中的每一個(gè)確定多個(gè)產(chǎn)物(artifacts)。軟件產(chǎn)物可以描述軟件文件的功能、架構(gòu)或設(shè)計(jì)。產(chǎn)物類型的示例包括靜態(tài)產(chǎn)物、動(dòng)態(tài)產(chǎn)物、導(dǎo)出產(chǎn)物以及元數(shù)據(jù)產(chǎn)物。
示例性方法的最后一個(gè)步驟是將針對(duì)所述多個(gè)軟件文件中的每一個(gè)的所述多個(gè)產(chǎn)物存儲(chǔ)在數(shù)據(jù)庫(kù)130中。所述多個(gè)產(chǎn)物以這樣的方式存儲(chǔ),該方式使得這多個(gè)產(chǎn)物可以被識(shí)別為對(duì)應(yīng)于根據(jù)其來(lái)確定多個(gè)產(chǎn)物的特定軟件文件。此識(shí)別可以以眾所周知的各種方式中的任何一個(gè)來(lái)完成,諸如入數(shù)據(jù)庫(kù)架構(gòu)(schema)所表示的數(shù)據(jù)庫(kù)中的字段、指針、所存儲(chǔ)的位置或者任何其它標(biāo)識(shí)符,諸如文件名。屬于同一項(xiàng)目或構(gòu)建的文件可以被同樣地跟蹤,以使得可以保持關(guān)系。
針對(duì)不同的實(shí)施方式,數(shù)據(jù)庫(kù)可以采取不同的形式,諸如圖形數(shù)據(jù)庫(kù)、關(guān)系數(shù)據(jù)庫(kù)或平面文件。一個(gè)優(yōu)選實(shí)施方式采用OrientDB,其是由Orient Technologies所領(lǐng)導(dǎo)的OrientDB Open Source Project(開源項(xiàng)目)提供的分布式圖形數(shù)據(jù)庫(kù)。另一優(yōu)選實(shí)施方式采用Titan(其是針對(duì)存儲(chǔ)并查詢跨多機(jī)器聚類分布的圖形而被優(yōu)化的可縮放圖形數(shù)據(jù)庫(kù))以及Apache Cassandra存儲(chǔ)后端。特定示例性實(shí)施方式還可以采用來(lái)自Paradigm4的SciDB,其是也存儲(chǔ)圖形產(chǎn)物并對(duì)其進(jìn)行操作的陣列數(shù)據(jù)庫(kù)。
一般地可以從源代碼文件、二進(jìn)制文件或其它產(chǎn)物確定靜態(tài)產(chǎn)物、動(dòng)態(tài)產(chǎn)物、導(dǎo)出產(chǎn)物以及元數(shù)據(jù)產(chǎn)物。下面提供了這些類型的產(chǎn)物的示例。示例性實(shí)施方式可以針對(duì)源代碼或二進(jìn)制軟件文件確定這些產(chǎn)物中的一個(gè)或多個(gè)。特定實(shí)施方式并不確定這些產(chǎn)物類型中的每一個(gè)或者用于特定類型的每個(gè)產(chǎn)物,而是替代地,可以確定產(chǎn)物類型的子集和/或一個(gè)類型內(nèi)的產(chǎn)物的子集,和/或根本不確定特定類型。
靜態(tài)產(chǎn)物(static artifacts)
用于軟件文件的靜態(tài)產(chǎn)物包括調(diào)用圖、控制流程圖、use-def鏈、def-use鏈、支配樹、基本塊、變量、常量、分支語(yǔ)義以及協(xié)議。
調(diào)用圖(CG)是被一函數(shù)調(diào)用的各個(gè)函數(shù)的有向圖。GG表示高級(jí)程序結(jié)構(gòu),并且被描繪為節(jié)點(diǎn),圖中的每個(gè)節(jié)點(diǎn)均表示函數(shù),并且節(jié)點(diǎn)之間的每個(gè)邊是有向的且顯示一個(gè)函數(shù)是否可以調(diào)用另一函數(shù)。
控制流圖(CFG)是函數(shù)內(nèi)部的基本塊之間的控制流的有向圖。CFG表示函數(shù)級(jí)程序結(jié)構(gòu)。CFG中的每個(gè)節(jié)點(diǎn)表示基本塊,并且節(jié)點(diǎn)之間的邊是有向的并示出流中的潛在路徑。
Use-Def(UD)和Def-Use鏈(DU)是在代碼的基本塊中執(zhí)行的輸入(使用)、輸出(定義)以及操作的無(wú)環(huán)有向圖。例如,UD鏈?zhǔn)亲兞康氖褂煤驮诓徊迦胫囟x的情況下可以到達(dá)該使用的該變量的所有定義。DU鏈?zhǔn)亲兞康亩x和在不插入重定義的情況下從該定義所能到達(dá)的所有使用。這些鏈?zhǔn)沟媚軌蜿P(guān)于被接受的輸入類型、所生成的輸出類型以及在代碼的基本塊內(nèi)部執(zhí)行的操作,來(lái)進(jìn)行代碼的基本塊的語(yǔ)義分析。
支配樹(DT)是表示CGF中哪些節(jié)點(diǎn)支配其它節(jié)點(diǎn)(在其路徑中)的矩陣。例如,如果從入口節(jié)點(diǎn)到第二節(jié)點(diǎn)的每個(gè)路徑必須經(jīng)歷第一節(jié)點(diǎn),則第一節(jié)點(diǎn)支配第二節(jié)點(diǎn)。以Pre(從入口向前)和Post(從出口向后)形式來(lái)表示DT。當(dāng)路徑改變到CGF中的特定節(jié)點(diǎn)時(shí),DT突出顯示。
基本塊是CGF的每個(gè)節(jié)點(diǎn)內(nèi)部的指令和操作數(shù)??梢员容^基本塊,并且可以產(chǎn)生兩個(gè)基本塊之間的相似性度量。
變量(Variable)是用于信息及其類型的存儲(chǔ)單位,表示針對(duì)任何函數(shù)參數(shù)、局部變量或全局變量其可以存儲(chǔ)的信息的類型,并且如果有默認(rèn)值可用的話還包括默認(rèn)值。它們可以提供關(guān)于程序的初始狀態(tài)和基本約束,并且示出類型或初始值方面的變化,其可以影響程序行為。
常量(Constants)是任何常量的類型和值,并且可以提供關(guān)于程序的初始狀態(tài)和基本約束。它們可以示出類型或初始值的變化,其可以影響程序行為。
分支語(yǔ)義(Branch Semantics)是if語(yǔ)句和循環(huán)內(nèi)部的布爾值評(píng)估。分支控制基本塊被執(zhí)行的條件。
協(xié)議(Protocols)是協(xié)議、庫(kù)、系統(tǒng)調(diào)用以及程序所使用的其它已知函數(shù)的名稱和引用。
本發(fā)明的示例性實(shí)施方式可以自動(dòng)地從諸如由公開可用的LLVM(前面的底層虛擬機(jī))編譯器基礎(chǔ)設(shè)施項(xiàng)目所提供的軟件源代碼文件的中間表示(IR)來(lái)確定靜態(tài)產(chǎn)物。LLVM IR是底層公共語(yǔ)言,其可以有效地表示高級(jí)語(yǔ)言且獨(dú)立于指令集架構(gòu)(ISA),諸如ARM、X86、X64、MIPS以及PPC??梢允褂糜糜诓煌?jì)算機(jī)語(yǔ)言的不同LLVM編譯器(也稱為前端)來(lái)將源代碼變換成公共LLVM IR。用于至少Ada、C/C++、D、Erlang、Haskell、Java、Lua、Objective C/C++、PHP、Pure、Python以及Ruby的前端是公開可用的。此外,用于附加語(yǔ)言的前端可以被容易地編程。LLVM還具有可用的優(yōu)化器和后端,該后端可以將LLVM IR變換成用于多種不同ISA的機(jī)器語(yǔ)言。附加示例性實(shí)施方式可以從源代碼文件確定靜態(tài)產(chǎn)物。
圖2是圖示出根據(jù)本發(fā)明的實(shí)施方式的可以被利用的用于語(yǔ)料庫(kù)的輸入軟件文件的附加示例性處理的流程圖。除其它的之外,示例性實(shí)施方式還可以獲得源代碼205和二進(jìn)制代碼210軟件文件兩者。當(dāng)LLVM編譯器220可用于源代碼文件205的語(yǔ)言時(shí),可以使用用于該語(yǔ)言的LLVM編譯器220來(lái)將源代碼翻譯成LLVM IR 250。針對(duì)沒(méi)有可用LLVM編譯器的編譯語(yǔ)言,首先可以利用針對(duì)該語(yǔ)言的任何支持的編譯器215將源代碼205編譯成二進(jìn)制文件230。然后,使用諸如Fracture之類的解編譯器235(其是由Draper Laboratory提供的公開可用開源解編譯器)將二進(jìn)制文件230解編譯。解編譯器235將機(jī)器代碼230翻譯成LLVM IR 250。針對(duì)以二進(jìn)制形式210獲得的文件,該形式是機(jī)器代碼230,使用解編譯器235將其解編譯以獲得LLVM IR 250。示例性實(shí)施方式可以從LLVM IR提取語(yǔ)言無(wú)關(guān)且ISA無(wú)關(guān)的產(chǎn)物。
本發(fā)明的示例性實(shí)施方式可以自動(dòng)地獲得用于每個(gè)源代碼軟件文件的IR。例如,示例性實(shí)施方式可以自動(dòng)地在儲(chǔ)存庫(kù)中搜索用于標(biāo)準(zhǔn)構(gòu)建文件(諸如autocomf、cmake、automake或make文件)或供應(yīng)商指令的項(xiàng)目。示例性實(shí)施方式可以通過(guò)監(jiān)視構(gòu)建過(guò)程并將編譯器調(diào)用轉(zhuǎn)換成用于源代碼的特定語(yǔ)言的LLVM前端調(diào)用,來(lái)自動(dòng)地選擇性地嘗試使用此類文件來(lái)構(gòu)建項(xiàng)目。用于構(gòu)建文件的選擇過(guò)程可以逐步通過(guò)每個(gè)文件以確定哪些存在并提供已完成產(chǎn)物或部分完成產(chǎn)物。
附加示例性實(shí)施方式可以在自動(dòng)地從儲(chǔ)存庫(kù)獲得文件、將文件轉(zhuǎn)換成LLVM IR和/或針對(duì)文件確定產(chǎn)物時(shí),使用分布式計(jì)算機(jī)系統(tǒng)。示例性分布式系統(tǒng)可以使用主計(jì)算機(jī)來(lái)向外推送項(xiàng)目和構(gòu)建至從機(jī)器以進(jìn)行處理。從設(shè)備每個(gè)可以處理其被分配的項(xiàng)目、版本、修訂版或構(gòu)建,并且可以將源或二進(jìn)制文件翻譯成LLVM IR和/或確定產(chǎn)物并提供結(jié)果以便存儲(chǔ)在語(yǔ)料庫(kù)中。一些示例性實(shí)施方式可以采用Hadoop,其是用于非常大的數(shù)據(jù)集的分布式存儲(chǔ)和分布式處理的開源軟件框架。還可以將從源儲(chǔ)存庫(kù)獲得文件分布在一組機(jī)器之間。
根據(jù)示例性實(shí)施方式還可以將軟件文件和LLVM IR存儲(chǔ)在語(yǔ)料庫(kù)中,包括用分布式存儲(chǔ)庫(kù)。示例性實(shí)施方式還可以確定軟件文件或LLVM IR代碼已被存儲(chǔ)在數(shù)據(jù)庫(kù)中并選擇不再次存儲(chǔ)文件??梢允褂弥羔?、圖形數(shù)據(jù)庫(kù)中的邊或其它引用標(biāo)識(shí)符來(lái)將文件與特定項(xiàng)目、目錄或文件的其它集合相關(guān)聯(lián)。
動(dòng)態(tài)產(chǎn)物
動(dòng)態(tài)產(chǎn)物表示程序行為(behavior),并且是通過(guò)在設(shè)備化環(huán)境(諸如虛擬機(jī)、模擬器(例如快速模擬器(“QEMU”))或系統(tǒng)管理程序)中運(yùn)行軟件而生成的。動(dòng)態(tài)產(chǎn)物包括系統(tǒng)調(diào)用軌跡/庫(kù)軌跡以及執(zhí)行軌跡。
系統(tǒng)調(diào)用軌跡或庫(kù)軌跡是系統(tǒng)調(diào)用或庫(kù)調(diào)用被執(zhí)行的順序和頻率。系統(tǒng)調(diào)用是程序如何從管理輸入/輸出請(qǐng)求的操作系統(tǒng)的內(nèi)核請(qǐng)求服務(wù)。庫(kù)調(diào)用是對(duì)軟件庫(kù)的調(diào)用,該軟件庫(kù)是可以被重新用來(lái)開發(fā)軟件程序和應(yīng)用程序的編程代碼的集合。
執(zhí)行軌跡是每個(gè)指令軌跡,其包括指令字節(jié)、??蚣?、存儲(chǔ)器使用(例如,駐留/工作組尺寸)、用戶/內(nèi)核時(shí)間及其它運(yùn)行時(shí)信息。
本發(fā)明的示例性實(shí)施方式可以產(chǎn)生(spawn)虛擬環(huán)境,包括針對(duì)各種操作系統(tǒng)的虛擬環(huán)境,并且可以運(yùn)行并編譯源代碼和二進(jìn)制文件。這些環(huán)境可以允許動(dòng)態(tài)產(chǎn)物被確定。例如,可以采用諸如Valgrind或Daikon之類的公開可用程序來(lái)提供關(guān)于程序的運(yùn)行時(shí)信息以充當(dāng)產(chǎn)物。Valgrind是用于(除其它的之外)調(diào)試存儲(chǔ)器、檢測(cè)存儲(chǔ)器泄漏以及行為評(píng)測(cè)的工具。Daikon是可以檢測(cè)代碼中的不變量的程序;不變量是在代碼中的一些點(diǎn)處保持為真的條件。
其它實(shí)施方式可以采用附加診斷和調(diào)試程序或?qū)嵱霉ぞ?,諸如strace和dtrace,其是公開可用的。strace被用來(lái)監(jiān)視進(jìn)程與內(nèi)核之間的交互,包括系統(tǒng)調(diào)用。dtrace可以用來(lái)為系統(tǒng)提供運(yùn)行時(shí)信息,包括所使用的存儲(chǔ)器量、CPU時(shí)間、特定函數(shù)調(diào)用以及訪問(wèn)特定文件的進(jìn)程。示例性實(shí)施方式還可以跨程序的多次運(yùn)行而跟蹤執(zhí)行軌跡(例如,使用Valgrind)。
附加實(shí)施方式可以通過(guò)KLEE引擎來(lái)運(yùn)行LLVM IR。KLEE是符號(hào)虛擬機(jī),其是公開可用的開源代碼。KLEE以符號(hào)方式執(zhí)行LLVM IR并自動(dòng)地生成訓(xùn)練所有代碼程序路徑的測(cè)試。符號(hào)執(zhí)行涉及(除其它的之外)分析代碼以確定什么輸入促使代碼的每個(gè)部分執(zhí)行。利用KLEE在發(fā)現(xiàn)函數(shù)正確性誤差和行為不一致性時(shí)是非常有效的,并且因此允許本發(fā)明的示例性實(shí)施方式快速地識(shí)別類似代碼的差異(例如,跨各修訂)。
導(dǎo)出產(chǎn)物
導(dǎo)出產(chǎn)物表示復(fù)雜的高級(jí)程序行為,并且提取作為這些行為的特性(characteristic)的屬性和事實(shí)。導(dǎo)出產(chǎn)物包括程序特性、循環(huán)不變量、擴(kuò)展類型信息、Z符號(hào)和標(biāo)簽遷移系統(tǒng)表示。
程序特性是關(guān)于從執(zhí)行軌跡導(dǎo)出的程序的事實(shí)。這些事實(shí)包括最小、最大以及平均存儲(chǔ)器尺寸;執(zhí)行時(shí)間;以及棧深度。
循環(huán)不變量是在循環(huán)的所有迭代(或所選的一組迭代)內(nèi)被保持的屬性。循環(huán)不變量可以被映射到分支語(yǔ)義以揭示類似行為。
擴(kuò)展類型信息包括關(guān)于類型的事實(shí),包括變量可以擁有的值的范圍、與其它變量的關(guān)系以及可以被抽象化的其它特征。類型約束可以顯示關(guān)于該代碼的行為和特征。
Z符號(hào)基于Zermelo-Fraenkel集合理論。其提供分類型的代數(shù)標(biāo)記法,使得能夠?qū)崿F(xiàn)在基本塊與整個(gè)函數(shù)之間的忽視結(jié)構(gòu)、順序以及類型的比較度量。
標(biāo)簽遷移系統(tǒng)(LTS)表示是表示從程序抽象化的高級(jí)狀態(tài)的圖形系統(tǒng)。圖的節(jié)點(diǎn)是狀態(tài),并且各邊用遷移中的關(guān)聯(lián)動(dòng)作來(lái)標(biāo)記。
針對(duì)特定示例性實(shí)施方式,可以根據(jù)其它產(chǎn)物、根據(jù)源代碼文件(包括使用上文針對(duì)動(dòng)態(tài)產(chǎn)物所述的程序)以及根據(jù)LLVM IR來(lái)確定導(dǎo)出產(chǎn)物。
元數(shù)據(jù)產(chǎn)物
元數(shù)據(jù)產(chǎn)物表示程序上下文,并且包括與代碼相關(guān)聯(lián)的元數(shù)據(jù)。這些產(chǎn)物具有與計(jì)算機(jī)程序的上下文關(guān)系。元數(shù)據(jù)產(chǎn)物包括文件名、修訂號(hào)、文件的時(shí)間戳、哈希值以及文件的位置,諸如屬于特定目錄或項(xiàng)目??梢詫⒃獢?shù)據(jù)產(chǎn)物的子集稱為開發(fā)產(chǎn)物,其是涉及文件、程序或項(xiàng)目的開放過(guò)程的產(chǎn)物。開發(fā)產(chǎn)物可以包括內(nèi)聯(lián)代碼注釋、提交歷史、bugzilla入口、CVE入口、構(gòu)建信息、配置腳本以及文件編制文件,諸如README.*TODO.*。
示例性實(shí)施方式可以采用Doxygen,其是公開可用的文件編制生成器。Doxygen可以從特殊注釋的源代碼文件生成用于程序員和/或最終用戶的軟件文件編制(即內(nèi)聯(lián)代碼文件編制)。
附加實(shí)施方式可以采用解析器(諸如另一語(yǔ)言識(shí)別工具(ANTLR)4生成解析器)來(lái)產(chǎn)生抽象語(yǔ)法樹(AST),以提取也可以充當(dāng)產(chǎn)物的高級(jí)語(yǔ)言特征。ANTLR4針對(duì)用于語(yǔ)言的串采用語(yǔ)法產(chǎn)生規(guī)則,并且生成可以構(gòu)建并穿行解析樹的解析器。結(jié)果得到的解析器發(fā)出各種類型、函數(shù)定義/調(diào)用以及與程序的結(jié)構(gòu)有關(guān)的其它數(shù)據(jù)。用ANTLR4生成解析器提取的底層屬性包括復(fù)雜類型/結(jié)構(gòu)、循環(huán)不變量/計(jì)數(shù)器(例如,來(lái)自for each范例)以及結(jié)構(gòu)化注釋(例如,形式前置/后置條件語(yǔ)句)。示例性實(shí)施方式可以將此提取數(shù)據(jù)映射到LLVM IR中的其引用位置,因?yàn)槲募?、行和列?hào)信息存在于解析器和LLVM IR兩者之中。
本發(fā)明的示例性實(shí)施方式可以通過(guò)從源軟件文件提取一串字符(諸如內(nèi)聯(lián)注釋)來(lái)自動(dòng)地確定一個(gè)或多個(gè)元數(shù)據(jù)產(chǎn)物。其它實(shí)施方式從文件系統(tǒng)或源控制系統(tǒng)中自動(dòng)地確定元數(shù)據(jù)產(chǎn)物。
分級(jí)產(chǎn)物間關(guān)系
圖3是圖示出根據(jù)本發(fā)明的實(shí)施方式的用于軟件文件的產(chǎn)物之間的分級(jí)關(guān)系的框圖。示例性實(shí)施方式可以保持并利用這些分級(jí)產(chǎn)物間關(guān)系。此外,不同的實(shí)施方式可以使用不同的模式和不同的分級(jí)關(guān)系。針對(duì)圖3的示例性實(shí)施方式,產(chǎn)物分級(jí)結(jié)構(gòu)的頂部是LTS產(chǎn)物310。每個(gè)LTS節(jié)點(diǎn)310可以映射到函數(shù)和特定可變狀態(tài)的集合或子集。在LTS產(chǎn)物310下面的是CG產(chǎn)物320。每個(gè)CG節(jié)點(diǎn)320可以映射到具有CFG產(chǎn)物330的特定函數(shù),其邊可以包含循環(huán)不變量和分支語(yǔ)義330。每個(gè)CF節(jié)點(diǎn)330可以包含基本塊以及DT 340。在那些產(chǎn)物下面的是變量、常量、UD/DU鏈以及IR指令350。圖3清楚地圖示出產(chǎn)物可以從描述動(dòng)態(tài)信息的范圍的LTS節(jié)點(diǎn)向下直至單獨(dú)的IR指令,而被映射到分級(jí)結(jié)構(gòu)的不同層級(jí)。這些分級(jí)關(guān)系可以被示例性實(shí)施方式用于多種用途,包括更高效地搜索匹配產(chǎn)物,諸如通過(guò)首先比較更接近于分級(jí)結(jié)構(gòu)頂部的產(chǎn)物(與更接近于底部的產(chǎn)物相比),從而根據(jù)高層級(jí)產(chǎn)物是否是匹配產(chǎn)物而包括或排除與高層級(jí)產(chǎn)物相關(guān)聯(lián)的低層級(jí)產(chǎn)物的整體集合。附加實(shí)施方式還可以在針對(duì)缺陷或針對(duì)特征增強(qiáng)而定位或建議修復(fù)代碼(包括通過(guò)在分級(jí)結(jié)構(gòu)中上升以定位針對(duì)具有匹配的高層級(jí)產(chǎn)物的缺陷的修復(fù)代碼)時(shí)使用分級(jí)關(guān)系。
圖4是圖示出用于提供用于軟件文件產(chǎn)物的語(yǔ)料庫(kù)的系統(tǒng)的示例性實(shí)施方式的框圖。示例性實(shí)施方式可以具有能夠與具有多個(gè)軟件文件的源430通信的接口420。針對(duì)特定實(shí)施方式,此接口420可以被通信耦合到本地源430,諸如本地硬盤驅(qū)動(dòng)器或磁盤。在其它實(shí)施方式中,接口420可以是用于通過(guò)公共或私有網(wǎng)絡(luò)來(lái)獲得文件的網(wǎng)絡(luò)接口420。這些軟件文件的公共源430的示例包括GitHUB、SourceForge、BitBucket、GoogleCode或Common Vulnerabilities and Exposures(公共漏洞和暴露)系統(tǒng)。私有源的示例包括公司的內(nèi)部網(wǎng)絡(luò)和存儲(chǔ)在其上面的文件,包括在共享網(wǎng)絡(luò)驅(qū)動(dòng)器和私有儲(chǔ)存庫(kù)中的那些。本示例性系統(tǒng)還具有一個(gè)或多個(gè)處理器410,其被耦合到接口420以從源430獲得所述多個(gè)軟件文件。處理器410還可以用來(lái)針對(duì)所述多個(gè)軟件文件中的每一個(gè)確定所述多個(gè)產(chǎn)物。這些產(chǎn)物可以是靜態(tài)產(chǎn)物、動(dòng)態(tài)產(chǎn)物、導(dǎo)出產(chǎn)物和/或元數(shù)據(jù)產(chǎn)物。針對(duì)附加實(shí)施方式,處理器410還可以被配置成將軟件文件的每一個(gè)轉(zhuǎn)換成中間表示并根據(jù)該中間表示來(lái)確定產(chǎn)物。
示例性系統(tǒng)還具有一個(gè)或多個(gè)存儲(chǔ)設(shè)備440a-440n,其用于存儲(chǔ)用于軟件文件的每一個(gè)的產(chǎn)物,并且被耦合到處理器410。這些存儲(chǔ)設(shè)備440a-440n可以是硬盤驅(qū)動(dòng)器、硬盤驅(qū)動(dòng)器陣列、其它類型的存儲(chǔ)設(shè)備以及分布式儲(chǔ)存器,諸如通過(guò)采用Hadoop文件系統(tǒng)(HDFS)上的Titan和Cassandra所提供的存儲(chǔ)器。同樣地,示例性系統(tǒng)可以具有一個(gè)處理器410,或者采用分布處理并具有超過(guò)一個(gè)處理器410。其它實(shí)施方式還提供在接口420與存儲(chǔ)設(shè)備440a-440n之間的直接通信耦合。
圖5是圖示出用于定位設(shè)計(jì)模式的方法的示例性實(shí)施方式的框圖。設(shè)計(jì)模式的示例包括錯(cuò)誤、修復(fù)、漏洞、安全補(bǔ)丁、協(xié)議、協(xié)議擴(kuò)展、特征以及特征增強(qiáng)。每個(gè)設(shè)計(jì)模式可以與在軟件項(xiàng)目分級(jí)結(jié)構(gòu)的各種層級(jí)處提取的產(chǎn)物(例如,規(guī)范、CG、CFG、Def-Use鏈、指令序列、類型以及常量)相關(guān)聯(lián)。
示例性方法提供對(duì)具有與多個(gè)軟件文件510相對(duì)應(yīng)的多個(gè)產(chǎn)物的數(shù)據(jù)庫(kù)的訪問(wèn)。該數(shù)據(jù)庫(kù)可以是圖形數(shù)據(jù)庫(kù)、關(guān)系數(shù)據(jù)庫(kù)或平面文件。數(shù)據(jù)庫(kù)可以位于本地、在私有網(wǎng)絡(luò)上或者經(jīng)由因特網(wǎng)或云是可訪問(wèn)的。一旦數(shù)據(jù)庫(kù)已被訪問(wèn),本方法然后可以基于用于所述多個(gè)文件520中的第一文件的所述多個(gè)產(chǎn)物中的至少一個(gè)而自動(dòng)地識(shí)別設(shè)計(jì)模式。針對(duì)一些示例性實(shí)施方式,所述多個(gè)產(chǎn)物中的每一個(gè)可以是靜態(tài)產(chǎn)物、動(dòng)態(tài)產(chǎn)物、導(dǎo)出產(chǎn)物或元數(shù)據(jù)產(chǎn)物。其它實(shí)施方式可以具有不同類型的產(chǎn)物的混合體。此外,文件的格式不受限制,并且可以是例如二進(jìn)制代碼格式、源代碼格式或中間表示(IR)格式。
針對(duì)一些實(shí)施方式,可以通過(guò)進(jìn)行開發(fā)產(chǎn)物的關(guān)鍵字搜索或自然語(yǔ)言搜索來(lái)識(shí)別設(shè)計(jì)模式。例如,源代碼文件的修訂版中的內(nèi)聯(lián)代碼注釋可以是識(shí)別被發(fā)現(xiàn)并改正的缺陷。注釋可以使用諸如缺陷、錯(cuò)誤、差錯(cuò)、問(wèn)題、瑕疵或小故障之類的單詞。這些單詞可以在對(duì)元數(shù)據(jù)的關(guān)鍵字搜索中使用。提交日志還可以包括描述新修訂版和補(bǔ)丁為何被應(yīng)用從而解決缺陷或增強(qiáng)特征的文本。此外,可以將訓(xùn)練和反饋應(yīng)用于搜索以細(xì)化搜索努力。
附加示例性實(shí)施方式可以從CVE源搜索開發(fā)產(chǎn)物,其識(shí)別文本中的公共漏洞和差錯(cuò)并可以描述缺陷和可用修復(fù),如果有的話。此文本可以作為產(chǎn)物而獲得并存儲(chǔ)在數(shù)據(jù)庫(kù)中。一些源還將缺陷編碼,使得代碼可以被用作關(guān)鍵字來(lái)定位哪個(gè)文件包含缺陷。另外,可以在識(shí)別軟件文件時(shí)考慮產(chǎn)物的源并進(jìn)行加權(quán)。例如,在沒(méi)有出處或內(nèi)聯(lián)注釋的情況下,CVE源可以在識(shí)別缺陷時(shí)比儲(chǔ)存庫(kù)更加可靠。其它實(shí)施方式可以使用諸如文件名和修訂號(hào)之類的元數(shù)據(jù)產(chǎn)物來(lái)至少初步地識(shí)別軟件文件,并且基于匹配附加產(chǎn)物(諸如CG或CGF)來(lái)確認(rèn)該識(shí)別。
本發(fā)明的特定實(shí)施方式執(zhí)行示例性方法并嘗試識(shí)別用于一些、大多數(shù)或所有源代碼和LLVM IR文件的設(shè)計(jì)模式。另外,每當(dāng)文件被添加到語(yǔ)料庫(kù)時(shí),一些實(shí)施方式訪問(wèn)數(shù)據(jù)庫(kù)并嘗試識(shí)別任何設(shè)計(jì)模式。一些實(shí)施方式還可以標(biāo)記已識(shí)別設(shè)計(jì)模式以供后來(lái)使用。
一些實(shí)施方式還找到與也已被存儲(chǔ)在數(shù)據(jù)庫(kù)中的文件相關(guān)聯(lián)的源代碼或LLVM IR中的缺陷的位置。例如,開發(fā)產(chǎn)物可以指定在源代碼中的什么位置存在缺陷和在補(bǔ)丁中的什么位置存在修復(fù)。并且,可以分析源代碼或LLVM IR并將其與具有缺陷和文件新修復(fù)版本的文件相比較,以便將差異隔離并辨別缺陷和修復(fù)位于哪里。針對(duì)特定實(shí)施方式,還可以使用在開發(fā)產(chǎn)物中識(shí)別的缺陷的類型來(lái)縮窄針對(duì)缺陷位置的代碼搜索。附加實(shí)施方式還可以諸如使用標(biāo)簽來(lái)識(shí)別設(shè)計(jì)模式,并且將標(biāo)識(shí)符存儲(chǔ)在用于文件的數(shù)據(jù)庫(kù)中。這允許更容易地針對(duì)一些缺陷或缺陷類型搜索數(shù)據(jù)庫(kù)。此類標(biāo)簽的示例包括從用于軟件文件的開發(fā)產(chǎn)物或者從源代碼獲得的字符串。這種方法可以應(yīng)用于識(shí)別特征和特征增強(qiáng)并將其標(biāo)記。
針對(duì)特定示例性實(shí)施方式,設(shè)計(jì)模式位于軟件文件中。針對(duì)特定示例性實(shí)施方式,設(shè)計(jì)模式可以涉及文件之間的交互,諸如接口。示例性實(shí)施方式可以通過(guò)使識(shí)別基于用于多個(gè)軟件文件(諸如第一和第二文件,兩者都屬于一軟件項(xiàng)目)的產(chǎn)物,來(lái)自動(dòng)地識(shí)別設(shè)計(jì)模式。例如,可以將表示設(shè)計(jì)模式的預(yù)先識(shí)別模式(諸如接口失配誤差)存儲(chǔ)在數(shù)據(jù)庫(kù)中,或者存儲(chǔ)在允許將來(lái)自第一和第二文件的產(chǎn)物用來(lái)識(shí)別針對(duì)這些文件存在接口誤差的其他位置。針對(duì)示例性實(shí)施方式的示例性設(shè)計(jì)模式包括缺陷、修復(fù)、特征、特征爭(zhēng)搶或預(yù)先識(shí)別的程序片段。
針對(duì)特定示例性實(shí)施方式,本方法在產(chǎn)物中定位表示缺陷或修復(fù)的字符串。常常地,在開發(fā)產(chǎn)物中存在此類串(諸如錯(cuò)誤、差錯(cuò)或缺陷),以及關(guān)于修復(fù)和在代碼中什么位置可以找到那些修復(fù)的串。這些開發(fā)產(chǎn)物還可以具有表示特征或特征增強(qiáng)的串。
針對(duì)一些示例性實(shí)施方式,設(shè)計(jì)模式基于表示設(shè)計(jì)模式的預(yù)先識(shí)別模式。這些預(yù)先識(shí)別模式可以由用戶創(chuàng)建,可以是先前由與本公開相關(guān)聯(lián)的方法識(shí)別,或者可以被以某種其它方式識(shí)別。這些預(yù)先識(shí)別模式可以對(duì)應(yīng)于缺陷、修復(fù)、特征、特征增強(qiáng)或者感興趣或具有其它重要性的項(xiàng)。
圖6是圖示出用于定位缺陷的方法的示例性實(shí)施方式的流程圖。本方法包括訪問(wèn)具有對(duì)應(yīng)于多個(gè)軟件文件的多個(gè)軟件產(chǎn)物的數(shù)據(jù)庫(kù)610,諸如語(yǔ)料庫(kù)。然后,對(duì)產(chǎn)物進(jìn)行分析以從大量數(shù)據(jù)中辨別模式。例如,此分析可以包括將所述多個(gè)產(chǎn)物620進(jìn)行聚類。通過(guò)將數(shù)據(jù)進(jìn)行聚類,可以找到未被已知包含已知缺陷的文件中的已知缺陷。因此,根據(jù)該聚類,示例性方法可以基于一個(gè)或多個(gè)先前識(shí)別的缺陷630來(lái)識(shí)別先前未識(shí)別的缺陷。
本發(fā)明的一些示例性實(shí)施方式可以對(duì)語(yǔ)料庫(kù)采用機(jī)器學(xué)習(xí)。機(jī)器學(xué)習(xí)涉及通過(guò)從低層級(jí)產(chǎn)物開始學(xué)習(xí)數(shù)據(jù)的分級(jí)結(jié)構(gòu)以捕捉數(shù)據(jù)中的相關(guān)特征,并且然后構(gòu)建更復(fù)雜的表示。一些示例性實(shí)施方式可以對(duì)語(yǔ)料庫(kù)采用深度學(xué)習(xí)。深度學(xué)習(xí)是基于學(xué)習(xí)數(shù)據(jù)表示的機(jī)器學(xué)習(xí)方法的較寬泛家族的子集。針對(duì)一些實(shí)施方式,可以將自動(dòng)編碼器用于聚類。
針對(duì)特定示例性實(shí)施方式,可以通過(guò)一組自動(dòng)編碼器來(lái)處理產(chǎn)物,以自動(dòng)地發(fā)現(xiàn)未標(biāo)記圖形和文檔產(chǎn)物的緊湊表示。圖形產(chǎn)物包括可以用圖形式表示的那些產(chǎn)物(諸如CG、CFG、UD鏈、DU鏈以及DT)。然后可以將圖形產(chǎn)物的緊湊表示聚類,以發(fā)現(xiàn)軟件設(shè)計(jì)模式。從相應(yīng)元數(shù)據(jù)產(chǎn)物提取的知識(shí)可以用來(lái)標(biāo)記設(shè)計(jì)模式(例如,錯(cuò)誤、改正、漏洞、安全補(bǔ)丁、協(xié)議、協(xié)議擴(kuò)展、特征以及特征增強(qiáng))。
針對(duì)特定示例性實(shí)施方式,自動(dòng)編碼器是結(jié)構(gòu)化稀疏自動(dòng)編碼器(SSAE),其可以將矢量取作輸入并提取公共特征。針對(duì)用以自動(dòng)地發(fā)現(xiàn)程序的特征的一些實(shí)施方式,首先以矩陣形式表示提取的圖形產(chǎn)物。可以將提取產(chǎn)物中的許多表示為鄰接矩陣,包括例如CFG、UD鏈以及DU鏈。可以在軟件文件和項(xiàng)目分級(jí)結(jié)構(gòu)的每個(gè)層級(jí)處學(xué)習(xí)結(jié)構(gòu)特征。
在圖形產(chǎn)物中的節(jié)點(diǎn)的數(shù)目可以大范圍地改變;因此,可以將中間產(chǎn)物提供為用于深度學(xué)習(xí)的輸入。一個(gè)此類中間產(chǎn)物是圖的拉普拉斯的前k個(gè)特征值,以使得能夠?qū)崿F(xiàn)深度學(xué)習(xí)以與譜聚類類似地執(zhí)行處理。其它中間產(chǎn)物包括聚類系數(shù),其提供圖中的節(jié)點(diǎn)趨向于聚集在一起的程度的度量,諸如全局聚類系數(shù)、網(wǎng)絡(luò)平均聚類系數(shù)以及傳遞性比。另一中間產(chǎn)物是圖的蔭度,即圖有多稠密的度量。具有許多邊的圖具有高蔭度,并且具有高蔭度的圖具有稠密子圖。另一中間產(chǎn)物是等周數(shù),即圖是否具有瓶頸的數(shù)值度量。這些中間產(chǎn)物捕捉圖結(jié)構(gòu)的不同方面以便在機(jī)器學(xué)習(xí)方法中使用。
針對(duì)示例性實(shí)施方式,機(jī)器學(xué)習(xí)(包括深度學(xué)習(xí))可以采用使用從簡(jiǎn)單的自動(dòng)編碼器結(jié)構(gòu)開始的多步過(guò)程并迭代地細(xì)化本方法以開發(fā)SSAE來(lái)訓(xùn)練的算法。還可以訓(xùn)練SSAE以從中間產(chǎn)物學(xué)習(xí)特征。自動(dòng)編碼器學(xué)習(xí)未標(biāo)記數(shù)據(jù)的緊湊表示??梢杂脤W(xué)習(xí)至恒等函數(shù)的近似的神經(jīng)網(wǎng)絡(luò)(包括至少一個(gè)隱藏層且具有相同數(shù)目的輸入和輸出)來(lái)對(duì)其建模。自動(dòng)編碼器將輸入信號(hào)脫水(dehydrate)(編碼)成一組基本的描述參數(shù),并將那些信號(hào)再水合((rehydrate))(解碼)以重新創(chuàng)建原始信號(hào)。可以在訓(xùn)練期間自動(dòng)地選擇該描述參數(shù)以優(yōu)化對(duì)所有訓(xùn)練信號(hào)的再水合。脫水信號(hào)的基本性質(zhì)提供了用于將信號(hào)分組成聚類的基礎(chǔ)。
自動(dòng)編碼器可以通過(guò)將輸入信號(hào)映射到較低維數(shù)特征空間來(lái)減小輸入信號(hào)的維數(shù)。示例性實(shí)施方式然后可以在由自動(dòng)編碼器發(fā)現(xiàn)的特征空間中執(zhí)行代碼的聚類和分類。k均值算法對(duì)學(xué)習(xí)的特征進(jìn)行聚類。k均值算法是一種迭代細(xì)化技術(shù),其將特征劃分成k個(gè)聚類,這使結(jié)果得到的聚類均值最小化??梢曰谒崛〉闹黝}的數(shù)目來(lái)選擇聚類的初始數(shù)目k。在該數(shù)目的潛在聚類內(nèi)進(jìn)行搜索從而針對(duì)許多不同k中的每一個(gè)計(jì)算新結(jié)果是非常高效的,因?yàn)橛糜趉均值聚類的操作度量是基于歐幾里德距離。示例性實(shí)施方式可以使用在從其導(dǎo)出聚類特征的軟件文件內(nèi)最頻繁地出現(xiàn)的主題的標(biāo)簽將結(jié)果得到的聚類進(jìn)行分類。
雖然特征向量是稀疏且緊湊的,但是可能難以僅僅通過(guò)特征向量的檢查來(lái)理解輸入向量。因此,示例性實(shí)施方式可以利用與先前學(xué)習(xí)的權(quán)值參數(shù)相關(guān)聯(lián)的先驗(yàn)知識(shí)。給定充分的語(yǔ)料庫(kù),例如針對(duì)“已修復(fù)”代碼,參數(shù)空間中的模式應(yīng)當(dāng)出現(xiàn)。示例性實(shí)施方式可以使用由被收集到該點(diǎn)的數(shù)據(jù)集給定的先驗(yàn)信息來(lái)將特定模式結(jié)合到自動(dòng)編碼器中。特別地,當(dāng)標(biāo)簽被系統(tǒng)獲悉時(shí),示例性實(shí)施方式可以將該信息結(jié)合到自動(dòng)編碼器操作中。
示例性實(shí)施方式可以使用數(shù)據(jù)庫(kù)管理(例如,聯(lián)合,濾波)和分析操作(例如,奇異值分解(SVD)、雙聚類)的混合。示例性實(shí)施方式的圖理論(例如,譜聚類)和機(jī)器學(xué)習(xí)或深度學(xué)習(xí)算法兩者都可以將類似的算法原語(yǔ)用于特征提取。還可以使用SVD來(lái)對(duì)用于學(xué)習(xí)算法的輸入進(jìn)行降噪,并使用較少的維度來(lái)近似數(shù)據(jù),并且因此執(zhí)行數(shù)據(jù)簡(jiǎn)化。
示例性實(shí)施方式可以通過(guò)文檔產(chǎn)物的無(wú)監(jiān)督語(yǔ)義標(biāo)簽生成(包括經(jīng)由文本分析),而封裝隨時(shí)間推移且跨各程序的代碼狀態(tài)的人類理解。文本分析的示例是隱含狄利克雷分配(LDA)。可以使用LDA和主題建模來(lái)從文檔產(chǎn)物提取語(yǔ)義信息。這些方法是著眼于單詞或短語(yǔ)的出現(xiàn)、忽視順序的“詞袋(bag-of-words)”技術(shù)。例如,表示“科學(xué)計(jì)算”的袋子可以具有諸如“FFT”、“小波”、“sin”、“atan”之類的種子術(shù)語(yǔ)。示例性實(shí)施方式可以使用從源提取的文檔產(chǎn)物,諸如源注釋、CG/CGF節(jié)點(diǎn)標(biāo)簽和提交消息,以通過(guò)對(duì)術(shù)語(yǔ)的出現(xiàn)進(jìn)行計(jì)數(shù)來(lái)填充“袋子”。結(jié)果得到的固定bin直方圖可以被饋送到受限玻爾茲曼機(jī)(RBM),即適合于文本應(yīng)用的深度學(xué)習(xí)算法的實(shí)現(xiàn)方式。提取的主題捕捉與提取的文檔產(chǎn)物相關(guān)聯(lián)的語(yǔ)義信息,并且可以充當(dāng)用于經(jīng)由自動(dòng)編碼器由圖產(chǎn)物的無(wú)監(jiān)督學(xué)習(xí)而形成的聚類的標(biāo)簽(例如,錯(cuò)誤/改正、漏洞/補(bǔ)丁)??梢杂筛郊邮纠詫?shí)施方式采用的其它形式的文本分析包括自然語(yǔ)言處理、詞法分析以及預(yù)測(cè)分析。
從文檔產(chǎn)物提取的主題標(biāo)簽可以提供標(biāo)記信息以告知自動(dòng)編碼器的結(jié)構(gòu)化。示例性實(shí)施方式可以基于學(xué)習(xí)主題、表示順序軟件模式(即,在軟件修訂版之前/之后)的語(yǔ)義公共性,針對(duì)訓(xùn)練數(shù)據(jù)群體查詢語(yǔ)料庫(kù)數(shù)據(jù)庫(kù)。這些模式可以捕捉嵌入軟件開發(fā)文件(諸如在提交日志、改變?nèi)罩竞妥⑨?中的變化,其隨時(shí)間推移而與軟件開發(fā)生命周期相關(guān)聯(lián)。這些變化的關(guān)聯(lián)提供對(duì)與檢測(cè)和修復(fù)(諸如錯(cuò)誤/改正、漏洞/安全補(bǔ)丁以及特征/增強(qiáng))相關(guān)的軟件的演進(jìn)的洞悉。此信息還可以用來(lái)理解并標(biāo)記自動(dòng)地從產(chǎn)物語(yǔ)料庫(kù)提取的知識(shí)。
圖7示出了根據(jù)本發(fā)明的實(shí)施方式的用于識(shí)別設(shè)計(jì)模式的產(chǎn)物的聚類的框圖。可以在軟件文件分級(jí)結(jié)構(gòu)的每個(gè)層級(jí)(包括系統(tǒng)、程序、函數(shù)以及塊710)處學(xué)習(xí)結(jié)構(gòu)特征。可以針對(duì)聚類715分析圖形產(chǎn)物,諸如CG、CFG以及DT。可以將這些圖形產(chǎn)物變換成圖形不變量特征720。這些圖形特征740然后可以作為輸入提供給圖形分析模塊760,諸如自動(dòng)編碼器,并且針對(duì)類似的設(shè)計(jì)模式(其被聚集在一起780)檢查結(jié)果得到的聚類??梢詫⑽谋?諸如來(lái)自源代碼或來(lái)自開發(fā)產(chǎn)物的一個(gè)或多個(gè)字符串)映射到標(biāo)簽730??梢杂晌谋痉治瞿K770諸如通過(guò)使用LDA或其它自然語(yǔ)言處理來(lái)分析這些標(biāo)簽760,并且可以將標(biāo)簽與從其導(dǎo)出該標(biāo)簽的相應(yīng)發(fā)現(xiàn)聚類780相關(guān)聯(lián)??梢杂密浖?、硬件或其組合來(lái)實(shí)現(xiàn)這些模塊760、770。
圖8示出了用于使用語(yǔ)料庫(kù)來(lái)識(shí)別軟件文件的方法的示例性實(shí)施方式的流程圖。該示例性實(shí)施方式獲得軟件文件810。該文件可以經(jīng)由網(wǎng)絡(luò)接口從諸如經(jīng)由因特網(wǎng)、云或私人公司的服務(wù)器的公共儲(chǔ)存庫(kù)的公共或私有源獲得。一些示例性實(shí)施方式還可以從諸如本地硬盤驅(qū)動(dòng)器、便攜式硬盤驅(qū)動(dòng)器或磁盤的本地源獲得軟件文件。示例性實(shí)施方式可以從源獲得單個(gè)文件或多個(gè)文件,并可以諸如經(jīng)由腳本語(yǔ)言的使用而自動(dòng)地或通過(guò)用戶交互而手動(dòng)地這樣做。本示例性方法然后可以針對(duì)軟件文件820確定多個(gè)產(chǎn)物,諸如本文所述的任何其它產(chǎn)物。本示例性方法然后可以訪問(wèn)數(shù)據(jù)庫(kù)830,其存儲(chǔ)用于多個(gè)參照軟件文件中的每一個(gè)的多個(gè)參照產(chǎn)物。該參照產(chǎn)物可以被存儲(chǔ)在語(yǔ)料庫(kù)數(shù)據(jù)庫(kù)中。針對(duì)特定示例性實(shí)施方式,這些參照文件可以包括先前已經(jīng)獲得且針對(duì)一些實(shí)施方式其產(chǎn)物已連同軟件文件一起被存儲(chǔ)在數(shù)據(jù)庫(kù)中的軟件文件。將針對(duì)所獲得的軟件文件確定的產(chǎn)物或其多個(gè)子集與存儲(chǔ)在數(shù)據(jù)庫(kù)850中的參照產(chǎn)物或其多個(gè)子集相比較。示例性實(shí)施方式可以通過(guò)識(shí)別具有與所述多個(gè)產(chǎn)物850匹配的所述多個(gè)參照產(chǎn)物的參照軟件文件來(lái)識(shí)別軟件文件。由于比較的產(chǎn)物和參照產(chǎn)物匹配,所以軟件文件和參照軟件文件被識(shí)別為同一文件。
然后,還可以比較附加產(chǎn)物或代碼部分,以增加進(jìn)行了正確識(shí)別的置信度水平。該置信度可以是固定的或可調(diào)整的,并且可以基于多種標(biāo)準(zhǔn),諸如匹配的產(chǎn)物的數(shù)目、哪些產(chǎn)物匹配以及數(shù)目和哪些產(chǎn)物的組合。例如,可以針對(duì)特定的數(shù)據(jù)集及其觀察進(jìn)行此調(diào)整。此外,針對(duì)一些實(shí)施方式,匹配可以包括模糊匹配(諸如針對(duì)小于100%匹配的百分比具有可調(diào)整設(shè)置)以使匹配被聲明。
針對(duì)特定示例性實(shí)施方式,可以在匹配和識(shí)別過(guò)程中對(duì)一些產(chǎn)物給定更多或更少的權(quán)值。例如,可以對(duì)公共產(chǎn)物(諸如指令是與32位還是64位處理器匹配)給定零的權(quán)值或某個(gè)其它較小權(quán)值。一些產(chǎn)物在變換下可以或多或少地是不變的,并且針對(duì)特定實(shí)施方式可以相應(yīng)地調(diào)整用于這些產(chǎn)物的權(quán)值。例如,可以認(rèn)為文件名或CG產(chǎn)物在確立文件的標(biāo)識(shí)時(shí)是非常富含信息的,而特定產(chǎn)物(諸如LTS或DT)針對(duì)特定示例性實(shí)施方式和源可能被認(rèn)為不那么具有決定性,并被給定較小的權(quán)值。附加實(shí)施方式可以對(duì)產(chǎn)物的一些組合給定更大的權(quán)值,以在進(jìn)行比較時(shí)識(shí)別匹配。例如,具有CFG和CG產(chǎn)物匹配可以在進(jìn)行識(shí)別時(shí)被給定比具有基本塊產(chǎn)物和DT產(chǎn)物匹配更多的權(quán)值。同樣地,可以在文件的識(shí)別時(shí),對(duì)不匹配的一些產(chǎn)物給定更多或更少的權(quán)值。識(shí)別過(guò)程中評(píng)估加權(quán)的附加示例可以包括諸如使用匹配產(chǎn)物的百分比或某個(gè)其它度量,來(lái)表示識(shí)別閾值。附加閾值可以改變識(shí)別閾值,包括基于諸如文件的源、文件的類型、時(shí)間戳(其哪些包括文件的日期)、文件的尺寸或一些產(chǎn)物是否對(duì)于文件而言不能確定或者以其他方式不可用之類的事項(xiàng)。
附加實(shí)施方式可以通過(guò)將軟件文件轉(zhuǎn)換成中間表示(諸如LLVM IR)并根據(jù)該中間表示來(lái)確定所述多個(gè)產(chǎn)物中的至少一個(gè)來(lái)針對(duì)軟件文件確定所述多個(gè)產(chǎn)物中的一些。其它實(shí)施方式可以通過(guò)從軟件文件(諸如源代碼文件或文件編制文件)提取字符串,來(lái)確定所述多個(gè)產(chǎn)物中的一些。
示例性實(shí)施方式還可以包括通過(guò)分析與已識(shí)別參照軟件文件相關(guān)聯(lián)的參照產(chǎn)物中的至少一個(gè),來(lái)確定是否存在軟件文件的新版本。例如,一旦已經(jīng)識(shí)別了軟件文件,則可以檢查數(shù)據(jù)庫(kù)以查看軟件文件的新修訂版是否可用,諸如通過(guò)檢查相應(yīng)參照文件的修訂號(hào)或時(shí)間戳,或者可以將參照文件識(shí)別為另一文件的較舊修訂版的與數(shù)據(jù)庫(kù)中的產(chǎn)物和文件相關(guān)聯(lián)的標(biāo)簽。附加示例性實(shí)施方式還可以自動(dòng)地提供軟件文件的新版本,包括向用戶或者公共或私有源提供。
特定附加實(shí)施方式可以通過(guò)分析與已識(shí)別參照軟件文件相關(guān)聯(lián)的參照產(chǎn)物中的至少一個(gè)來(lái)確定是否存在軟件文件的補(bǔ)丁。例如,示例性實(shí)施方式可以檢查與參照軟件文件相關(guān)聯(lián)的產(chǎn)物,并確定針對(duì)該文件存在補(bǔ)丁,包括尚未被應(yīng)用于軟件文件的補(bǔ)丁。附加實(shí)施方式可以自動(dòng)地對(duì)軟件文件應(yīng)用補(bǔ)丁或者提示用戶關(guān)于他們是否想要應(yīng)用補(bǔ)丁。
特定附加實(shí)施方式可以分析該補(bǔ)丁,且針對(duì)一些實(shí)施方式還分析軟件文件(或參照軟件文件,因?yàn)槠涫瞧ヅ涞?,以確定對(duì)應(yīng)于軟件文件中的缺陷的修復(fù)的補(bǔ)丁的修復(fù)部分。針對(duì)一些實(shí)施方式,此分析可以在獲得軟件文件之前或之后發(fā)生。附加實(shí)施方式可以僅將補(bǔ)丁的修復(fù)部分應(yīng)用于軟件文件,包括自動(dòng)地或者提示用戶關(guān)于他們是否想要應(yīng)用補(bǔ)丁的修復(fù)部分。附加實(shí)施方式可以將補(bǔ)丁的該修復(fù)部分提供給源以使其在源處被應(yīng)用。此外,補(bǔ)丁和軟件文件的分析可以包括將補(bǔ)丁和軟件文件轉(zhuǎn)換成中間表示,并根據(jù)該中間表示來(lái)確定所述多個(gè)產(chǎn)物中的至少一個(gè)。同樣地,附加實(shí)施方式可以分析補(bǔ)丁和軟件文件(或參照軟件文件,因?yàn)槠涫瞧ヅ涞?,以確定與軟件文件中的特征的改進(jìn)或改變相對(duì)應(yīng)的補(bǔ)丁的特征增強(qiáng)部分。附加實(shí)施方式可以僅將補(bǔ)丁的特征增強(qiáng)部分應(yīng)用于軟件文件,包括自動(dòng)地或者提示用戶他們是否想要應(yīng)用補(bǔ)丁的特征增強(qiáng)部分。
附加實(shí)施方式可以通過(guò)分析與已識(shí)別參照軟件文件相關(guān)聯(lián)的參照產(chǎn)物中的至少一個(gè),來(lái)確定在軟件文件中是否存在缺陷。例如,參照軟件文件可以具有將其識(shí)別為具有缺陷(對(duì)于其而言有修復(fù)可用)的產(chǎn)物。附加實(shí)施方式可以自動(dòng)地修復(fù)軟件文件中的缺陷,包括通過(guò)自動(dòng)地用源代碼的修復(fù)塊來(lái)替換源代碼塊,或者用中間表示的修復(fù)修復(fù)塊來(lái)替換軟件文件中的中間表示塊。附加實(shí)施方式可以通過(guò)用二進(jìn)制補(bǔ)丁替換二進(jìn)制的一部分來(lái)修復(fù)二進(jìn)制文件中的缺陷。針對(duì)特定實(shí)施方式,可以將已修復(fù)文件發(fā)送到軟件文件的源。附加實(shí)施方式可以允許向軟件文件的源提供修復(fù)代碼,以便在那里修復(fù)文件。
圖9是圖示出用于識(shí)別代碼的方法的示例性實(shí)施方式的流程圖。示例性方法可以獲得一個(gè)或多個(gè)軟件文件910。針對(duì)軟件文件,可以確定多個(gè)產(chǎn)物920。如果產(chǎn)物已被確定的話,則特定實(shí)施方式可以替代地獲得產(chǎn)物而不是確定產(chǎn)物??梢栽L問(wèn)存儲(chǔ)多個(gè)參照產(chǎn)物的數(shù)據(jù)庫(kù)930。參照產(chǎn)物是如本文所述的產(chǎn)物,并且可以對(duì)應(yīng)于參照軟件文件、參照設(shè)計(jì)模式或其它感興趣代碼塊。數(shù)據(jù)庫(kù)可以被存儲(chǔ)在許多位置上,諸如在本地或者在網(wǎng)絡(luò)驅(qū)動(dòng)器上,或者通過(guò)因特網(wǎng)或在云中可訪問(wèn),并且還可以跨多個(gè)存儲(chǔ)設(shè)備分布。然后,可以通過(guò)將對(duì)應(yīng)于程序片段的所述多個(gè)產(chǎn)物與對(duì)應(yīng)于程序片段的所述多個(gè)參照產(chǎn)物匹配,來(lái)識(shí)別在一個(gè)或多個(gè)軟件文件中或者與他們(諸如接口錯(cuò)誤)相關(guān)聯(lián)的程序片段940。程序片段是文件、程序、基本塊、函數(shù)或函數(shù)之間的接口的子部分。程序片段可以小到單個(gè)指令或者大到整個(gè)文件、程序、基本塊、函數(shù)或接口。所選部分可以足以以任何期望的置信度來(lái)識(shí)別程序片段,所述期望置信度對(duì)于一些實(shí)施方式而言可以是設(shè)定的或可調(diào)整的,并且其可以改變,諸如上文相對(duì)于識(shí)別文件所述。
針對(duì)附加實(shí)施方式,針對(duì)軟件文件確定產(chǎn)物包括將軟件文件的每一個(gè)轉(zhuǎn)換成中間表示并根據(jù)該中間表示來(lái)確定產(chǎn)物中的至少一個(gè)。針對(duì)一些實(shí)施方式,軟件文件和參照軟件文件每個(gè)采取源代碼格式,或者每個(gè)采取二進(jìn)制代碼格式。針對(duì)附加實(shí)施方式,程序片段對(duì)應(yīng)于軟件文件中的缺陷,并且已在數(shù)據(jù)庫(kù)中被識(shí)別為對(duì)應(yīng)于缺陷。附加實(shí)施方式可以自動(dòng)地修復(fù)軟件文件中的缺陷或者向用戶提供一個(gè)或多個(gè)修復(fù)選項(xiàng)以修復(fù)該缺陷。特定實(shí)施方式可以將修復(fù)選項(xiàng)排序,包括例如基于由用戶選擇的一個(gè)或多個(gè)先前修復(fù)選項(xiàng)或者基于用于修復(fù)選項(xiàng)的成功的可能性進(jìn)行排序。
圖10是圖示出根據(jù)本發(fā)明的實(shí)施方式的使用軟件文件的數(shù)據(jù)庫(kù)語(yǔ)料庫(kù)的系統(tǒng)的框圖。示例性系統(tǒng)包括可以與具有至少一個(gè)軟件文件的源1010進(jìn)行通信的接口1020。接口1020還被通信耦合到處理器1030。針對(duì)附加實(shí)施方式,接口1020還可以被直接地耦合到存儲(chǔ)設(shè)備1040。存儲(chǔ)設(shè)備1040可以是多種眾所周知的存儲(chǔ)設(shè)備或系統(tǒng),諸如網(wǎng)絡(luò)或本地存儲(chǔ)設(shè)備,諸如例如單個(gè)硬盤驅(qū)動(dòng)器或者具有多個(gè)硬盤驅(qū)動(dòng)器的分布式存儲(chǔ)系統(tǒng)。存儲(chǔ)設(shè)備1040可以存儲(chǔ)參照產(chǎn)物,包括針對(duì)許多參照軟件文件中的每一個(gè),并且可以被通信耦合到處理器1030。處理器1030可以被配置成促使從源1010獲得軟件文件。此軟件文件的身份和是否存在可用的軟件的新版本、是否存在可用的補(bǔ)丁或該文件是否包含缺陷或未增強(qiáng)特征都是示例性系統(tǒng)可以解決的問(wèn)題的示例。處理器1030還被配置成針對(duì)軟件文件確定多個(gè)產(chǎn)物,訪問(wèn)存儲(chǔ)設(shè)備1040中的參照產(chǎn)物,將用于軟件文件的產(chǎn)物與存儲(chǔ)在存儲(chǔ)設(shè)備1040中的參照產(chǎn)物相比較,并且通過(guò)識(shí)別具有與用于軟件文件的已比較產(chǎn)物相對(duì)應(yīng)的參照產(chǎn)物的參照軟件文件來(lái)識(shí)別軟件文件。
在示例性系統(tǒng)的附加實(shí)施方式中,處理器1030可以被配置成如果對(duì)于該文件而言一個(gè)補(bǔ)丁在存儲(chǔ)設(shè)備1040中可用的話,則自動(dòng)地對(duì)軟件文件應(yīng)用補(bǔ)丁。在附加實(shí)施方式中,處理器還可以被配置成分析已識(shí)別補(bǔ)丁和軟件文件,以確定在軟件文件中是否存在與缺陷的修復(fù)相對(duì)應(yīng)的補(bǔ)丁的修復(fù)部分,并且如果是這樣的話,自動(dòng)地僅將補(bǔ)丁的該修復(fù)部分應(yīng)用于軟件文件,或者提示用戶。
圖10的框圖還可以圖示出根據(jù)本發(fā)明的實(shí)施方式的使用數(shù)據(jù)庫(kù)語(yǔ)料庫(kù)的另一示例性系統(tǒng)。另外示出的本示例性系統(tǒng)包括可以與具有一個(gè)或多個(gè)軟件文件的源1010通信的接口1020。接口1020還被通信耦合到處理器1030。針對(duì)附加實(shí)施方式,接口1020還可以被直接地耦合到存儲(chǔ)設(shè)備1040。存儲(chǔ)設(shè)備1040可以是多種眾所周知的存儲(chǔ)設(shè)備或系統(tǒng),諸如聯(lián)網(wǎng)或本地存儲(chǔ)設(shè)備,諸如單個(gè)硬盤驅(qū)動(dòng)器或者具有多個(gè)硬盤驅(qū)動(dòng)器的分布式存儲(chǔ)系統(tǒng)。存儲(chǔ)設(shè)備1040可以存儲(chǔ)參照產(chǎn)物,并且可以被通信耦合到處理器1030。處理器1030可以被配置成促使獲得一個(gè)或多個(gè)軟件文件,以針對(duì)一個(gè)或多個(gè)軟件文件確定多個(gè)產(chǎn)物,訪問(wèn)存儲(chǔ)多個(gè)參照產(chǎn)物的數(shù)據(jù)庫(kù),并且通過(guò)將對(duì)應(yīng)于程序片段的所述多個(gè)產(chǎn)物與對(duì)應(yīng)于程序片段的所述多個(gè)參照產(chǎn)物相匹配,來(lái)識(shí)別用于一個(gè)或多個(gè)軟件文件的程序片段。針對(duì)特定示例性實(shí)施方式,程序片段已在數(shù)據(jù)庫(kù)中被識(shí)別為對(duì)應(yīng)于缺陷。此類缺陷的示例包括錯(cuò)誤、安全漏洞以及協(xié)議瑕疵。這些缺陷可以在一個(gè)或多個(gè)軟件文件內(nèi),或者可以與軟件文件之間的一個(gè)或多個(gè)接口相關(guān)。附加實(shí)施方式還可以使處理器被配置成自動(dòng)地修復(fù)一個(gè)或多個(gè)軟件文件中的缺陷。針對(duì)特定示例性實(shí)施方式,程序片段已在數(shù)據(jù)庫(kù)中被識(shí)別成對(duì)應(yīng)于特征,并且特定實(shí)施方式還可以自動(dòng)地提供特征增強(qiáng),包括以用于源代碼或二進(jìn)制文件的補(bǔ)丁的形式。
修復(fù)
示例性實(shí)施方式支持用于自動(dòng)化修復(fù)的程序合成,包括通過(guò)替換CG節(jié)點(diǎn)(函數(shù))、CFG節(jié)點(diǎn)(基本塊)、特定指令或特定變量和常量,來(lái)將所選修復(fù)實(shí)例化。這些元素(例如,函數(shù)、基本塊、指令)可與具有兼容接口的元素(即,相同數(shù)目的參數(shù)、類型和輸出)相交換,并且可以通過(guò)用LLVM IR的修復(fù)塊替換LLVM IR的缺陷塊來(lái)變換LLVM IR。
特定實(shí)施方式還可以選擇將基本塊與函數(shù)調(diào)用交換以及將函數(shù)調(diào)用與一個(gè)或多個(gè)基本塊交換。特定實(shí)施方式可以修補(bǔ)源代碼和二進(jìn)制碼。附加實(shí)施方式還可以在用于交換的適當(dāng)元素不存在時(shí)創(chuàng)建該元素。可以使用高層級(jí)產(chǎn)物(例如,LTS和Z謂詞)來(lái)導(dǎo)出用于軟件補(bǔ)丁的兼容實(shí)現(xiàn)方式。示例性實(shí)施方式可以利用提取的圖形表示的分級(jí)結(jié)構(gòu),首先將分級(jí)結(jié)構(gòu)升至修復(fù)模式的適當(dāng)表示,并且然后從分級(jí)結(jié)構(gòu)降至(經(jīng)由編譯)具體實(shí)現(xiàn)方式。產(chǎn)物的分級(jí)性質(zhì)可以幫助構(gòu)成修復(fù)代碼。
示例性實(shí)施方式可以允許用戶限制目標(biāo)程序(源或二進(jìn)制),并且示例性實(shí)施方式發(fā)現(xiàn)任何缺陷設(shè)計(jì)模式的存在。針對(duì)每個(gè)缺陷,可以向用戶提供修復(fù)策略(即,修復(fù)設(shè)計(jì)模式)。用戶可以選擇用于將修復(fù)合成并修補(bǔ)目標(biāo)的策略。特定示例性實(shí)施方式還可以學(xué)習(xí)用戶選擇以將未來(lái)的修復(fù)解決方案最佳地排序,并且還可以按照排列順序向用戶呈現(xiàn)修復(fù)策略。特定實(shí)施方式還可以自主地運(yùn)行,修復(fù)整個(gè)軟件語(yǔ)料庫(kù)內(nèi)的缺陷或漏洞,包括連續(xù)地、周期性地和/或在設(shè)計(jì)環(huán)境中進(jìn)行修復(fù)。
除上文所討論的實(shí)施方式之外,可以針對(duì)多種用途利用本發(fā)明。例如,可以在軟件代碼的編程期間使用示例性實(shí)施方式以輔助程序員,包括識(shí)別缺陷或建議代碼重用??梢詫⒏郊邮纠詫?shí)施方式用于發(fā)現(xiàn)缺陷和漏洞并可選地自動(dòng)地將其修復(fù)??梢允褂闷渌纠詫?shí)施方式來(lái)優(yōu)化代碼,包括識(shí)別未使用的代碼、低效的代碼以及用以替換不那么高效的代碼的推薦代碼。
示例性實(shí)施方式還可以被用于風(fēng)險(xiǎn)管理和評(píng)估,包括相對(duì)于在一些代碼中可能存在什么漏洞。還可以在設(shè)計(jì)認(rèn)證過(guò)程中使用附加實(shí)施方式,包括提供軟件文件沒(méi)有已知缺陷(諸如錯(cuò)誤、安全漏洞以及協(xié)議缺陷)的證明。
本發(fā)明的其它附加示例性實(shí)施方式包括:代碼重用發(fā)現(xiàn)器(在代碼庫(kù)中找到執(zhí)行同樣事情的代碼)、代碼質(zhì)量測(cè)量、文本描述至代碼轉(zhuǎn)換器、庫(kù)生成器、測(cè)試案例生成器、代碼-數(shù)據(jù)分離器、代碼映射和探索工具、現(xiàn)有代碼的自動(dòng)架構(gòu)生成、架構(gòu)改進(jìn)建議器、錯(cuò)誤/差錯(cuò)估計(jì)器、無(wú)用代碼發(fā)現(xiàn)、代碼-特征映射、自動(dòng)化補(bǔ)丁審閱器、代碼改進(jìn)決策工具(將特征列表映射到最小變化)、對(duì)現(xiàn)有設(shè)計(jì)工具(例如,企業(yè)設(shè)計(jì)師)的擴(kuò)展、替換實(shí)現(xiàn)建議器、代碼探索和學(xué)習(xí)工具(例如,用于教學(xué))、系統(tǒng)級(jí)代碼許可足跡以及企業(yè)軟件使用映射。
應(yīng)當(dāng)理解的是,可以用許多不同方式來(lái)實(shí)現(xiàn)上文所述示例性實(shí)施方式。在一些情況下,本文中所述的各種方法和機(jī)器每個(gè)可以用具有中央處理機(jī)、存儲(chǔ)器、磁盤或其它大容量?jī)?chǔ)存器、(多個(gè))通信接口、(多個(gè))輸入/輸出(I/O)設(shè)備及其它外圍設(shè)備的物理、虛擬或混合式通用計(jì)算機(jī)實(shí)現(xiàn)。該通用計(jì)算機(jī)被變換成執(zhí)行上述方法的機(jī)器,其例如通過(guò)將軟件指令加載到數(shù)據(jù)處理器中且然后引起指令的執(zhí)行以執(zhí)行本文中所述功能。還可以將軟件指令模塊化,諸如具有用于攝取文件以形成語(yǔ)料庫(kù)的攝取模塊、用以確定用于針對(duì)語(yǔ)料庫(kù)的文件和/或要針對(duì)設(shè)計(jì)模式而被識(shí)別或分析的文件的產(chǎn)物的分析模塊、用以執(zhí)行機(jī)器學(xué)習(xí)的圖形分析模塊和文本分析模塊、用于識(shí)別文件或設(shè)計(jì)模式的識(shí)別模塊以及用于修復(fù)代碼或提供已更新或已修復(fù)文件的修復(fù)模塊。針對(duì)特定示例性實(shí)施方式,可以將這些模塊組合或分離成附加模塊。
如在本領(lǐng)域中已知的,此類計(jì)算機(jī)可以包含系統(tǒng)總線,其中,總線是被用于計(jì)算機(jī)或處理系統(tǒng)的組件之間的數(shù)據(jù)傳輸?shù)囊唤M硬件線??偩€或多條總線本質(zhì)上是共享導(dǎo)管,其連接計(jì)算機(jī)系統(tǒng)的不同元件,諸如處理器、磁盤儲(chǔ)存器、存儲(chǔ)器、輸入/輸出端口、網(wǎng)絡(luò)端口等,這使得能夠?qū)崿F(xiàn)元件之間的信息傳輸。一個(gè)或多個(gè)中央處理器單元被附接到系統(tǒng)總線并提供計(jì)算機(jī)指令的執(zhí)行。還被附接到系統(tǒng)總線的通常是用于將各種輸入和輸出設(shè)備(例如,鍵盤、鼠標(biāo)、顯示器、打印機(jī)、揚(yáng)聲器等)連接到計(jì)算機(jī)的I/O設(shè)備接口。網(wǎng)絡(luò)接口允許計(jì)算機(jī)連接到被附接到網(wǎng)絡(luò)的各種其它設(shè)備。存儲(chǔ)器提供用于被用來(lái)實(shí)現(xiàn)實(shí)施方式的計(jì)算機(jī)軟件指令和數(shù)據(jù)的易失性存儲(chǔ)。磁盤或其它大容量?jī)?chǔ)存器提供用于被用來(lái)實(shí)現(xiàn)例如本文中所述的各種程序的計(jì)算機(jī)軟件指令和數(shù)據(jù)的非易失性存儲(chǔ)。
實(shí)施方式因此通??梢杂糜布?、固件、軟件或其任何組合來(lái)實(shí)現(xiàn)。此外,示例性實(shí)施方式可以完全或部分地駐留于云上,并且可以經(jīng)由因特網(wǎng)或其它聯(lián)網(wǎng)架構(gòu)而可訪問(wèn)。
在一些實(shí)施方式中,本文中所述的進(jìn)程、設(shè)備以及過(guò)程組成計(jì)算機(jī)程序產(chǎn)品,包括非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),例如可移動(dòng)存儲(chǔ)介質(zhì),諸如一個(gè)或多個(gè)DVD-ROM、CD-ROM、磁盤、磁帶等,其提供用于系統(tǒng)的軟件指令的至少一部分。可以用任何適當(dāng)?shù)能浖惭b程序來(lái)安裝此類計(jì)算機(jī)程序產(chǎn)品,如在本領(lǐng)域中眾所周知的。在另一實(shí)施方式中,還可以通過(guò)線纜、通信和/或無(wú)線連接來(lái)下載軟件指令的至少一部分。
此外,在本文中可以將固件、軟件、例程或指令描述為執(zhí)行數(shù)據(jù)處理器的一些動(dòng)作和/或功能。仍然,應(yīng)認(rèn)識(shí)到的是,包含在本文中的此類描述僅僅是為了方便起見,并且此類動(dòng)作事實(shí)上由計(jì)算設(shè)備、處理器、控制器或執(zhí)行固件、軟件、例程、指令等的其它設(shè)備而引起。
還應(yīng)當(dāng)理解的是,流程圖、框圖以及網(wǎng)絡(luò)圖可以包括被不同地布置或者不同地表示更多或更少的元件。但是進(jìn)一步應(yīng)理解的是,特定實(shí)施方式可以規(guī)定圖示出實(shí)施方式的執(zhí)行的框圖和網(wǎng)絡(luò)圖及框圖和網(wǎng)絡(luò)圖的數(shù)目以特定方式來(lái)實(shí)現(xiàn)。
因此,還可以用多種計(jì)算機(jī)架構(gòu)、物理、虛擬、云計(jì)算機(jī)和/或其某種組合來(lái)實(shí)現(xiàn)其它實(shí)施方式,并且因此本文中所述的數(shù)據(jù)處理器僅僅意圖用于舉例說(shuō)明的目的,而不作為實(shí)施方式的限制。
雖然已參照本發(fā)明的示例性實(shí)施方式特別地示出并描述了本發(fā)明,但本領(lǐng)域的技術(shù)人員將理解的是,在不脫離所附權(quán)利要求所涵蓋的本發(fā)明的范圍的情況下,可對(duì)其進(jìn)行形式和細(xì)節(jié)方面的各種改變。