一種檢測(cè)c代碼空指針引用的方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種檢測(cè)C代碼空指針引用的方法及系統(tǒng),本發(fā)明涉及計(jì)算機(jī)信息安全領(lǐng)域中的程序代碼檢測(cè)領(lǐng)域。該方法包括簡(jiǎn)化該C代碼,得到目標(biāo)代碼,根據(jù)該目標(biāo)代碼通過(guò)語(yǔ)義分析獲取該目標(biāo)代碼的語(yǔ)法樹結(jié)構(gòu);獲取待檢測(cè)的函數(shù),遍歷該語(yǔ)法樹結(jié)構(gòu),查找與該函數(shù)相對(duì)應(yīng)的語(yǔ)法樹結(jié)構(gòu),遍歷該函數(shù)的語(yǔ)法樹結(jié)構(gòu),在判斷語(yǔ)句或循環(huán)語(yǔ)句的節(jié)點(diǎn)之前插入動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu),得到新語(yǔ)法樹結(jié)構(gòu);根據(jù)該新語(yǔ)法樹結(jié)構(gòu),得到最終代碼,編譯并執(zhí)行該最終代碼,若該最終代碼執(zhí)行異常,則輸出該空指針的位置。本發(fā)明可以達(dá)到方便、快速檢測(cè)C代碼中可能存在的空指針引用缺陷。
【專利說(shuō)明】—種檢測(cè)C代碼空指針引用的方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計(jì)算機(jī)信息安全領(lǐng)域中的程序代碼檢測(cè)領(lǐng)域,尤其涉及一種檢測(cè)C代碼中空指針引用的方法。
【背景技術(shù)】
[0002]C語(yǔ)言是大量計(jì)算機(jī)程序所采用的編程語(yǔ)言,在操作系統(tǒng)內(nèi)核、嵌入式系統(tǒng)、基礎(chǔ)程序、大型應(yīng)用軟件等領(lǐng)域都有大量采用C語(yǔ)言編寫的軟件,作為一門傳統(tǒng)的底層系統(tǒng)編程語(yǔ)言,C語(yǔ)言的歷史已超過(guò)40年,是當(dāng)前計(jì)算機(jī)系統(tǒng)中最重要的基礎(chǔ)語(yǔ)言之一,但由于C語(yǔ)言本身的特性,一方面允許程序員操作各類底層內(nèi)存對(duì)象(如指針等),另一方面也由此導(dǎo)致了大量與此相關(guān)的代碼缺陷,空指針引用就是其中比較嚴(yán)重的一類代碼缺陷,空指針引用是指程序中存在對(duì)值為NULL (空)的指針進(jìn)行引用的代碼,由于這類代碼往往只會(huì)在部分情況下被執(zhí)行,而且并非每次都會(huì)發(fā)生,因此具有很強(qiáng)的隱蔽性,而程序中一旦對(duì)空指針進(jìn)行引用,由于該操作違反了操作系統(tǒng)的內(nèi)存訪問(wèn)控制,將立即導(dǎo)致程序發(fā)生內(nèi)存錯(cuò)誤并被操作系統(tǒng)強(qiáng)行終止,進(jìn)而導(dǎo)致用戶數(shù)據(jù)丟失,關(guān)鍵部件失效等致命后果。
[0003]當(dāng)前解決空指針引用的方法主要有靜態(tài)方法和動(dòng)態(tài)方法兩類。靜態(tài)方法主要是模型檢測(cè)技術(shù),即通過(guò)對(duì)待檢測(cè)代碼進(jìn)行建模規(guī)約后,針對(duì)相應(yīng)的安全屬性進(jìn)行驗(yàn)證的技術(shù),例如一種使用簡(jiǎn)單而不復(fù)雜的方法來(lái)偵測(cè)內(nèi)存訪問(wèn)錯(cuò)誤,對(duì)于工業(yè)代碼和學(xué)生代碼都有一定的效果,但由于需要對(duì)大量的狀態(tài)進(jìn)行建模,存在狀態(tài)爆炸問(wèn)題,其檢測(cè)效率較低、耗時(shí)多的問(wèn)題;定理證明技術(shù),即通過(guò)對(duì)程序代碼的邏輯語(yǔ)義進(jìn)行形式化推理來(lái)驗(yàn)證相關(guān)屬性的技術(shù),例如一種基于證明技術(shù)對(duì)C程序進(jìn)行驗(yàn)證以排除空指針引用等缺陷的方法,但該定理證明技術(shù)需要用戶對(duì)目標(biāo)代碼具有相當(dāng)程度的理解以便應(yīng)用相關(guān)的定理策略,具有難以應(yīng)用、復(fù)雜性較高等缺點(diǎn),同時(shí)對(duì)于一些復(fù)雜的控制邏輯也無(wú)法做到完全自動(dòng)化證明;代碼分析技術(shù),即首先獲得源代碼的抽象語(yǔ)法樹,然后進(jìn)行一定的控制流、數(shù)據(jù)流分析,結(jié)合預(yù)先制定的缺陷規(guī)則庫(kù)進(jìn)行匹配的方法,動(dòng)態(tài)方法主要特點(diǎn)是通過(guò)代碼插樁、運(yùn)行時(shí)攔截、沙箱虛擬執(zhí)行等方法,在程序執(zhí)行的過(guò)程中動(dòng)態(tài)檢測(cè)可能存在的空指針引用缺陷,例如一種使用代碼漏洞模式匹配的方法來(lái)偵測(cè)java中代碼缺陷,雖然在一定程度上彌補(bǔ)了模型檢測(cè)的低效率和定理證明的難應(yīng)用問(wèn)題,但仍然存在使用復(fù)雜耗時(shí)的缺點(diǎn)。
[0004]發(fā)明專利“一種充分檢測(cè)空指針引用缺陷的方法”公開了一種充分檢測(cè)空指針引用缺陷的方法,包括:基于抽象語(yǔ)法樹識(shí)別出被測(cè)應(yīng)用的全部可尋址表達(dá)式;根據(jù)控制流圖對(duì)被測(cè)應(yīng)用進(jìn)行保守的區(qū)間運(yùn)算與指針分析并根據(jù)區(qū)間運(yùn)算與指針分析的結(jié)果,生成函數(shù)摘要;根據(jù)所述函數(shù)摘要以及抽象語(yǔ)法樹識(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)問(wèn)題,實(shí)現(xiàn)空指針引用缺陷檢測(cè)零漏報(bào)及低誤報(bào)。但是該發(fā)明通過(guò)基于區(qū)間運(yùn)算和狀態(tài)機(jī)建模分析的方法對(duì)源代碼進(jìn)行檢測(cè),這與本發(fā)明提出的插入動(dòng)態(tài)監(jiān)測(cè)代碼的方法完全不同,同時(shí)本發(fā)明也不需要對(duì)源代碼進(jìn)行區(qū)間分析,也不需要對(duì)目標(biāo)程序進(jìn)行缺陷狀態(tài)機(jī)建模等步驟。
[0005]發(fā)明專利“一種檢查源代碼中空指針的方法和計(jì)算機(jī)系統(tǒng)”公開了一種檢查源代碼中空指針的方法,包括:計(jì)算機(jī)系統(tǒng)構(gòu)造可引用變量類型字典,計(jì)算機(jī)系統(tǒng)接收掃描空指針的指令,格式化待檢查的源代碼;掃描待檢查源代碼的全局代碼區(qū)域,獲得與所述字典中變量聲明類型對(duì)應(yīng)的未初始化全局變量列表;掃描所述待檢查源代碼的方法區(qū)域,獲得與所述字典中變量聲明類型對(duì)應(yīng)的未初始化局部變量列表;根據(jù)未初始化全局變量列表,獲取方法下未初始化全局變量列表;掃描所述待檢查源代碼的方法區(qū)域,查找被調(diào)用的變量名,如果所述被調(diào)用的變量名在未初始化局部變量列表或方法下未初始化全局變量列表中,該查找到的被調(diào)用的變量名即為源代碼中的空指針。但是該發(fā)明采用直接掃描源代碼,通過(guò)一定的模式來(lái)分析源代碼中可能存在的空指針問(wèn)題,這與本方法的插入動(dòng)態(tài)檢測(cè)代碼,同時(shí)編譯后進(jìn)行執(zhí)行時(shí)判斷執(zhí)行返回的結(jié)果來(lái)確定空指針錯(cuò)誤的方法完全不同,該發(fā)明只需要掃描源代碼而不需要編譯,本發(fā)明的檢測(cè)階段是在運(yùn)行時(shí)自動(dòng)完成,所采用技術(shù)方法存在明顯差異。
【發(fā)明內(nèi)容】
[0006]針對(duì)現(xiàn)有技術(shù)不足,本發(fā)明提出一種新的檢測(cè)C代碼中空指針引用缺陷的方法。
[0007]為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種檢測(cè)C代碼空指針引用的方法,該方法包括:
[0008]步驟I,簡(jiǎn)化該C代碼,得到目標(biāo)代碼,根據(jù)該目標(biāo)代碼通過(guò)語(yǔ)義分析獲取該目標(biāo)代碼的語(yǔ)法樹結(jié)構(gòu);
[0009]步驟2,獲取待檢測(cè)的函數(shù),遍歷該語(yǔ)法樹結(jié)構(gòu),查找與該函數(shù)相對(duì)應(yīng)的語(yǔ)法樹結(jié)構(gòu),遍歷該函數(shù)的語(yǔ)法樹結(jié)構(gòu),在判斷語(yǔ)句或循環(huán)語(yǔ)句的節(jié)點(diǎn)之前插入動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu),得到新語(yǔ)法樹結(jié)構(gòu);
[0010]步驟3,根據(jù)該新語(yǔ)法樹結(jié)構(gòu),得到最終代碼,編譯并執(zhí)行該最終代碼,若該最終代碼執(zhí)行異常,則輸出該空指針的位置。
[0011 ] 所述的檢測(cè)C代碼空指針引用的方法,該步驟I還包括,將該C代碼中的判斷語(yǔ)句統(tǒng)一為if else語(yǔ)句,將循環(huán)語(yǔ)句統(tǒng)一為while語(yǔ)句。
[0012]所述的檢測(cè)C代碼空指針引用的方法,該動(dòng)態(tài)檢測(cè)過(guò)程包括生成未使用賦值集合,其中該賦值集合中的值使該判斷語(yǔ)句或循環(huán)語(yǔ)句產(chǎn)生真、假兩種賦值結(jié)果。
[0013]所述的檢測(cè)C代碼空指針引用的方法,還包括,將該值賦予該判斷語(yǔ)句或循環(huán)語(yǔ)句中條件語(yǔ)句的變量,將該值存入已使用賦值集合,同時(shí)將該未使用賦值集合中的該值刪除。
[0014]所述的檢測(cè)C代碼空指針引用的方法,還包括若該最終代碼執(zhí)行異常,則輸出該值,并將該已使用賦值集合中的該值刪除,遍歷該未使用賦值結(jié)合。
[0015]本發(fā)明還提供了一種檢測(cè)C代碼空指針引用的系統(tǒng),包括:
[0016]生成語(yǔ)法樹結(jié)構(gòu)模塊,用于簡(jiǎn)化該C代碼,得到目標(biāo)代碼,根據(jù)該目標(biāo)代碼通過(guò)語(yǔ)義分析獲取該目標(biāo)代碼的語(yǔ)法樹結(jié)構(gòu);
[0017]檢測(cè)模塊,用于獲取待檢測(cè)的函數(shù),遍歷該語(yǔ)法樹結(jié)構(gòu),查找與該函數(shù)相對(duì)應(yīng)的語(yǔ)法樹結(jié)構(gòu),遍歷該函數(shù)的語(yǔ)法樹結(jié)構(gòu),在判斷語(yǔ)句或循環(huán)語(yǔ)句的節(jié)點(diǎn)之前插入動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu),得到新語(yǔ)法樹結(jié)構(gòu);
[0018]輸出模塊,用于根據(jù)該新語(yǔ)法樹結(jié)構(gòu),得到最終代碼,編譯并執(zhí)行該最終代碼,若該最終代碼執(zhí)行異常,則輸出該空指針的位置。
[0019]所述的檢測(cè)C代碼空指針引用的方法,簡(jiǎn)化代碼模塊,用于將該C代碼中的判斷語(yǔ)句統(tǒng)一為if else語(yǔ)句,將循環(huán)語(yǔ)句統(tǒng)一為while語(yǔ)句。
[0020]所述的檢測(cè)C代碼空指針引用的方法,該動(dòng)態(tài)檢測(cè)過(guò)程包括生成未使用賦值集合,其中該賦值集合中的值使該判斷語(yǔ)句或循環(huán)語(yǔ)句產(chǎn)生真、假兩種賦值結(jié)果。
[0021]所述的檢測(cè)C代碼空指針引用的方法,還包括,將該值賦予該判斷語(yǔ)句或循環(huán)語(yǔ)句中條件語(yǔ)句的變量,將該值存入已使用賦值集合,同時(shí)將該未使用賦值集合中的該值刪除。
[0022]所述的檢測(cè)C代碼空指針引用的方法,還包括若該最終代碼執(zhí)行異常,則輸出該值,并將該已使用賦值集合中的該值刪除,遍歷該未使用賦值結(jié)合。
[0023]由以上方案可知,本發(fā)明的優(yōu)點(diǎn)在于:
[0024]通過(guò)應(yīng)用本發(fā)明,可以達(dá)到方便、快速檢測(cè)C代碼中可能存在的空指針引用缺陷,優(yōu)點(diǎn)是本發(fā)明直接編譯生成嵌入了檢測(cè)代碼的可執(zhí)行二進(jìn)制文件,該二進(jìn)制文件執(zhí)行的同時(shí)就完成了檢測(cè),具有檢測(cè)速度快,方便易用,能完美利用現(xiàn)有硬件平臺(tái)的各項(xiàng)特性與程序內(nèi)在特性,使用者能在完成代碼編寫后,立即對(duì)程序代碼進(jìn)行檢測(cè),并根據(jù)檢測(cè)結(jié)果,確定程序代碼中可能的空指針引用缺陷然后進(jìn)行相關(guān)修改工作,通過(guò)在不需要先驗(yàn)知識(shí)的情況下快速檢測(cè)代碼,可以節(jié)省使用者大量精力和時(shí)間,方便使用者快速消除代碼中的內(nèi)存訪問(wèn)錯(cuò)誤漏洞等優(yōu)點(diǎn)。
【專利附圖】
【附圖說(shuō)明】
[0025]圖1為本發(fā)明的整體應(yīng)用流程圖;
[0026]圖2為本發(fā)明的檢測(cè)時(shí)原理流程圖;
[0027]圖3為本發(fā)明中簡(jiǎn)化源代碼時(shí)的目標(biāo)。
[0028]其中附圖標(biāo)記為:
[0029]步驟100為本發(fā)明整體步驟,包括:
[0030]步驟101/102/103/104/105/106/107/108 ;
[0031]步驟200為動(dòng)態(tài)過(guò)程算法步驟,包括:
[0032]步驟201/202/203/204/205/206/207/208/209/210/211。
【具體實(shí)施方式】
[0033]本發(fā)明所述方法需要源代碼的簡(jiǎn)化、源代碼的變換(插入檢測(cè)代碼)、該檢測(cè)代碼包括控制流邏輯與具體代碼檢測(cè)兩部分。本發(fā)明提供的方法針對(duì)的目標(biāo)是用戶編寫完成的C源代碼文件,本發(fā)明的輸出是經(jīng)過(guò)變換后的C源代碼文件,用戶通過(guò)編譯變換后的C源代碼文件并執(zhí)行來(lái)獲得檢測(cè)結(jié)果,本發(fā)明的成功實(shí)施要求用戶調(diào)用標(biāo)準(zhǔn)的C編譯器完成編譯操作。
[0034]本發(fā)明包含以下幾部分:
[0035]源代碼的簡(jiǎn)化:對(duì)于待檢測(cè)的源代碼,為了降低后續(xù)分析的復(fù)雜度,節(jié)省分析的時(shí)間并提高效率,首先對(duì)源代碼在保持語(yǔ)義不變的情況下進(jìn)行簡(jiǎn)化,簡(jiǎn)化指將源代碼中的各種語(yǔ)句進(jìn)行統(tǒng)一和規(guī)整,包括將多種不同的循環(huán)語(yǔ)句(如for,do while等)統(tǒng)一為采用while語(yǔ)句形式的循環(huán),將多種判斷語(yǔ)句(如?:,switch等)統(tǒng)一為if else的形式,本步驟簡(jiǎn)化后的源代碼將作為分析獲得源代碼的語(yǔ)法樹結(jié)構(gòu)步驟的輸入。
[0036]分析獲得源代碼的語(yǔ)法樹結(jié)構(gòu):對(duì)于輸入的源代碼進(jìn)行語(yǔ)法樹分析,首先調(diào)用標(biāo)準(zhǔn)C語(yǔ)言預(yù)處理器(如gcc)對(duì)源代碼進(jìn)行預(yù)處理操作,然后對(duì)預(yù)處理后的源代碼進(jìn)行語(yǔ)法分析,獲得能夠完整表達(dá)該源代碼語(yǔ)義的語(yǔ)法樹結(jié)構(gòu),本步驟獲得的語(yǔ)法樹結(jié)構(gòu)將傳遞到構(gòu)造并插入檢測(cè)代碼步驟作為輸入。
[0037]構(gòu)造并插入檢測(cè)代碼:本步驟基于輸入的語(yǔ)法樹結(jié)構(gòu),進(jìn)行語(yǔ)法樹層面的變換操作,具體步驟為:根據(jù)用戶指定的需要檢測(cè)的函數(shù),遍歷語(yǔ)法樹結(jié)構(gòu)獲得所述函數(shù)對(duì)應(yīng)的語(yǔ)法樹結(jié)點(diǎn),之后進(jìn)入該語(yǔ)法樹結(jié)點(diǎn)進(jìn)行后續(xù)步驟分析;在函數(shù)體中遇到if、while語(yǔ)句時(shí),在遇到的if、while語(yǔ)句前插入動(dòng)態(tài)檢測(cè)過(guò)程,所述動(dòng)態(tài)檢測(cè)過(guò)程用于動(dòng)態(tài)決定代碼執(zhí)行流程,完成空指針引用的檢測(cè)等操作,其具體內(nèi)容需要基于上下文語(yǔ)義信息來(lái)決定;重復(fù)遍歷所有的語(yǔ)法樹結(jié)點(diǎn),直到所有if、while語(yǔ)句前都插入動(dòng)態(tài)檢測(cè)過(guò)程,并將新產(chǎn)生的語(yǔ)法樹結(jié)構(gòu)作為產(chǎn)生變換后的源代碼步驟的輸入。
[0038]產(chǎn)生變換后的源代碼:將上一步驟產(chǎn)生的語(yǔ)法樹結(jié)構(gòu)重新生成對(duì)應(yīng)的C源代碼,所生成的C源代碼必須從語(yǔ)義上完全與所述語(yǔ)法樹結(jié)構(gòu)表達(dá)的語(yǔ)義一致,輸出對(duì)應(yīng)的C源代碼文件作為編譯源代碼后執(zhí)行檢測(cè)步驟的輸入。
[0039]編譯源代碼后執(zhí)行檢測(cè):按照所述源代碼文件本身的編譯參數(shù)對(duì)源代碼文件進(jìn)行編譯,編譯生成可執(zhí)行二進(jìn)制文件,執(zhí)行所述二進(jìn)制文件并等待結(jié)果即可,執(zhí)行該二進(jìn)制文件的過(guò)程同時(shí)就是檢測(cè)過(guò)程,檢測(cè)結(jié)果會(huì)自動(dòng)輸出到標(biāo)準(zhǔn)輸出。
[0040]以下為本發(fā)明整體流程,如圖1所示,具體步驟如下:
[0041]執(zhí)行步驟101用戶提交C源代碼,執(zhí)行步驟102代碼簡(jiǎn)化,語(yǔ)法樹生成,首先對(duì)待檢測(cè)的C源代碼進(jìn)行簡(jiǎn)化以及預(yù)處理工作,簡(jiǎn)化源代碼時(shí)的具體方法如圖3所示,圖3中第I列給出了需要簡(jiǎn)化的源代碼的模式,第2列給出了簡(jiǎn)化后的源代碼模式,主要轉(zhuǎn)化目的是將不同形式的語(yǔ)句統(tǒng)一為具有單一形式同時(shí)保持語(yǔ)義不變的結(jié)構(gòu),可以直接調(diào)用CIL (C中間語(yǔ)言)對(duì)目標(biāo)源代碼進(jìn)行簡(jiǎn)化,對(duì)簡(jiǎn)化后的代碼進(jìn)行預(yù)處理操作,直接調(diào)用用戶所使用編譯器完成即可,例如gcc編譯器可使用命令gcc -E對(duì)目標(biāo)源代碼進(jìn)行預(yù)處理,對(duì)預(yù)處理后的目標(biāo)源代碼進(jìn)行語(yǔ)法樹分析,可以基于編譯器或完全手工編寫相關(guān)詞法分析、語(yǔ)法分析模塊,通過(guò)對(duì)源代碼的語(yǔ)法分析,得到對(duì)應(yīng)目標(biāo)源代碼的語(yǔ)法樹結(jié)構(gòu),執(zhí)行步驟103根據(jù)用戶指定的需要檢測(cè)的函數(shù),基于上下文進(jìn)行語(yǔ)義分析,遍歷語(yǔ)法樹結(jié)構(gòu)找到用戶指定函數(shù)的定義部分所對(duì)應(yīng)的語(yǔ)法樹結(jié)構(gòu),執(zhí)行步驟104動(dòng)態(tài)檢測(cè)過(guò)程檢測(cè)語(yǔ)法樹結(jié)構(gòu),遍歷所述語(yǔ)法樹結(jié)構(gòu),找到所有的if語(yǔ)句和while語(yǔ)句結(jié)點(diǎn),在遍歷得到的所有if語(yǔ)句和while語(yǔ)句結(jié)點(diǎn)之前插入動(dòng)態(tài)檢測(cè)過(guò)程(檢測(cè)代碼),執(zhí)行步驟105生成動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu),所述動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu)必須滿足源代碼語(yǔ)法樹結(jié)構(gòu)的語(yǔ)義環(huán)境,然后將所述動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu)設(shè)置為所述if語(yǔ)句和while語(yǔ)句語(yǔ)法樹結(jié)構(gòu)的父節(jié)點(diǎn),從效果上來(lái)說(shuō),使所述動(dòng)態(tài)檢測(cè)過(guò)程在if語(yǔ)句和while語(yǔ)句的前一刻執(zhí)行,執(zhí)行步驟106代碼生成,將變換后的語(yǔ)法樹結(jié)構(gòu)輸出為C源代碼,保存C源代碼到相應(yīng)文件中,替換原來(lái)的C源代碼文件內(nèi)容,執(zhí)行步驟107編譯,編譯新生成的C源代碼文件,得到可執(zhí)行二進(jìn)制文件,執(zhí)行步驟108執(zhí)行該二進(jìn)制文件,執(zhí)行該二進(jìn)制文件,執(zhí)行的過(guò)程就是檢測(cè)過(guò)程,執(zhí)行的結(jié)果會(huì)自動(dòng)輸出檢測(cè)到的內(nèi)存訪問(wèn)錯(cuò)誤漏洞。
[0042]以下對(duì)本發(fā)明的動(dòng)態(tài)檢測(cè)過(guò)程進(jìn)行詳細(xì)說(shuō)明:
[0043]動(dòng)態(tài)檢測(cè)過(guò)程的代碼內(nèi)容需要根據(jù)插入位置的上下文語(yǔ)義進(jìn)行變化,變化的依據(jù)是使得動(dòng)態(tài)檢測(cè)過(guò)程插入位置后面的if語(yǔ)句和while語(yǔ)句中的條件判斷部分能產(chǎn)生不同的賦值結(jié)果,即分別產(chǎn)生能夠使后續(xù)if語(yǔ)句、while語(yǔ)句產(chǎn)生真、假兩類情況的變量賦值,然后針對(duì)真、假兩種賦值情況,動(dòng)態(tài)檢測(cè)過(guò)程分別fork (分叉)出一個(gè)子進(jìn)程并跟蹤子進(jìn)程的執(zhí)行結(jié)果,同時(shí)為了檢測(cè)輸出時(shí)向用戶提供具體的賦值情況,動(dòng)態(tài)檢測(cè)過(guò)程還需要將插入點(diǎn)的賦值信息預(yù)先保存到一個(gè)臨時(shí)記錄中,等待動(dòng)態(tài)檢測(cè)過(guò)程讀取該記錄獲得對(duì)應(yīng)的賦值信息,當(dāng)動(dòng)態(tài)檢測(cè)過(guò)程等待的子進(jìn)程返回時(shí),需要取出之前保存的條件變量的賦值情況,同時(shí)根據(jù)所等待的子進(jìn)程的執(zhí)行結(jié)果決定具體報(bào)告信息,如果子進(jìn)程成功執(zhí)行并返回一個(gè)成功值,說(shuō)明在相應(yīng)的后續(xù)代碼中沒有檢測(cè)到空指針引用漏洞,如果后續(xù)進(jìn)程發(fā)生段錯(cuò)誤導(dǎo)致程序異常退出,說(shuō)明在當(dāng)前變量賦值情況下發(fā)生了空指針引用錯(cuò)誤,因此需要打印出前述保存的變量賦值情況和當(dāng)前動(dòng)態(tài)檢測(cè)過(guò)程插入點(diǎn)位置,向用戶報(bào)告檢測(cè)到的空指針引用情況。
[0044]以下為本發(fā)明的一個(gè)實(shí)施例,具體如下:
[0045]首先用戶確定待檢測(cè)的目標(biāo)函數(shù)為bad_func,該函數(shù)是經(jīng)過(guò)簡(jiǎn)化后的代碼,具體
如下所示:
[0046]
【權(quán)利要求】
1.一種檢測(cè)C代碼空指針引用的方法,其特征在于,包括: 步驟I,簡(jiǎn)化該C代碼,得到目標(biāo)代碼,根據(jù)該目標(biāo)代碼通過(guò)語(yǔ)義分析獲取該目標(biāo)代碼的語(yǔ)法樹結(jié)構(gòu); 步驟2,獲取待檢測(cè)的函數(shù),遍歷該語(yǔ)法樹結(jié)構(gòu),查找與該函數(shù)相對(duì)應(yīng)的語(yǔ)法樹結(jié)構(gòu),遍歷該函數(shù)的語(yǔ)法樹結(jié)構(gòu),在判斷語(yǔ)句或循環(huán)語(yǔ)句的節(jié)點(diǎn)之前插入動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu),得到新語(yǔ)法樹結(jié)構(gòu); 步驟3,根據(jù)該新語(yǔ)法樹結(jié)構(gòu),得到最終代碼,編譯并執(zhí)行該最終代碼,若該最終代碼執(zhí)行異常,則輸出該空指針的位置。
2.如權(quán)利要求1所述的檢測(cè)C代碼空指針引用的方法,其特征在于,該步驟I還包括,將該C代碼中的判斷語(yǔ)句統(tǒng)一為if else語(yǔ)句,將循環(huán)語(yǔ)句統(tǒng)一為while語(yǔ)句。
3.如權(quán)利要求1所述的檢測(cè)C代碼空指針引用的方法,其特征在于,該動(dòng)態(tài)檢測(cè)過(guò)程包括生成未使用賦值集合,其中該賦值集合中的值使該判斷語(yǔ)句或循環(huán)語(yǔ)句產(chǎn)生真、假兩種賦值結(jié)果。
4.如權(quán)利要求3所述的檢測(cè)C代碼空指針引用的方法,其特征在于,還包括,將該值賦予該判斷語(yǔ)句或循環(huán)語(yǔ)句中條件語(yǔ)句的變量,將該值存入已使用賦值集合,同時(shí)將該未使用賦值集合中的該值刪除。
5.如權(quán)利要求1或4所述的檢測(cè)C代碼空指針引用的方法,其特征在于,還包括若該最終代碼執(zhí)行異常,則輸出該值,并將該已使用賦值集合中的該值刪除,遍歷該未使用賦值結(jié)口 ο
6.一種檢測(cè)C代碼空指針引用的系統(tǒng),其特征在于,包括: 生成語(yǔ)法樹結(jié)構(gòu)模塊,用于簡(jiǎn)化該C代碼,得到目標(biāo)代碼,根據(jù)該目標(biāo)代碼通過(guò)語(yǔ)義分析獲取該目標(biāo)代碼的語(yǔ)法樹結(jié)構(gòu); 檢測(cè)模塊,用于獲取待檢測(cè)的函數(shù),遍歷該語(yǔ)法樹結(jié)構(gòu),查找與該函數(shù)相對(duì)應(yīng)的語(yǔ)法樹結(jié)構(gòu),遍歷該函數(shù)的語(yǔ)法樹結(jié)構(gòu),在判斷語(yǔ)句或循環(huán)語(yǔ)句的節(jié)點(diǎn)之前插入動(dòng)態(tài)檢測(cè)過(guò)程的語(yǔ)法樹結(jié)構(gòu),得到新語(yǔ)法樹結(jié)構(gòu); 輸出模塊,用于根據(jù)該新語(yǔ)法樹結(jié)構(gòu),得到最終代碼,編譯并執(zhí)行該最終代碼,若該最終代碼執(zhí)行異常,則輸出該空指針的位置。
7.如權(quán)利要求6所述的檢測(cè)C代碼空指針引用的系統(tǒng),其特征在于,還包括簡(jiǎn)化代碼模塊,用于將該C代碼中的判斷語(yǔ)句統(tǒng)一為if else語(yǔ)句,將循環(huán)語(yǔ)句統(tǒng)一為while語(yǔ)句。
8.如權(quán)利要求6所述的檢測(cè)C代碼空指針引用的系統(tǒng),其特征在于,該動(dòng)態(tài)檢測(cè)過(guò)程包括生成未使用賦值集合,其中該賦值集合中的值使該判斷語(yǔ)句或循環(huán)語(yǔ)句產(chǎn)生真、假兩種賦值結(jié)果。
9.如權(quán)利要求8所述的檢測(cè)C代碼空指針引用的系統(tǒng),其特征在于,還包括,將該值賦予該判斷語(yǔ)句或循環(huán)語(yǔ)句中條件語(yǔ)句的變量,將該值存入已使用賦值集合,同時(shí)將該未使用賦值集合中的該值刪除。
10.如權(quán)利要求6或9所述的檢測(cè)C代碼空指針引用的系統(tǒng),其特征在于,還包括若該最終代碼執(zhí)行異常,則輸出該值,并將該已使用賦值集合中的該值刪除,遍歷該未使用賦值結(jié)合 ?
【文檔編號(hào)】G06F11/36GK103955426SQ201410160140
【公開日】2014年7月30日 申請(qǐng)日期:2014年4月21日 優(yōu)先權(quán)日:2014年4月21日
【發(fā)明者】孫毓忠, 陳英超, 朱洋民 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所