專利名稱:一種充分檢測(cè)空指針引用缺陷的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件靜態(tài)測(cè)試技術(shù)中的空指針檢測(cè)技術(shù),尤其涉及一種充分檢測(cè)空指針引用缺陷的方法。
背景技術(shù):
軟件測(cè)試是一種保障軟件質(zhì)量的過程,其根本目的是通過一些經(jīng)濟(jì)有效的方法,以盡可能少的時(shí)間和人力去發(fā)現(xiàn)軟件中存在的各種缺陷,進(jìn)而保證軟件的質(zhì)量。對(duì)于軟件測(cè)試,從基于是否需要運(yùn)行被測(cè)軟件的角度來分類,軟件測(cè)試分為動(dòng)態(tài)測(cè)試和靜態(tài)測(cè)試,其中,靜態(tài)測(cè)試也稱為靜態(tài)分析。靜態(tài)測(cè)試不實(shí)際運(yùn)行被測(cè)軟件,而是掃描源應(yīng)用,從中找出可能導(dǎo)致錯(cuò)誤的結(jié)構(gòu)異常、控制流異常及數(shù)據(jù)流異常等情況。靜態(tài)測(cè)試相較動(dòng)態(tài)測(cè)試而言,具有成本低、容易實(shí)現(xiàn)、能覆蓋所有路徑,且不依賴于特定的運(yùn)行環(huán)境的優(yōu)點(diǎn);其缺點(diǎn)是發(fā)現(xiàn)的問題往往不是真正的問題,需要人工確認(rèn)排查。現(xiàn)有的靜態(tài)測(cè)試方法存在大量誤報(bào)或漏報(bào)情況。而誤報(bào)的存在需要人工確認(rèn)以排除;漏報(bào)的存在會(huì)造成應(yīng)用具有較高質(zhì)量的假象,但是,漏報(bào)的缺陷一旦在軟件運(yùn)行時(shí)被觸發(fā),可能導(dǎo)致不可預(yù)測(cè)的不良后果。目前,具有代表性的代碼缺陷靜態(tài)測(cè)試工具主要有斯坦福大學(xué)的研究項(xiàng)目Metal、馬里蘭大學(xué)研發(fā)的Java應(yīng)用靜態(tài)測(cè)試工具FindBugs、開源的Java應(yīng)用靜態(tài)測(cè)試工具PMD、美國Klocwork公司研發(fā)的代碼缺陷檢測(cè)工具K8。但通過使用上述測(cè)試工具對(duì)空指針引用進(jìn)行測(cè)試,均會(huì)存在不同程度的誤報(bào)及漏報(bào)情況。因此,如何降低空指針引用缺陷的誤報(bào)率和漏報(bào)率,是目前亟需解決的問題。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種充分檢測(cè)空指針引用缺陷的方法,不但解決了空指針引用缺陷的漏報(bào)問題,而且能夠?qū)崿F(xiàn)對(duì)空指針引用缺陷的零漏報(bào)及低誤報(bào)。為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:本發(fā)明提供了一種充分檢測(cè)空指針引用缺陷的方法,所述方法包括:讀取被測(cè)應(yīng)用文件,對(duì)被測(cè)應(yīng)用進(jìn)行詞法分析和語法分析,生成被測(cè)應(yīng)用的抽象語法樹,根據(jù)所述抽象語法樹生成反映被測(cè)應(yīng)用控制結(jié)構(gòu)的控制流圖,并根據(jù)所述抽象語法樹創(chuàng)建被測(cè)應(yīng)用的符號(hào)表系統(tǒng)及類型系統(tǒng),基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式;根據(jù)所述控制流圖對(duì)被測(cè)應(yīng)用進(jìn)行保守的區(qū)間運(yùn)算與指針分析,并根據(jù)區(qū)間運(yùn)算與指針分析的結(jié)果,生成函數(shù)摘要;根據(jù)所述函數(shù)摘要以及抽象語法樹識(shí)別出全部的指針引用以及被引用的指針,并對(duì)每個(gè)被引用的指針創(chuàng)建空指針引用缺陷狀態(tài)機(jī)實(shí)例;基于所述控制流圖運(yùn)行空指針引用缺陷狀態(tài)機(jī)實(shí)例,對(duì)于所述控制流圖的每個(gè)節(jié)點(diǎn),根據(jù)區(qū)間運(yùn)算、指針分析的結(jié)果對(duì)每個(gè)缺陷狀態(tài)機(jī)實(shí)例分別進(jìn)行狀態(tài)遷移,并確定空指針引用集合、安全指針引用集合、不確定的指針引用集合。上述方案中,所述基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式,包括:基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的所有定義的符號(hào)以及所有使用的可尋址表達(dá)式。上述方案中,所述基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的所有使用的可尋址表達(dá)式,包括:從抽象語法樹上的后綴表達(dá)式節(jié)點(diǎn)識(shí)別所有使用的后綴表達(dá)式;從抽象語法樹上的一元表達(dá)式節(jié)點(diǎn)識(shí)別所有使用的指針引用表達(dá)式。上述方案中,所述根據(jù)控制流圖對(duì)被測(cè)應(yīng)用進(jìn)行保守的區(qū)間運(yùn)算與指針分析,包括:Al、根據(jù)控制流圖產(chǎn)生時(shí)的節(jié)點(diǎn)號(hào)順序,取控制流圖中的下一個(gè)節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),并在所述當(dāng)前節(jié)點(diǎn)為最后一個(gè)節(jié)點(diǎn)時(shí),結(jié)束當(dāng)前處理;否則執(zhí)行步驟A2 ;A2、對(duì)所述當(dāng)前節(jié)點(diǎn)上第一次出現(xiàn)的變量,用基于抽象內(nèi)存區(qū)域的四元模型〈Variable, Region, Expression, Domain〉對(duì)所述變量進(jìn)行建模,并根據(jù)所述變量的類型進(jìn)行初始操作,并設(shè)置初始區(qū)間值;若變量的類型是指針,則設(shè)置所述變量指向集合為空;其中,Variable為被建模的所述變量,Region為為所述變量分配的抽象內(nèi)存區(qū)域,Expression為符號(hào)表達(dá)式,Domain為取值區(qū)間;A3、對(duì)所述當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)上出現(xiàn)的除作用域的指針之外的每一個(gè)指針,確定每一個(gè)指針在所述當(dāng)前節(jié)點(diǎn)的所有前驅(qū)節(jié)點(diǎn)上的指向集合的并集,得到指針在所述當(dāng)前節(jié)點(diǎn)上的初始指向集合;其中,所述作用域?yàn)榉?hào)表系統(tǒng)中的作用域;A4、對(duì)所述當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的除作用域的變量之外的每一個(gè)變量,確定每一個(gè)變量在所述當(dāng)前節(jié)點(diǎn)的所有前驅(qū)節(jié)點(diǎn)上的取值區(qū)間的并集或區(qū)間集的并集,得到變量在所述當(dāng)前節(jié)點(diǎn)上的初始取值區(qū)間或初始區(qū)間集;判斷在所述當(dāng)前節(jié)點(diǎn)上是否存在某個(gè)變量的初始取值區(qū)間或初始區(qū)間集為空,若存在,則標(biāo)記該節(jié)點(diǎn)為矛盾節(jié)點(diǎn),執(zhí)行步驟Al ;若不存在,則執(zhí)行步驟A6;A5、根據(jù)所述當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的語句類型,對(duì)該節(jié)點(diǎn)上每個(gè)已獲得初始指向集合的指針進(jìn)行保守的指針分析,對(duì)該節(jié)點(diǎn)上的每個(gè)已獲得初始區(qū)間值或初始區(qū)間集的變量進(jìn)行保守的區(qū)間運(yùn)算,并執(zhí)行Al。上述方案中,所述對(duì)所述變量進(jìn)行建模,包括:變量為數(shù)組元素時(shí),還建立數(shù)組的Region與該變量Region的父子層次關(guān)系;變量為結(jié)構(gòu)體或聯(lián)合類型時(shí),還建立結(jié)構(gòu)體的Region或聯(lián)合的Region與該變量的Region的父子層次關(guān)系;變量為指針類型時(shí),還設(shè)置變量指向集合為空,設(shè)置變量初始狀態(tài)為不確定unsure 狀態(tài)。上述方案中,所述步驟A5包括:A51、若所述當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的語句類型為賦值語句,則執(zhí)行A52 ;若所述當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的語句類型為條件語句,則執(zhí)行A58 ; A52、確定被賦值變量為指針引用時(shí),執(zhí)行A53 ;確定被賦值變量為指針時(shí),執(zhí)行A55 ;確定被賦值變量的類型為結(jié)構(gòu)體或聯(lián)合時(shí),執(zhí)行A56 ;否則,執(zhí)行A57 ;
A53、如果被引用的指針的指向集合只有一個(gè)抽象內(nèi)存區(qū)域,則將該抽象內(nèi)存區(qū)域作為被賦值的抽象內(nèi)存區(qū)域,則執(zhí)行A52 ;如果被引用的指針的指向集合有多個(gè)抽象內(nèi)存區(qū)域,則執(zhí)行A54 ;A54、確定指向集合的每一個(gè)抽象內(nèi)存區(qū)域的取值區(qū)間為變量當(dāng)前的取值區(qū)間與右端表達(dá)式取值區(qū)間的并集;如果指向集合的抽象內(nèi)存區(qū)域類型為指針類型,則確定每一個(gè)抽象內(nèi)存區(qū)域的指向集合為當(dāng)前指向集合與右端表達(dá)式指向集合的并集;結(jié)束對(duì)當(dāng)前語句的處理;A55、確定指針變量的取值區(qū)間為右端表達(dá)式的取值區(qū)間,確定指針變量的指向集合為右端表達(dá)式的指向集合;A56、如果被賦值變量的類型為結(jié)構(gòu)體或聯(lián)合,將該變量的每個(gè)成員作為一個(gè)被賦值變量,將右側(cè)表達(dá)式中的每一個(gè)對(duì)應(yīng)的成員作為為該成員賦值的右側(cè)表達(dá)式,并執(zhí)行A52 ;A57、如果被賦值變量的類型為基本類型,則根據(jù)被賦值變量的類型及右端表達(dá)式確定該賦值語句中表達(dá)式的取值區(qū)間,并將所述被賦值變量的取值區(qū)間重置為所確定的表達(dá)式的取值區(qū)間;A58、若所述當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的語句類型為條件判斷語句,則對(duì)該節(jié)點(diǎn)所關(guān)聯(lián)的每一指針取初始的可能指向集后,分析該節(jié)點(diǎn)所關(guān)聯(lián)的每一指針在所述條件判斷語句中指向的可能集合和必然集合;對(duì)該節(jié)點(diǎn)所關(guān)聯(lián)的每一變量取初始的可能集后,計(jì)算該節(jié)點(diǎn)所關(guān)聯(lián)的每一變量在所述條件判斷語句中的取值的可能集和必然集,得到該節(jié)點(diǎn)所對(duì)應(yīng)的控制流圖中真假分支上的所述變量的取值。上述方案中,所述生成函數(shù)摘要,包括:生成函數(shù)摘要的前置約束條件、特征信息和后置約束條件。上述方案中,所述根據(jù)所述函數(shù)摘要以及抽象語法樹識(shí)別出全部的指針引用以及被引用的指針,包括:識(shí)別出所有過程內(nèi)及過程間的指針引用以及被引用的指針;其中,所有過程內(nèi)指針引用包括:在抽象語法樹的一元表達(dá)式節(jié)點(diǎn)上識(shí)別出指針引用,以及被引用的指針;在抽象語法樹的后綴表達(dá)式節(jié)點(diǎn)上識(shí)別出的指針引用,以及被引用的指針;所有過程間指針引用包括:在抽象語法樹的一元表達(dá)式節(jié)點(diǎn)上識(shí)別出函數(shù)調(diào)用表達(dá)式;如果函數(shù)調(diào)用表達(dá)式對(duì)應(yīng)的被調(diào)用函數(shù)有函數(shù)摘要時(shí),則獲取函數(shù)摘要的前置約束條件以及所述前置約束條件中全部被約束變量,將與所述被約束變量對(duì)應(yīng)的實(shí)參或全局變量作為被引用的指針;如果函數(shù)調(diào)用表達(dá)式對(duì)應(yīng)的被調(diào)用函數(shù)沒有函數(shù)摘要時(shí),則將傳遞給被調(diào)用函數(shù)的所有指針類型參數(shù)作為被引用的指針。上述方案中,所述基于所述控制流圖運(yùn)行空指針引用缺陷狀態(tài)機(jī)實(shí)例,對(duì)于所述控制流圖的每個(gè)節(jié)點(diǎn),根據(jù)區(qū)間運(yùn)算、指針分析的結(jié)果對(duì)每個(gè)缺陷狀態(tài)機(jī)實(shí)例分別進(jìn)行狀態(tài)遷移,并確定空指針引用集合、安全指針引用集合、不確定的指針引用集合,包括:B1、根據(jù)控制流圖產(chǎn)生時(shí)的節(jié)點(diǎn)號(hào)順序,取控制流圖中的下一個(gè)節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),如果所述當(dāng)前節(jié)點(diǎn)為最后 一個(gè)節(jié)點(diǎn),則結(jié)束對(duì)當(dāng)前函數(shù)的空指針引用檢測(cè);否則執(zhí)行步驟B2 ;B2、對(duì)所述當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)上出現(xiàn)的缺陷狀態(tài)機(jī)實(shí)例集合,在多個(gè)缺陷狀態(tài)機(jī)實(shí)例關(guān)聯(lián)同一個(gè)指針變量時(shí),合并所述多個(gè)缺陷狀態(tài)機(jī)實(shí)例,作為該指針變量對(duì)應(yīng)的新的缺陷狀態(tài)機(jī)實(shí)例;B3、在當(dāng)前節(jié)點(diǎn)的缺陷狀態(tài)機(jī)實(shí)例關(guān)聯(lián)的指針變量的取值發(fā)生變化時(shí),確定變量對(duì)應(yīng)的缺陷狀態(tài)機(jī)實(shí)例的狀態(tài)產(chǎn)生遷移;B4、在所述當(dāng)前節(jié)點(diǎn)上出現(xiàn)指針引用時(shí),根據(jù)被引用指針在當(dāng)前節(jié)點(diǎn)上的取值對(duì)指針引用進(jìn)行檢測(cè);B5、結(jié)束當(dāng)前節(jié)點(diǎn)上的空指針引用檢測(cè),執(zhí)行BI。上述方案中,所述在所述當(dāng)前節(jié)點(diǎn)上出現(xiàn)指針引用時(shí),根據(jù)被引用指針在當(dāng)前節(jié)點(diǎn)上的取值對(duì)指針引用進(jìn)行檢測(cè),還包括:在非空狀態(tài)下進(jìn)行安全引用時(shí),將所述指針引用輸入到安全指針引用集合;在空狀態(tài)下進(jìn)行空指針引用時(shí),將所述指針引用輸入到空指針引用集合;在不確定狀態(tài)下進(jìn)行了指針引用時(shí),將所述指針引用輸入到不確定指針引用集合。本發(fā)明所提供的充分檢測(cè)空指針引用缺陷的方法,基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式;根據(jù)控制流圖對(duì)被測(cè)應(yīng)用進(jìn)行保守的區(qū)間運(yùn)算與指針分析并根據(jù)區(qū)間運(yùn)算與指針分析的結(jié)果,生成函數(shù)摘要;根據(jù)所述函數(shù)摘要以及抽象語法樹識(shí)別出全部的指針引用以及被引用的指針,并對(duì)每個(gè)被引用的指針創(chuàng)建空指針引用缺陷狀態(tài)機(jī)實(shí)例;基于控制流圖運(yùn)行空指針引用缺陷狀態(tài)機(jī)實(shí)例,在控制流圖的每個(gè)節(jié)點(diǎn)上,根據(jù)區(qū)間運(yùn)算、指針分析的結(jié)果對(duì)每個(gè)缺陷狀態(tài)機(jī)實(shí)例進(jìn)行狀態(tài)遷移,進(jìn)行空指針引用檢測(cè)。如此,有效解決了空指針引用缺陷的漏報(bào)問題,能夠?qū)崿F(xiàn)空指針引用缺陷的零漏報(bào)以及低誤報(bào),提高了空指針引用缺陷檢測(cè)的充分性、可靠性以及準(zhǔn)確性。此外,本發(fā)明生成的抽象語法樹與被測(cè)源文件具有映射關(guān)系,可在抽象語法樹的表達(dá)式節(jié)點(diǎn)上準(zhǔn)確地識(shí)別出源應(yīng)用中出現(xiàn)的各種表達(dá)式;本發(fā)明能夠識(shí)別出全部的可尋址表達(dá)式、并通過類型系統(tǒng)的類型推導(dǎo)規(guī)則推導(dǎo)出其類型,保證識(shí)別出全部的指針引用及被引用的指針,從而保證了識(shí)別的準(zhǔn)確性。本發(fā)明的區(qū)間運(yùn)算與指針分析均采取保守的策略,保證區(qū)間運(yùn)算出的變量的取值區(qū)間包含所有運(yùn)行時(shí)可能取值,保證指針分析出的指針的指向集合包含所有運(yùn)行時(shí)可能的指向,從而保證了分析的可靠性。本發(fā)明進(jìn)行的空指針引用缺陷檢測(cè)是基于可靠的分析結(jié)果進(jìn)行的,對(duì)所識(shí)別的被引用的指針采用可靠的分析策略,對(duì)能明確指針指向信息的指針引用具有明確的檢測(cè)結(jié)果,對(duì)不能明確其指向信息的指針引用具有不確定的檢測(cè)結(jié)果,從而保證了檢測(cè)的充分性。
圖1為本發(fā)明充分檢測(cè)空指針引用缺陷的方法流程示意圖;圖2為基于控制流圖進(jìn)行的保守的區(qū)間運(yùn)算與指針分析的流程示意圖;圖3為對(duì)變量進(jìn)行抽象內(nèi)存建模的流程示意圖;圖4為根據(jù)當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的語句類型對(duì)每條語句進(jìn)行的指針分析與區(qū)間運(yùn)算流程圖5為左側(cè)表達(dá)式為復(fù)雜數(shù)據(jù)結(jié)構(gòu)類型的賦值表達(dá)式的指針分析與區(qū)間運(yùn)算過程圖;圖6為生成函數(shù)摘要的前置約束條件的過程圖;圖7為創(chuàng)建相關(guān)被引用指針的前置約束條件的處理流程圖;圖8為所有被檢測(cè)指針的識(shí)別及空指針引用缺陷狀態(tài)機(jī)創(chuàng)建的過程圖。
具體實(shí)施例方式下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明的技術(shù)方案進(jìn)一步詳細(xì)闡述。圖1為本發(fā)明充分檢測(cè)空指針引用缺陷的方法流程示意圖,如圖1所示,所述方法包括:步驟101:讀取被測(cè)應(yīng)用文件,對(duì)被測(cè)應(yīng)用進(jìn)行詞法分析和語法分析,生成被測(cè)應(yīng)用的抽象語法樹,根據(jù)所述抽象語法樹生成反映被測(cè)應(yīng)用控制結(jié)構(gòu)的控制流圖,并根據(jù)所述抽象語法樹創(chuàng)建被測(cè)應(yīng)用的符號(hào)表系統(tǒng)與類型系統(tǒng),基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式;具體的,本發(fā)明利用輔助工具生成被測(cè)應(yīng)用的抽象語法樹;所述輔助工具包括JJtree ;具體的,所述基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式,包括:基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的所有定義的符號(hào)以及所有使用的可尋址表達(dá)式;其中,基于抽象語法 樹識(shí)別出被測(cè)應(yīng)用的所有定義的符號(hào),包括:識(shí)別所有定義的函數(shù),并將識(shí)別的函數(shù)作為一個(gè)符號(hào)加入到相應(yīng)作用域中;識(shí)別所有定義的結(jié)構(gòu)體與聯(lián)合;并將識(shí)別出的結(jié)構(gòu)體與聯(lián)合作為一個(gè)符號(hào)加入到相應(yīng)作用域中;識(shí)別出結(jié)構(gòu)體與聯(lián)合的成員,并加入到相應(yīng)作用域中;識(shí)別所有定義的變量;其中,變量的類型為指針時(shí),將變量作為一個(gè)指針類型符號(hào)添加到相應(yīng)的作用域中,將指針的引用作為一個(gè)待識(shí)別的變量;變量的類型為數(shù)組時(shí),將變量作為一個(gè)數(shù)組類型符號(hào)添加到相應(yīng)的作用域中,將數(shù)組的每一個(gè)成員作為一個(gè)待識(shí)別的變量;變量的類型為結(jié)構(gòu)體或聯(lián)合時(shí),將變量作為一個(gè)結(jié)構(gòu)體與聯(lián)合類型符號(hào)添加到相應(yīng)的作用域中,將結(jié)構(gòu)體與聯(lián)合的每一個(gè)成員作為一個(gè)待識(shí)別的變量;否則,將變量作為一個(gè)基本類型符號(hào),添加到相應(yīng)的作用域中?;诔橄笳Z法樹識(shí)別出被測(cè)應(yīng)用的所有使用的可尋址表達(dá)式,包括:從抽象語法樹上的后綴表達(dá)式節(jié)點(diǎn)識(shí)別所有使用的后綴表達(dá)式;從抽象語法樹上的一元表達(dá)式節(jié)點(diǎn)識(shí)別所有使用的指針引用表達(dá)式。本發(fā)明采用四個(gè)級(jí)別的作用域存儲(chǔ)識(shí)別出的各類符號(hào),SourceFileScope是源文件作用域,一個(gè)文件只有一個(gè)SourceFileScope ;ClassScope是類作用域,對(duì)應(yīng)著定義的結(jié)構(gòu)體、聯(lián)合;MethodScope是函數(shù)作用域,對(duì)應(yīng)著定義的函數(shù);LocalScope是局部作用域,對(duì)應(yīng)著函數(shù)體內(nèi)的一個(gè)塊。對(duì)于id與id(exp),可通過其定義得到作用域。lvexp.1d、*lvexp、Ivexp- > id、lvexp [exp]分別與父層表達(dá)式Ivexp的作用域一致。為滿足可擴(kuò)展性,本發(fā)明的類型系統(tǒng)采取了兩級(jí)映射的策略。首先在源文件級(jí)對(duì)Token做映射,例如將_int64、_int32、int都映射成int。第二級(jí)數(shù)據(jù)類型映射是將代碼級(jí)的數(shù)據(jù)類型映射為本發(fā)明定義的類型。對(duì)于識(shí)別出的可尋址表達(dá)式,通過類型推導(dǎo)規(guī)則推導(dǎo)其類型。對(duì)于聲明的標(biāo)志符變量,根據(jù)其聲明可知其類型。對(duì)于復(fù)雜數(shù)據(jù)類型的變量:(1)如果是數(shù)組,可知其元素的類型;(2)如果是指針,可知其指向的表達(dá)式的類型;(3)如果是結(jié)構(gòu)體,可知其每個(gè)域成員的類型;對(duì)于不能通過聲明識(shí)別的可尋址表達(dá)式,可通過類型推導(dǎo)規(guī)則推導(dǎo)出其類型。不同可尋址表達(dá)式的類型推導(dǎo)規(guī)則為:結(jié)構(gòu)體成員exp.1d的類型推導(dǎo):
權(quán)利要求
1.一種充分檢測(cè)空指針引用缺陷的方法,其特征在于,所述方法包括: 讀取被測(cè)應(yīng)用文件,對(duì)被測(cè)應(yīng)用進(jìn)行詞法分析和語法分析,生成被測(cè)應(yīng)用的抽象語法樹,根據(jù)所述抽象語法樹生成反映被測(cè)應(yīng)用控制結(jié)構(gòu)的控制流圖,并根據(jù)所述抽象語法樹創(chuàng)建被測(cè)應(yīng)用的符號(hào)表系統(tǒng)及類型系統(tǒng),基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式; 根據(jù)所述控制流圖對(duì)被測(cè)應(yīng)用進(jìn)行保守的區(qū)間運(yùn)算與指針分析,并根據(jù)區(qū)間運(yùn)算與指針分析的結(jié)果,生成函數(shù)摘要; 根據(jù)所述函數(shù)摘要以及抽象語法樹識(shí)別出全部的指針引用以及被引用的指針,并對(duì)每個(gè)被引用的指針創(chuàng)建空指針引用缺陷狀態(tài)機(jī)實(shí)例; 基于所述控制流圖運(yùn)行空指針引用缺陷狀態(tài)機(jī)實(shí)例,對(duì)于所述控制流圖的每個(gè)節(jié)點(diǎn),根據(jù)區(qū)間運(yùn)算、指針分析的結(jié)果對(duì)每個(gè)缺陷狀態(tài)機(jī)實(shí)例分別進(jìn)行狀態(tài)遷移,并確定空指針引用集合、安全指針引用集合、不確定的指針引用集合。
2.根據(jù)權(quán)利要 求1所述的方法,其特征在于,所述基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式,包括: 基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的所有定義的符號(hào)以及所有使用的可尋址表達(dá)式。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的所有使用的可尋址表達(dá)式,包括: 從抽象語法樹上的后綴表達(dá)式節(jié)點(diǎn)識(shí)別所有使用的后綴表達(dá)式; 從抽象語法樹上的一元表達(dá)式節(jié)點(diǎn)識(shí)別所有使用的指針引用表達(dá)式。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述根據(jù)控制流圖對(duì)被測(cè)應(yīng)用進(jìn)行保守的區(qū)間運(yùn)算與指針分析,包括: Al、根據(jù)控制流圖產(chǎn)生時(shí)的節(jié)點(diǎn)號(hào)順序,取控制流圖中的下一個(gè)節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),并在所述當(dāng)前節(jié)點(diǎn)為最后一個(gè)節(jié)點(diǎn)時(shí),結(jié)束當(dāng)前處理;否則執(zhí)行步驟A2 ; A2、對(duì)所述當(dāng)前節(jié)點(diǎn)上第一次出現(xiàn)的變量,用基于抽象內(nèi)存區(qū)域的四元模型〈Variable, Region, Expression, Domain〉對(duì)所述變量進(jìn)行建模,并根據(jù)所述變量的類型進(jìn)行初始操作,并設(shè)置初始區(qū)間值;若變量的類型是指針,則設(shè)置所述變量指向集合為空;其中,Variable為被建模的所述變量,Region為為所述變量分配的抽象內(nèi)存區(qū)域,Expression為符號(hào)表達(dá)式,Domain為取值區(qū)間; A3、對(duì)所述當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)上出現(xiàn)的除作用域的指針之外的每一個(gè)指針,確定每一個(gè)指針在所述當(dāng)前節(jié)點(diǎn)的所有前驅(qū)節(jié)點(diǎn)上的指向集合的并集,得到指針在所述當(dāng)前節(jié)點(diǎn)上的初始指向集合;其中,所述作用域?yàn)榉?hào)表系統(tǒng)中的作用域; A4、對(duì)所述當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的除作用域的變量之外的每一個(gè)變量,確定每一個(gè)變量在所述當(dāng)前節(jié)點(diǎn)的所有前驅(qū)節(jié)點(diǎn)上的取值區(qū)間的并集或區(qū)間集的并集,得到變量在所述當(dāng)前節(jié)點(diǎn)上的初始取值區(qū)間或初始區(qū)間集;判斷在所述當(dāng)前節(jié)點(diǎn)上是否存在某個(gè)變量的初始取值區(qū)間或初始區(qū)間集為空,若存在,則標(biāo)記該節(jié)點(diǎn)為矛盾節(jié)點(diǎn),執(zhí)行步驟Al ;若不存在,則執(zhí)行步驟A6; A5、根據(jù)所述當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的語句類型,對(duì)該節(jié)點(diǎn)上每個(gè)已獲得初始指向集合的指針進(jìn)行保守的指針分析,對(duì)該節(jié)點(diǎn)上的每個(gè)已獲得初始區(qū)間值或初始區(qū)間集的變量進(jìn)行保守的區(qū)間運(yùn)算,并執(zhí)行Al。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述對(duì)所述變量進(jìn)行建模,包括: 變量為數(shù)組元素時(shí),還建立數(shù)組的Region與該變量Region的父子層次關(guān)系;變量為結(jié)構(gòu)體或聯(lián)合類型時(shí),還建立結(jié)構(gòu)體的Region或聯(lián)合的Region與該變量的Region的父子層次關(guān)系;變量為指針類型時(shí),還設(shè)置變量指向集合為空,設(shè)置變量初始狀態(tài)為不確定unsure 狀態(tài)。
6.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述步驟A5包括: A51、若所述當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的語句類型為賦值語句,則執(zhí)行A52 ;若所述當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的語句類型為條件語句,則執(zhí)行A58 ; A52、確定被賦值變量為指針引用時(shí),執(zhí)行A53 ;確定被賦值變量為指針時(shí),執(zhí)行A55 ;確定被賦值變量的類型為結(jié)構(gòu)體或聯(lián)合時(shí),執(zhí)行A56 ;否則,執(zhí)行A57 ; A53、如果被引用的指針的指向集合只有一個(gè)抽象內(nèi)存區(qū)域,則將該抽象內(nèi)存區(qū)域作為被賦值的抽象內(nèi)存區(qū)域,則執(zhí)行A52 ;如果被引用的指針的指向集合有多個(gè)抽象內(nèi)存區(qū)域,則執(zhí)行A54 ; A54、確定指向集合的每一個(gè)抽象內(nèi)存區(qū)域的取值區(qū)間為變量當(dāng)前的取值區(qū)間與右端表達(dá)式取值區(qū)間的并集;如果指向集合的抽象內(nèi)存區(qū)域類型為指針類型,則確定每一個(gè)抽象內(nèi)存區(qū)域的指向集合為當(dāng)前指向集合與右端表達(dá)式指向集合的并集;結(jié)束對(duì)當(dāng)前語句的處理; A55、確定指針變量的取值區(qū)間為右端表達(dá)式的取值區(qū)間,確定指針變量的指向集合為右端表達(dá)式的指向集合; A56、如果被賦值變 量的類型為結(jié)構(gòu)體或聯(lián)合,將該變量的每個(gè)成員作為一個(gè)被賦值變量,將右側(cè)表達(dá)式中的每一個(gè)對(duì)應(yīng)的成員作為為該成員賦值的右側(cè)表達(dá)式,并執(zhí)行A52 ;A57、如果被賦值變量的類型為基本類型,則根據(jù)被賦值變量的類型及右端表達(dá)式確定該賦值語句中表達(dá)式的取值區(qū)間,并將所述被賦值變量的取值區(qū)間重置為所確定的表達(dá)式的取值區(qū)間; A58、若所述當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的語句類型為條件判斷語句,則對(duì)該節(jié)點(diǎn)所關(guān)聯(lián)的每一指針取初始的可能指向集后,分析該節(jié)點(diǎn)所關(guān)聯(lián)的每一指針在所述條件判斷語句中指向的可能集合和必然集合;對(duì)該節(jié)點(diǎn)所關(guān)聯(lián)的每一變量取初始的可能集后,計(jì)算該節(jié)點(diǎn)所關(guān)聯(lián)的每一變量在所述條件判斷語句中的取值的可能集和必然集,得到該節(jié)點(diǎn)所對(duì)應(yīng)的控制流圖中真假分支上的所述變量的取值。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述生成函數(shù)摘要,包括: 生成函數(shù)摘要的前置約束條件、特征信息和后置約束條件。
8.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述函數(shù)摘要以及抽象語法樹識(shí)別出全部的指針引用以及被引用的指針,包括: 識(shí)別出所有過程內(nèi)及過程間的指針引用以及被引用的指針; 其中,所有過程內(nèi)指針引用包括: 在抽象語法樹的一元表達(dá)式節(jié)點(diǎn)上識(shí)別出指針引用,以及被引用的指針; 在抽象語法樹的后綴表達(dá)式節(jié)點(diǎn)上識(shí)別出的指針引用,以及被引用的指針; 所有過程間指針引用包括: 在抽象語法樹的一元表達(dá)式節(jié)點(diǎn)上識(shí)別出函數(shù)調(diào)用表達(dá)式;如果函數(shù)調(diào)用表達(dá)式對(duì)應(yīng)的被調(diào)用函數(shù)有函數(shù)摘要時(shí),則獲取函數(shù)摘要的前置約束條件以及所述前置約束條件中全部被約束變量,將與所述被約束變量對(duì)應(yīng)的實(shí)參或全局變量作為被引用的指針;如果函數(shù)調(diào)用表達(dá)式對(duì)應(yīng)的被調(diào)用函數(shù)沒有函數(shù)摘要時(shí),則將傳遞給被調(diào)用函數(shù)的所有指針類型參數(shù)作為被引用的指針。
9.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述基于所述控制流圖運(yùn)行空指針引用缺陷狀態(tài)機(jī)實(shí)例,對(duì)于所述控制流圖的每個(gè)節(jié)點(diǎn),根據(jù)區(qū)間運(yùn)算、指針分析的結(jié)果對(duì)每個(gè)缺陷狀態(tài)機(jī)實(shí)例分別進(jìn)行狀態(tài)遷移,并確定空指針引用集合、安全指針引用集合、不確定的指針引用集合,包括: B1、根據(jù)控制流圖產(chǎn)生時(shí)的節(jié)點(diǎn)號(hào)順序,取控制流圖中的下一個(gè)節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),如果所述當(dāng)前節(jié)點(diǎn)為最后一個(gè)節(jié)點(diǎn),則結(jié)束對(duì)當(dāng)前函數(shù)的空指針引用檢測(cè);否則執(zhí)行步驟B2 ; B2、對(duì)所述當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)上出現(xiàn)的缺陷狀態(tài)機(jī)實(shí)例集合,在多個(gè)缺陷狀態(tài)機(jī)實(shí)例關(guān)聯(lián)同一個(gè)指針變量時(shí),合并所述多個(gè)缺陷狀態(tài)機(jī)實(shí)例,作為該指針變量對(duì)應(yīng)的新的缺陷狀態(tài)機(jī)實(shí)例; B3、在當(dāng)前節(jié)點(diǎn)的缺陷狀態(tài)機(jī)實(shí)例關(guān)聯(lián)的指針變量的取值發(fā)生變化時(shí),確定變量對(duì)應(yīng)的缺陷狀態(tài)機(jī)實(shí)例的狀態(tài)產(chǎn)生遷移; B4、在所述當(dāng)前節(jié)點(diǎn)上出現(xiàn)指針引用時(shí),根據(jù)被引用指針在當(dāng)前節(jié)點(diǎn)上的取值對(duì)指針引用進(jìn)行檢測(cè); B5、結(jié)束當(dāng)前節(jié)點(diǎn)上的空指針引用檢測(cè),執(zhí)行BI。
10.根據(jù)權(quán)利要求9所述的方法,其特征在于,所述在所述當(dāng)前節(jié)點(diǎn)上出現(xiàn)指針引用時(shí),根據(jù)被引用指針在當(dāng)前節(jié)點(diǎn)上的取值對(duì)指針引用進(jìn)行檢測(cè),還包括: 在非空狀態(tài)下進(jìn)行安全引用時(shí),將所述指針引用輸入到安全指針引用集合; 在空狀態(tài)下進(jìn)行空指針引用時(shí),將所述指針引用輸入到空指針引用集合; 在不確定狀態(tài)下進(jìn)行了指針引用時(shí),將所述指針引用輸入到不確定指針引用集合。
全文摘要
本發(fā)明公開了一種充分檢測(cè)空指針引用缺陷的方法,包括基于抽象語法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式;根據(jù)控制流圖對(duì)被測(cè)應(yīng)用進(jìn)行保守的區(qū)間運(yùn)算與指針分析并根據(jù)區(qū)間運(yùn)算與指針分析的結(jié)果,生成函數(shù)摘要;根據(jù)所述函數(shù)摘要以及抽象語法樹識(shí)別出全部的指針引用以及被引用的指針,并對(duì)每個(gè)被引用的指針創(chuàng)建空指針引用缺陷狀態(tài)機(jī)實(shí)例;基于控制流圖運(yùn)行空指針引用缺陷狀態(tài)機(jī)實(shí)例,在控制流圖的每個(gè)節(jié)點(diǎn)上,根據(jù)區(qū)間運(yùn)算、指針分析的結(jié)果對(duì)每個(gè)缺陷狀態(tài)機(jī)實(shí)例進(jìn)行狀態(tài)遷移,進(jìn)行空指針引用檢測(cè)。采用本發(fā)明,能有效解決空指針引用缺陷的漏報(bào)問題,實(shí)現(xiàn)空指針引用缺陷檢測(cè)零漏報(bào)及低誤報(bào)。
文檔編號(hào)G06F11/36GK103218296SQ201310141769
公開日2013年7月24日 申請(qǐng)日期2013年4月22日 優(yōu)先權(quán)日2013年4月22日
發(fā)明者金大海, 宮云戰(zhàn), 董玉坤, 王雅文, 黃俊飛 申請(qǐng)人:北京郵電大學(xué)