本發(fā)明涉及源代碼分析領(lǐng)域,尤其涉及一種基于缺陷模式的靜態(tài)分析方法和工具。
背景技術(shù):
當(dāng)前,我國(guó)軟硬件基礎(chǔ)設(shè)施,包括處理器、操作系統(tǒng)、甚至關(guān)鍵應(yīng)用軟件(如數(shù)據(jù)庫(kù)、應(yīng)用服務(wù)器)等,大多依賴于國(guó)外技術(shù)?!袄忡R門”事件深刻表明:軟硬件基礎(chǔ)平臺(tái)不自主,安全防護(hù)體系便形同虛設(shè)。為響應(yīng)中央軍委提出“大力推進(jìn)自主可控信息系統(tǒng)建設(shè),擺脫信息技術(shù)受制于人的局面”的要求,國(guó)家先后發(fā)布了一系列政策文件,強(qiáng)力推進(jìn)國(guó)產(chǎn)自主化建設(shè)應(yīng)用。
自主可控平臺(tái)采用國(guó)產(chǎn)龍芯、飛騰芯片架構(gòu),運(yùn)行基于linux的中標(biāo)麒麟操作系統(tǒng)。由于wintel環(huán)境下底層操作指令、硬件環(huán)境及系統(tǒng)開(kāi)發(fā)環(huán)境與自主可控平臺(tái)下存在較大差異。如windows平臺(tái)與linux平臺(tái)間底層操作指令的不同,intel芯片與國(guó)產(chǎn)龍芯、飛騰芯片架構(gòu)的不同,原來(lái)在政府、各企事業(yè)單位研制的基于windows集成開(kāi)發(fā)環(huán)境的各類應(yīng)用系統(tǒng),存在與linux平臺(tái)開(kāi)發(fā)環(huán)境不兼容等問(wèn)題,造成原有應(yīng)用軟件在自主可控服務(wù)器及自主可控終端無(wú)法直接運(yùn)行。
在進(jìn)行自主可控應(yīng)用軟件的遷移改造或重構(gòu)工作中,已經(jīng)形成的信息化建設(shè)的成果不能由于自主可控而全部丟棄,而如果因自主可控而導(dǎo)致信息化水平的大幅后退也是用戶不能接受的,因此需要有相應(yīng)的手段能夠?qū)⒒趙intel環(huán)境下研制的各類信息化軟件在自主可控平臺(tái)上完成順利遷移改造或快速的重建。
因此迫切需要一種源代碼評(píng)估方法,用于快速評(píng)估軟件系統(tǒng)進(jìn)行自主可控平臺(tái)遷移的可行性,并對(duì)遷移前的準(zhǔn)備做出指導(dǎo),實(shí)現(xiàn)應(yīng)用系統(tǒng)的兼容性檢查,完成對(duì)應(yīng)用系統(tǒng)的自主可控遷移評(píng)估和指導(dǎo)等工作。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明一種基于缺陷模式的程序靜態(tài)分析方法,包括:預(yù)編輯程序的缺陷模式;遍歷文件,找到所需分析的文件;對(duì)源程序進(jìn)行逐行掃描,去除無(wú)需分析的代碼;進(jìn)行缺陷分析,調(diào)用該缺陷模式與去除代碼后的程序進(jìn)行匹配,如果匹配成功,則說(shuō)明該文件存在該缺陷。
根據(jù)本發(fā)明的基于缺陷模式的程序靜態(tài)分析方法的一實(shí)施例,其中,遍歷文件,找到所需分析的文件,包括:通過(guò)讀取用戶指定的源程序所在目錄,獲取該目錄下所有文件,進(jìn)行遍歷,根據(jù)需要分析的問(wèn)題類型對(duì)文件進(jìn)行過(guò)濾。
根據(jù)本發(fā)明的基于缺陷模式的程序靜態(tài)分析方法的一實(shí)施例,其中,對(duì)源程序進(jìn)行逐行掃描得到的信息包括類名、所屬包、引用包、數(shù)據(jù)成員及其所屬類型、成員方法及其參數(shù)個(gè)數(shù)、參數(shù)類型與返回值。
根據(jù)本發(fā)明的基于缺陷模式的程序靜態(tài)分析方法的一實(shí)施例,其中,該缺陷模式存儲(chǔ)在數(shù)據(jù)庫(kù)中,進(jìn)行缺陷分析之前根據(jù)需要分析的文件類型、缺陷類型,從數(shù)據(jù)庫(kù)中讀取。
根據(jù)本發(fā)明的基于缺陷模式的程序靜態(tài)分析方法的一實(shí)施例,其中,得到調(diào)用該缺陷模式與該去除代碼后的程序進(jìn)行匹配的結(jié)果后,按照缺陷模式,對(duì)于每個(gè)缺陷模式,匯總該缺陷模式匹配成功的文件,每個(gè)文件中該缺陷模式匹配成功的次數(shù)及其所在行數(shù)。
本發(fā)明一種基于缺陷模式的靜態(tài)分析工具,其中,包括:分析引擎以及知識(shí)模式數(shù)據(jù)庫(kù)模塊;該知識(shí)模式數(shù)據(jù)庫(kù)模塊用于存儲(chǔ)程序的缺陷模式;該分析引擎用于遍歷文件,找到所需分析的文件;對(duì)源程序進(jìn)行逐行掃描,去除無(wú)需分析的代碼;以及從該知識(shí)模式數(shù)據(jù)庫(kù)模塊調(diào)用該缺陷模式并與去除代碼后的程序進(jìn)行匹配。
本發(fā)明的有益效果在于,本發(fā)明一種基于缺陷模式的靜態(tài)分析方法和工具,可以實(shí)現(xiàn)應(yīng)用系統(tǒng)的兼容性檢查,對(duì)遷移前的準(zhǔn)備做出指導(dǎo),對(duì)應(yīng)用系統(tǒng)的自主可控遷移進(jìn)行評(píng)估和指導(dǎo)。
附圖說(shuō)明
圖1所示為本發(fā)明基于缺陷模式的靜態(tài)分析工具的模塊圖;
圖2所示為本發(fā)明基于缺陷模式的靜態(tài)分析工具的工作流程圖。
具體實(shí)施方式
為使本發(fā)明的目的、內(nèi)容、和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。
圖1所示為本發(fā)明基于缺陷模式的靜態(tài)分析工具的模塊圖,如圖1所示,分析工具2包括:分析引擎3以及知識(shí)模式數(shù)據(jù)庫(kù)模塊5。
參考圖1,知識(shí)模式數(shù)據(jù)庫(kù)模塊5用于存儲(chǔ)缺陷模式。進(jìn)行缺陷分析之前需要根據(jù)需要分析的文件類型、缺陷類型,從數(shù)據(jù)庫(kù)中讀取。缺陷模式加載成功后,會(huì)存儲(chǔ)為缺陷模式數(shù)據(jù)模型,用于缺陷分析。
分析引擎3用于通過(guò)讀取用戶指定的源程序所在目錄,獲取該目錄下所有文件。遍歷該目錄下所有的文件和文件夾,根據(jù)需要分析的問(wèn)題類型對(duì)文件進(jìn)行過(guò)濾,例如分析java語(yǔ)言和sql語(yǔ)言的缺陷需要關(guān)注擴(kuò)展名為“.java”的源程序文件,分析javascript語(yǔ)言需要關(guān)注擴(kuò)展名為“.js”的源程序文件,同時(shí)需要跳過(guò)第三方的庫(kù)文件。將所有關(guān)注的文件基本信息匯總,形成文件信息的數(shù)據(jù)模型。分析引擎3還用于對(duì)對(duì)源程序進(jìn)行逐行掃描,去除無(wú)需分析的代碼,此處過(guò)濾掉了以“//”開(kāi)頭的單行注釋;以“/*”開(kāi)始并且以“*/”結(jié)尾的多行區(qū)塊注釋;以“@”開(kāi)頭的聲明語(yǔ)句;單獨(dú)成行的括號(hào),包括小括號(hào)“()”,中括號(hào)“[]”和大括號(hào)“{}”,以及空行。同時(shí),分析源代碼。對(duì)于“.java”文件,分析得到j(luò)ava類的基本信息,包括類名、所屬包、引用包、數(shù)據(jù)成員及其所屬類型、成員方法及其參數(shù)個(gè)數(shù)、參數(shù)類型與返回值。最后將經(jīng)過(guò)分析的源代碼及相關(guān)信息存儲(chǔ)到文件模型中,以后用于缺陷分析。分析引擎3根據(jù)文件模型和缺陷模式數(shù)據(jù)模型,進(jìn)行缺陷分析。首先遍歷文件模型,對(duì)于每個(gè)文件模型,遍歷缺陷模式數(shù)據(jù)模型,將文件模型的源代碼文件內(nèi)容與缺陷模式數(shù)據(jù)模型中的定義的缺陷形式進(jìn)行匹配,進(jìn)行模型匹配,如果匹配成功,則說(shuō)明該文件存在該缺陷。最后,把缺陷匹配信息存儲(chǔ)為數(shù)據(jù)模型。并基于數(shù)據(jù)模型,生成分析結(jié)果。分析結(jié)果按照缺陷模式區(qū)分,對(duì)于每個(gè)缺陷模式,匯總該缺陷模式匹配成功的文件,每個(gè)文件中該缺陷模式匹配成功的次數(shù)及其所在行數(shù)。對(duì)于每個(gè)缺陷模式,還會(huì)列出針對(duì)性的解決建議,用戶可以根據(jù)解決建議進(jìn)行源代碼的修改。
本發(fā)明還提供了一種基于缺陷模式的靜態(tài)分析方法,主要用于分析源程序語(yǔ)言為java語(yǔ)言和javascript語(yǔ)言。
缺陷模式劃分為三大類別:java語(yǔ)言的缺陷模式、javascript語(yǔ)言的缺陷模式和sql語(yǔ)言的缺陷模式。
java語(yǔ)言的缺陷模式可以細(xì)分為系統(tǒng)調(diào)用缺陷模式、新建數(shù)組/容器對(duì)象缺陷模式、對(duì)象實(shí)例化缺陷模式。其中系統(tǒng)調(diào)用缺陷模式是指java程序中調(diào)用了系統(tǒng)相關(guān)的腳本或者可執(zhí)行程序,由于自主可控平臺(tái)運(yùn)行基于linux的操作系統(tǒng),原有在windows上調(diào)用的腳本或可執(zhí)行程序在自主可控平臺(tái)上不能運(yùn)行。新建數(shù)組/容器對(duì)象缺陷模式、對(duì)象實(shí)例化缺陷模式涉及java的垃圾自動(dòng)回收機(jī)制,java垃圾自動(dòng)回收機(jī)制在自主可控平臺(tái)上影響jvm運(yùn)行效率,建議手動(dòng)回收。
javascript語(yǔ)言的缺陷模式可以細(xì)分為方法調(diào)用缺陷模式、activex缺陷模式、對(duì)話框打開(kāi)缺陷模式、頁(yè)面跳轉(zhuǎn)缺陷模式、頁(yè)面元素獲取缺陷模式。其中方法調(diào)用缺陷模式是指某些javascript方法,例如innertext,在ie中能正常工作,但是在自主可控平臺(tái)的linux系統(tǒng)上沒(méi)有ie瀏覽器,需要兼容firefox瀏覽器;activex缺陷模式是指在ie下,可以使用activex控件;firefox下,無(wú)法使用。activex控件技術(shù)僅限于windows平臺(tái),需要基于npapi或qtbrowserplugin,重新開(kāi)發(fā)firefox插件。javascript語(yǔ)言相關(guān)的缺陷模式就是解決firefox瀏覽器兼容性的問(wèn)題。
sql語(yǔ)言缺陷模式則是指內(nèi)置函數(shù)缺陷模式。原有在windows平臺(tái)開(kāi)發(fā)的應(yīng)用系統(tǒng)用到了sqlserver、mysql、oracle等數(shù)據(jù)庫(kù)。自主可控平臺(tái)需要運(yùn)行國(guó)產(chǎn)數(shù)據(jù)庫(kù),如達(dá)夢(mèng)數(shù)據(jù)庫(kù)和神通數(shù)據(jù)庫(kù)。兩類數(shù)據(jù)庫(kù)雖然都支持標(biāo)準(zhǔn)的sql語(yǔ)句,但是在內(nèi)置函數(shù)上存在較大區(qū)別,sql語(yǔ)言缺陷模式的目的是解決數(shù)據(jù)庫(kù)內(nèi)置函數(shù)不兼容的問(wèn)題。
本發(fā)明涉及一種基于缺陷模式的靜態(tài)分析方法包括:
獲取源程序
通過(guò)讀取用戶指定的源程序所在目錄,獲取該目錄下所有文件。遍歷該目錄下所有的文件和文件夾,根據(jù)需要分析的問(wèn)題類型對(duì)文件進(jìn)行過(guò)濾,例如分析java語(yǔ)言和sql語(yǔ)言的缺陷需要關(guān)注擴(kuò)展名為“.java”的源程序文件,分析javascript語(yǔ)言需要關(guān)注擴(kuò)展名為“.js”的源程序文件,同時(shí)需要跳過(guò)第三方的庫(kù)文件。將所有關(guān)注的文件基本信息匯總,形成文件信息的數(shù)據(jù)模型。
分析源程序
對(duì)源程序進(jìn)行逐行掃描,去除無(wú)需分析的代碼,此處過(guò)濾掉了以“//”開(kāi)頭的單行注釋;以“/*”開(kāi)始并且以“*/”結(jié)尾的多行區(qū)塊注釋;以“@”開(kāi)頭的聲明語(yǔ)句;單獨(dú)成行的括號(hào),包括小括號(hào)“()”,中括號(hào)“[]”和大括號(hào)“{}”,以及空行。
同時(shí),分析源代碼。對(duì)于“.java”文件,分析得到j(luò)ava類的基本信息,包括類名、所屬包、引用包、數(shù)據(jù)成員及其所屬類型、成員方法及其參數(shù)個(gè)數(shù)、參數(shù)類型與返回值。最后將經(jīng)過(guò)分析的源代碼及相關(guān)信息存儲(chǔ)到文件模型中,以后用于缺陷分析。
缺陷模式加載
將缺陷模式存儲(chǔ)在數(shù)據(jù)庫(kù)中。進(jìn)行缺陷分析之前需要根據(jù)需要分析的文件類型、缺陷類型,從數(shù)據(jù)庫(kù)中讀取。缺陷模式加載成功后,會(huì)存儲(chǔ)為缺陷模式數(shù)據(jù)模型,用于缺陷分析。
缺陷分析
基于步驟2生成的文件模型和步驟3生成的缺陷模式數(shù)據(jù)模型,進(jìn)行缺陷分析。首先遍歷文件模型,對(duì)于每個(gè)文件模型,遍歷缺陷模式數(shù)據(jù)模型,將文件模型的源代碼文件內(nèi)容與缺陷模式數(shù)據(jù)模型中的定義的缺陷形式進(jìn)行匹配,進(jìn)行模型匹配,如果匹配成功,則說(shuō)明該文件存在該缺陷。最后,把缺陷匹配信息存儲(chǔ)為數(shù)據(jù)模型。
生成分析結(jié)果
基于步驟4生成的數(shù)據(jù)模型,生成分析結(jié)果。分析結(jié)果按照缺陷模式區(qū)分,對(duì)于每個(gè)缺陷模式,匯總該缺陷模式匹配成功的文件,每個(gè)文件中該缺陷模式匹配成功的次數(shù)及其所在行數(shù)。對(duì)于每個(gè)缺陷模式,還會(huì)列出針對(duì)性的解決建議,用戶可以根據(jù)解決建議進(jìn)行源代碼的修改。
為了探索高效易用的擴(kuò)展方式,從而降低用戶的學(xué)習(xí)成本、快速增強(qiáng)工具的缺陷查找能力,本發(fā)明提出了一個(gè)支持半自動(dòng)化擴(kuò)展的代碼缺陷靜態(tài)分析方法,該方法具有以下特點(diǎn):
根據(jù)遷移經(jīng)驗(yàn)形成了針對(duì)自主可控平臺(tái)的缺陷模式庫(kù)?;谝郧皯?yīng)用系統(tǒng)的遷移過(guò)程中遇到的問(wèn)題和解決方法,歸納總結(jié)出來(lái)一套遷移經(jīng)驗(yàn)庫(kù),并形成適用于自主可控平臺(tái)應(yīng)用系統(tǒng)代碼靜態(tài)分析的缺陷模式庫(kù),該庫(kù)包含了對(duì)應(yīng)用系統(tǒng)源碼進(jìn)行靜態(tài)分析時(shí)所需要用到的缺陷模式描述,以及對(duì)于每個(gè)缺陷模式總結(jié)了建議的解決方法和解決所需工作量。
提供了缺陷模式庫(kù)的“半自動(dòng)化擴(kuò)展”機(jī)制。提供了若干不同類型的“缺陷模式描述模板”。用戶可以根據(jù)自身需要,選擇適當(dāng)?shù)哪0鍋?lái)快速增加缺陷模式。用戶選擇模板和填入必要信息,生成符合格式要求的“缺陷模式描述”,然后添加至缺陷模式庫(kù)中。缺陷模式庫(kù)的半自動(dòng)擴(kuò)展機(jī)制使用戶免于手工編寫代碼,也不需要為描述缺陷模式而花費(fèi)太多的精力學(xué)習(xí)某種語(yǔ)言。
本發(fā)明的有益效果在于,該方法可以實(shí)現(xiàn)應(yīng)用系統(tǒng)的兼容性檢查,對(duì)遷移前的準(zhǔn)備做出指導(dǎo),對(duì)應(yīng)用系統(tǒng)的自主可控遷移進(jìn)行評(píng)估和指導(dǎo)。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明技術(shù)原理的前提下,還可以做出若干改進(jìn)和變形,這些改進(jìn)和變形也應(yīng)視為本發(fā)明的保護(hù)范圍。