專利名稱:一種基于嵌入式軟件的靜態(tài)檢測(cè)方法及其系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件檢測(cè)技術(shù)領(lǐng)域,特別是涉及一種基于嵌入式軟件的靜態(tài)檢測(cè)方法及其系統(tǒng)。
背景技術(shù):
嵌入式系統(tǒng)發(fā)展到目前 ,廣泛應(yīng)用于自動(dòng)化控制、軍事技術(shù)、工業(yè)控制、科學(xué)研究、醫(yī)學(xué)研究、交通管理、人工智能等系統(tǒng)環(huán)境中。嵌入式系統(tǒng)中,硬件是核心,軟件是靈魂,嵌入式軟件在整體系統(tǒng)中處于關(guān)鍵地位。如何在盡量縮短開(kāi)發(fā)周期的條件下,保證嵌入式軟件的質(zhì)量、可靠性、安全性等,成為了一個(gè)備受關(guān)注的課題。因此,嵌入式軟件測(cè)試的重要性日關(guān)出。在嵌入式軟件開(kāi)發(fā)過(guò)程中,代碼中存在的錯(cuò)誤發(fā)現(xiàn)越晚,則維護(hù)代價(jià)越高,所以,盡早地發(fā)現(xiàn)并解決代碼中存在的錯(cuò)誤,對(duì)控制嵌入式軟件的開(kāi)發(fā)成本及保證嵌入式軟件質(zhì)量至關(guān)重要。靜態(tài)檢測(cè)是在不運(yùn)行程序的情況下,對(duì)源代碼結(jié)構(gòu)進(jìn)行分析發(fā)現(xiàn)潛在錯(cuò)誤,能夠在開(kāi)發(fā)階段發(fā)現(xiàn)源碼中存在的問(wèn)題,這對(duì)于控制嵌入式軟件開(kāi)發(fā)周期及降低數(shù)字家嵌入式軟件維護(hù)成本具有重要的意義。目前已存在也存在針對(duì)C進(jìn)行靜態(tài)檢測(cè)的工具,有的基于命令行工作,比如Splint, CPPCheck,容易產(chǎn)生較多警告信息,其中一些為誤報(bào)信息,容易淹沒(méi)正常錯(cuò)誤信息,檢測(cè)結(jié)果不易查看。有的價(jià)格昂貴,比如QAC/C++、PC-Lint> LDRA及PolySpace,對(duì)于小成本嵌入式項(xiàng)目來(lái)說(shuō),測(cè)試成本難以接受,難于推廣。另外,現(xiàn)有的靜態(tài)檢測(cè)技術(shù)在檢測(cè)過(guò)程中僅考慮控制流信息,沒(méi)有考慮數(shù)據(jù)流分析,對(duì)某些錯(cuò)誤無(wú)法檢測(cè);沒(méi)有對(duì)路徑別名進(jìn)行分析,會(huì)產(chǎn)生許多誤報(bào)信息。現(xiàn)有的免費(fèi)靜態(tài)檢測(cè)工具基于命令行工作,無(wú)法直觀定位違規(guī)路徑信息,不方便開(kāi)發(fā)人員根據(jù)檢測(cè)結(jié)果對(duì)源碼中存在的錯(cuò)誤問(wèn)題進(jìn)行修改??傮w來(lái)說(shuō)現(xiàn)有技術(shù)存在以下不足
1)檢測(cè)過(guò)程僅使用控制流信息,沒(méi)有集合數(shù)據(jù)流信息,某些錯(cuò)誤無(wú)法檢測(cè);
2)沒(méi)有對(duì)路徑別名進(jìn)行分析,會(huì)產(chǎn)生誤報(bào)信息;
3)沒(méi)有對(duì)違反規(guī)則的執(zhí)行路徑定位,檢測(cè)結(jié)果不能被其他工具利用。
發(fā)明內(nèi)容
為了克服現(xiàn)有技術(shù)的不足,本發(fā)明的一個(gè)技術(shù)目的是提供一種使用方便,能夠很好實(shí)現(xiàn)對(duì)源文件進(jìn)行檢測(cè)的基于嵌入式軟件的靜態(tài)檢測(cè)方法。為了克服現(xiàn)有技術(shù)的不足,本發(fā)明的另一個(gè)技術(shù)目的是提供一種使用方便,能夠很好實(shí)現(xiàn)對(duì)源文件進(jìn)行檢測(cè)的基于嵌入式軟件的靜態(tài)檢測(cè)方法。為實(shí)現(xiàn)上述技術(shù)目的,本發(fā)明采用的技術(shù)方案如下
一種基于嵌入式軟件的靜態(tài)檢測(cè)方法,包括以下步驟
對(duì)源文件結(jié)構(gòu)進(jìn)行分析,生成控制流、數(shù)據(jù)流信息的步驟;
對(duì)規(guī)則文件進(jìn)行解析的步驟;根據(jù)解析產(chǎn)生的規(guī)則約束字符串構(gòu)造正則表達(dá)式的步驟;
根據(jù)正則表達(dá)式、控制流、數(shù)據(jù)流信息執(zhí)行規(guī)則匹配的步驟;
如果發(fā)現(xiàn)匹配條目,則對(duì)違反檢測(cè)規(guī)則的語(yǔ)句及控制流路徑進(jìn)行記錄,進(jìn)行封裝,將封裝產(chǎn)生的檢測(cè)結(jié)果,然后進(jìn)行分析顯示。優(yōu)選地,所述執(zhí)行規(guī)則匹配,還包括在規(guī)則匹配過(guò)程更新路徑別名信息的步驟。優(yōu)選地,更新路徑別名信息具體為根據(jù)動(dòng)態(tài)內(nèi)存分配、動(dòng)態(tài)內(nèi)存釋放及指針變量賦值操作時(shí)更新路徑別名信息。優(yōu)選地,還包括通過(guò)預(yù)設(shè)的敏感資源檢測(cè)庫(kù)對(duì)源文件進(jìn)行敏感檢測(cè)的步驟。
優(yōu)選地,所述規(guī)則匹配為在GMPLE圖上執(zhí)行匹配操作,根據(jù)檢測(cè)規(guī)則的復(fù)雜程 度,執(zhí)行相應(yīng)程度的規(guī)則檢測(cè)。為實(shí)現(xiàn)上述第二個(gè)技術(shù)目的,本發(fā)明采用的技術(shù)方案如下
一種基于嵌入式軟件的靜態(tài)檢測(cè)系統(tǒng),包括
用于負(fù)責(zé)向GCC插件框架注冊(cè)需監(jiān)聽(tīng)的插件事件,GCC插件框架在監(jiān)聽(tīng)的插件事件產(chǎn)生后會(huì)調(diào)用預(yù)先定義的回調(diào)函數(shù)的事件注冊(cè)模塊;
負(fù)責(zé)對(duì)源代碼進(jìn)行解析生成控制流,數(shù)據(jù)依賴,GIMPLE圖等信息的結(jié)構(gòu)信息生成模
塊;
基于GIMPLE圖完成檢測(cè)工作,結(jié)合控制流及數(shù)據(jù)依賴信息進(jìn)行檢測(cè)的規(guī)則檢測(cè)模塊; 負(fù)責(zé)對(duì)規(guī)則文件進(jìn)行解析建立規(guī)則鏈的所述規(guī)則解析模塊;
對(duì)規(guī)則的模式字符串進(jìn)行處理生成正則表達(dá)式正則表示式構(gòu)建模塊;
負(fù)責(zé)在GMPLE圖上執(zhí)行匹配操作,根據(jù)檢測(cè)規(guī)則的復(fù)雜程度,執(zhí)行相應(yīng)程度的規(guī)則檢測(cè)的規(guī)則匹配模塊;
對(duì)路徑別名進(jìn)行分析處理的模塊,動(dòng)態(tài)內(nèi)存分配,動(dòng)態(tài)內(nèi)存釋放及指針變量賦值操作均影響路徑別名分析關(guān)系,當(dāng)檢測(cè)過(guò)程遇到上述操作語(yǔ)句時(shí),路徑別名分析模塊更新路徑別名信息的路徑別名分析模塊;
對(duì)靜態(tài)檢測(cè)結(jié)果采用統(tǒng)一格式進(jìn)行封裝,針對(duì)每條匹配結(jié)果,封裝保存詳細(xì)違規(guī)信息及違規(guī)路徑對(duì)應(yīng)的路徑條件信息的匹配結(jié)果封裝模塊。優(yōu)選地,還包括針對(duì)嵌入式軟件對(duì)敏感資源泄漏的特點(diǎn),靜態(tài)檢測(cè)工具預(yù)定義了一系列資源泄露檢測(cè)規(guī)則的保存庫(kù)預(yù)定義規(guī)則庫(kù)。與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)在于
本發(fā)明通過(guò)客戶端模塊和檢測(cè)執(zhí)行端模塊結(jié)合數(shù)據(jù)流信息對(duì)嵌入式軟件執(zhí)行靜態(tài)檢測(cè),并能對(duì)路徑別名進(jìn)行分析,減少誤報(bào)信息。
圖I為靜態(tài)檢測(cè)工具框架 圖2為靜態(tài)檢測(cè)工具檢測(cè)執(zhí)行端框架 圖3為GIPMLE圖構(gòu)建流程 圖4為正則表達(dá)式構(gòu)建流程 圖5為路徑別名分析模塊流程 圖6為路徑條件信息格式圖.
具體實(shí)施例方式下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用于解釋發(fā)明,并不用于限定實(shí)用新型。本發(fā)明為了實(shí)現(xiàn)可視化的嵌入式軟件的靜態(tài)檢測(cè),客戶端以Eclipse插件的形式運(yùn)行于開(kāi)發(fā)機(jī)JRE環(huán)境中,采用JFACE/SWT進(jìn)行GUI設(shè)計(jì),提供圖形化規(guī)則文件編輯支持,測(cè)試人員完成源文件編輯工作后,可對(duì)源文件執(zhí)行靜態(tài)檢測(cè),客戶端發(fā)送命令通知檢測(cè)執(zhí)行端開(kāi)始靜態(tài)檢測(cè)。檢測(cè)執(zhí)行端接收客戶端發(fā)送的開(kāi)始檢測(cè)命令,首先對(duì)源文件結(jié)構(gòu)進(jìn)行分析,生成控制流、數(shù)據(jù)流信息,調(diào)用規(guī)則解析模塊對(duì)規(guī)則文件進(jìn)行解析,根據(jù)解析產(chǎn)生的規(guī)則約束字符串構(gòu)造正則表達(dá)式。在正則表達(dá)式、控制流程圖、數(shù)據(jù)流程圖正確構(gòu)建的基礎(chǔ) 上,控制器調(diào)用規(guī)則匹配模塊執(zhí)行規(guī)則匹配,規(guī)則匹配過(guò)程更新路徑別名信息,如果發(fā)現(xiàn)匹配條目,則對(duì)違反檢測(cè)規(guī)則的語(yǔ)句及控制流路徑進(jìn)行記錄,并通過(guò)匹配結(jié)果封裝模塊進(jìn)行封裝,將封裝產(chǎn)生的檢測(cè)結(jié)果發(fā)送給客戶端供后者分析顯示??蛻舳藢?duì)檢測(cè)結(jié)果進(jìn)行分析、映射,根據(jù)檢測(cè)結(jié)果更新GUI,讓開(kāi)發(fā)人員能夠直觀地查看靜態(tài)檢測(cè)結(jié)果,直觀查看規(guī)則違反情況,如圖I所示。本發(fā)明為了結(jié)合數(shù)據(jù)流信息及路徑別名信息實(shí)現(xiàn)嵌入式軟件的靜態(tài)檢測(cè),檢測(cè)執(zhí)行端以GCC插件形式開(kāi)發(fā),執(zhí)行實(shí)際靜態(tài)檢測(cè)工作,框架圖如圖2所示,控制器調(diào)用插件事件注冊(cè)模塊完成GCC插件事件注冊(cè),當(dāng)對(duì)源文件結(jié)構(gòu)進(jìn)行分析,插件事件產(chǎn)生,插件框架回調(diào)函數(shù)完成結(jié)構(gòu)信息的生成工作,主要生成GMPLE圖、控制流程、數(shù)據(jù)流等結(jié)構(gòu)信息。GIMPLE圖是基于基本塊及各基本塊相鄰邊構(gòu)建的,結(jié)構(gòu)信息生成模塊遍歷每個(gè)基本塊,遍歷基本塊內(nèi)每條GMPLE語(yǔ)句,以GMPLE語(yǔ)句信息創(chuàng)建圖結(jié)點(diǎn)并連接結(jié)點(diǎn)之間的邊,最終完成GIMPLE圖構(gòu)建工作,詳細(xì)構(gòu)建流程如圖3所示。另一方面,控制器調(diào)用規(guī)則解析模塊解析規(guī)則文件,根據(jù)規(guī)則模式字符串構(gòu)建正則表達(dá)式,如圖4所示,規(guī)則匹配模塊負(fù)責(zé)在GMPLE圖上執(zhí)行匹配操作,根據(jù)規(guī)則的簡(jiǎn)易程度,分別調(diào)用相應(yīng)的檢測(cè)方式完成實(shí)際檢測(cè)工作,檢測(cè)過(guò)程中更新路徑別名信息,路徑別名分析模塊對(duì)路徑別名進(jìn)行分析處理,動(dòng)態(tài)內(nèi)存分配,動(dòng)態(tài)內(nèi)存釋放及指針變量賦值操作均影響路徑別名分析關(guān)系,當(dāng)檢測(cè)過(guò)程遇到上述操作語(yǔ)句時(shí),路徑別名分析模塊更新路徑別名信息,路徑別名分析模塊流程如圖5所示,如果存在匹配結(jié)果,即存在違反靜態(tài)檢測(cè)規(guī)則的執(zhí)行路徑,調(diào)用匹配結(jié)果封裝模塊生成客戶端可識(shí)別的結(jié)果數(shù)據(jù),供客戶端讀取解析,針對(duì)每條匹配結(jié)果,封裝保存詳細(xì)違規(guī)信息及違規(guī)路徑對(duì)應(yīng)的路徑條件信息。違規(guī)路徑采用如圖6所示的格式進(jìn)行保存,這樣可以方便其他程序?qū)β窂叫畔⒅貥?gòu)??蛻舳耸且訣clipse插件形式開(kāi)發(fā),按照MVC模式,即模型-視圖-控制器(Model-View-Control)模式進(jìn)行設(shè)計(jì),并且整個(gè)客戶端以Eclipse插件形式運(yùn)行于Eclipse JRE之上。視圖層在MVC模式中負(fù)責(zé)測(cè)試結(jié)果數(shù)據(jù)的顯示。它利用Eclipse擴(kuò)展點(diǎn)機(jī)制,對(duì)Eclipse進(jìn)行擴(kuò)展,以Eclipse插件的形式來(lái)實(shí)現(xiàn)測(cè)試結(jié)果顯示,接受用戶控制,Gimple匹配結(jié)果顯示,源文件編輯及匹配映射等功能。在視圖層,控制視圖對(duì)測(cè)試進(jìn)行控制,如選取被測(cè)試項(xiàng)目,選取被測(cè)試源文件,選取檢測(cè)規(guī)則文件及開(kāi)始執(zhí)行靜態(tài)檢測(cè)等。同時(shí),控制視圖委托控制器完成文件發(fā)送功能,啟動(dòng)測(cè)試結(jié)果手機(jī)線程等待接受測(cè)試結(jié)果數(shù)據(jù)。測(cè)試結(jié)果顯示視圖則用于顯示測(cè)試結(jié)果,如違反了哪條規(guī)則,哪些源代碼語(yǔ)語(yǔ)句違反了這些規(guī)則和用戶定義的規(guī)則警告信息等情況??刂茖涌刂瓢l(fā)送及接收數(shù)據(jù),對(duì)接收的結(jié)果數(shù)據(jù)進(jìn)行分析,并根據(jù)分析結(jié)果渲染視圖層。在分析映射渲染過(guò)程中,需要完成結(jié)果數(shù)據(jù)GMPLE語(yǔ)句到源代碼視圖相應(yīng)行數(shù)及GMPLE匹配視圖中相應(yīng)GMPLE結(jié)點(diǎn)的映射功能。模型層提供了客戶端幾個(gè)基本的數(shù)據(jù)模型, 包括匹配結(jié)果信息,匹配映射信息及用于更新視圖層的渲染信息。
權(quán)利要求
1.一種基于嵌入式軟件的靜態(tài)檢測(cè)方法,其特征在于,包括以下步驟 對(duì)源文件結(jié)構(gòu)進(jìn)行分析,生成GMPLE圖、控制流、數(shù)據(jù)流信息的步驟; 對(duì)預(yù)設(shè)的規(guī)則文件進(jìn)行解析的步驟; 根據(jù)解析產(chǎn)生的規(guī)則約束字符串構(gòu)造正則表達(dá)式的步驟; 根據(jù)正則表達(dá)式 、控制流、數(shù)據(jù)流信息執(zhí)行規(guī)則匹配的步驟; 如果發(fā)現(xiàn)匹配條目,則對(duì)違反檢測(cè)規(guī)則的語(yǔ)句及控制流路徑進(jìn)行記錄,進(jìn)行封裝,將封裝產(chǎn)生的檢測(cè)結(jié)果,然后進(jìn)行分析顯示。
2.根據(jù)權(quán)利要求I所述的基于嵌入式軟件的靜態(tài)檢測(cè)方法,其特征在于,在執(zhí)行規(guī)則匹配的步驟中,還包括在規(guī)則匹配過(guò)程更新路徑別名信息的步驟。
3.根據(jù)權(quán)利要求2所述的基于嵌入式軟件的靜態(tài)檢測(cè)方法,其特征在于,更新路徑別名信息具體為進(jìn)行動(dòng)態(tài)內(nèi)存分配、動(dòng)態(tài)內(nèi)存釋放及指針變量賦值操作時(shí),更新路徑別名信肩、O
4.根據(jù)權(quán)利要求I所述的基于嵌入式軟件的靜態(tài)檢測(cè)方法,其特征在于,還包括通過(guò)預(yù)設(shè)的敏感資源檢測(cè)庫(kù)對(duì)源文件進(jìn)行敏感檢測(cè)的步驟。
5.根據(jù)權(quán)利要求I所述的基于嵌入式軟件的靜態(tài)檢測(cè)方法,其特征在于,所述規(guī)則匹配為在GMPLE圖上執(zhí)行匹配操作,根據(jù)檢測(cè)規(guī)則的復(fù)雜程度,執(zhí)行相應(yīng)程度的規(guī)則檢測(cè)。
6.一種基于嵌入式軟件的靜態(tài)檢測(cè)系統(tǒng),其特征在于,包括 用于負(fù)責(zé)向GCC插件框架注冊(cè)需監(jiān)聽(tīng)的插件事件,GCC插件框架在監(jiān)聽(tīng)的插件事件產(chǎn)生后會(huì)調(diào)用預(yù)先定義的回調(diào)函數(shù)的插件事件注冊(cè)模塊; 負(fù)責(zé)對(duì)源代碼進(jìn)行解析生成控制流,數(shù)據(jù)依賴,GIMPLE圖等信息的結(jié)構(gòu)信息生成模塊; 基于GIMPLE圖完成檢測(cè)工作,結(jié)合控制流及數(shù)據(jù)依賴信息進(jìn)行檢測(cè)的規(guī)則檢測(cè)模塊; 負(fù)責(zé)對(duì)規(guī)則文件進(jìn)行解析建立規(guī)則鏈的所述規(guī)則解析模塊; 對(duì)規(guī)則的模式字符串進(jìn)行處理生成正則表達(dá)式正則表示式構(gòu)建模塊; 負(fù)責(zé)在GMPLE圖上執(zhí)行匹配操作,根據(jù)檢測(cè)規(guī)則的復(fù)雜程度,執(zhí)行相應(yīng)程度的規(guī)則檢測(cè)的規(guī)則匹配模塊; 對(duì)路徑別名進(jìn)行分析處理的模塊,動(dòng)態(tài)內(nèi)存分配,動(dòng)態(tài)內(nèi)存釋放及指針變量賦值操作均影響路徑別名分析關(guān)系,當(dāng)檢測(cè)過(guò)程遇到上述操作語(yǔ)句時(shí),路徑別名分析模塊更新路徑別名信息的路徑別名分析模塊; 對(duì)靜態(tài)檢測(cè)結(jié)果采用統(tǒng)一格式進(jìn)行封裝,針對(duì)每條匹配結(jié)果,封裝保存詳細(xì)違規(guī)信息及違規(guī)路徑對(duì)應(yīng)的路徑條件信息的匹配結(jié)果封裝模塊。
7.根據(jù)權(quán)利要求6所述的基于嵌入式軟件的靜態(tài)檢測(cè)系統(tǒng),其特征在于,還包括針對(duì)嵌入式軟件對(duì)敏感資源泄漏的特點(diǎn),靜態(tài)檢測(cè)工具預(yù)定義了一系列資源泄露檢測(cè)規(guī)則的保存庫(kù)預(yù)定義規(guī)則庫(kù)。
全文摘要
本發(fā)明提供一種基于嵌入式軟件靜態(tài)檢測(cè)的方法,該方法解決了現(xiàn)有靜態(tài)檢測(cè)技術(shù)的不足,結(jié)合控制流、數(shù)據(jù)流信息及路徑別名信息進(jìn)行靜態(tài)檢測(cè)。該方法包括檢測(cè)執(zhí)行端模塊和客戶端模塊,客戶端提供圖形化規(guī)則文件編輯支持,測(cè)試人員完成源文件編輯工作后,可對(duì)源文件執(zhí)行靜態(tài)檢測(cè),客戶端發(fā)送命令通知檢測(cè)執(zhí)行端開(kāi)始靜態(tài)檢測(cè)。檢測(cè)執(zhí)行端接收客戶端發(fā)送的開(kāi)始檢測(cè)命令,對(duì)源文件結(jié)構(gòu)進(jìn)行分析,調(diào)用規(guī)則解析模塊對(duì)規(guī)則文件進(jìn)行解析,處理后產(chǎn)生匹配結(jié)果,并通過(guò)匹配結(jié)果封裝模塊進(jìn)行封裝,將封裝產(chǎn)生的檢測(cè)結(jié)果發(fā)送給客戶端供后者分析顯示??蛻舳藢?duì)檢測(cè)結(jié)果進(jìn)行分析、映射,根據(jù)檢測(cè)結(jié)果更新客戶端,讓開(kāi)發(fā)人員能夠直觀地查看靜態(tài)檢測(cè)結(jié)果,直觀查看規(guī)則違反情況。
文檔編號(hào)G06F11/36GK102968367SQ20121030968
公開(kāi)日2013年3月13日 申請(qǐng)日期2012年8月28日 優(yōu)先權(quán)日2012年8月28日
發(fā)明者劉發(fā)貴, 賀南, 劉佳欣 申請(qǐng)人:華南理工大學(xué)