圖中的其余依賴關(guān)系。
[0041] 優(yōu)選地,所述輸出模塊,具體用于,如果當(dāng)前的內(nèi)存訪問操作在全量環(huán)境下有效, 則判斷不存在內(nèi)存訪問溢出,如果當(dāng)前的內(nèi)存訪問操作不是在全量環(huán)境下有效,則判斷存 在內(nèi)存訪問溢出。
[0042] 應(yīng)用本申請(qǐng)的技術(shù)方案,對(duì)源代碼進(jìn)行預(yù)處理和詞法分析、語法分析以及語義分 析,生成控制流圖、數(shù)據(jù)依賴圖以及抽象語義樹;針對(duì)不同的檢測(cè)場(chǎng)景建立多種檢測(cè)模型, 并根據(jù)多種檢測(cè)模型分析所述控制流圖、數(shù)據(jù)依賴圖以及抽象語義樹,進(jìn)行表達(dá)式迭代以 及狀態(tài)空間遍歷,輸出檢測(cè)結(jié)果;根據(jù)所述檢測(cè)結(jié)果判斷所述源代碼中是否存在內(nèi)存訪問 溢出,并對(duì)檢測(cè)出的內(nèi)存訪問溢出進(jìn)行反饋輸出。這樣,通過追溯源代碼的控制流圖、數(shù)據(jù) 依賴圖以及抽象語義樹,定義多種檢測(cè)模型,實(shí)現(xiàn)表達(dá)式迭代以及狀態(tài)機(jī)分析,可以充分挖 掘源代碼中存在的內(nèi)存訪問溢出,并且可以減少遍歷狀態(tài)空間所花費(fèi)的空間和時(shí)間代價(jià), 減少對(duì)于內(nèi)存訪問溢出的漏報(bào)和誤報(bào)。
【附圖說明】
[0043] 為了更清楚地說明本申請(qǐng)實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn) 有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本 申請(qǐng)中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下, 還可以根據(jù)這些附圖獲得其他的附圖。
[0044]圖1為本申請(qǐng)實(shí)施例提供的一種內(nèi)存訪問溢出的檢測(cè)方法的流程圖;
[0045] 圖2為本申請(qǐng)實(shí)施例提供的另一種內(nèi)存訪問溢出的檢測(cè)方法的流程圖;
[0046] 圖3為本申請(qǐng)實(shí)施例提供的又一種內(nèi)存訪問溢出的檢測(cè)方法的流程圖;
[0047] 圖4為本申請(qǐng)實(shí)施例提供的一種內(nèi)存訪問溢出的檢測(cè)裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0048] 相關(guān)術(shù)語解釋:
[0049] 內(nèi)存訪問溢出(Buffer Overflow)是指由于程序?qū)δ硞€(gè)內(nèi)存對(duì)象的寫操作,使系 統(tǒng)錯(cuò)誤地改變了另一個(gè)內(nèi)存對(duì)象;
[0050] 控制流圖(Control flow graph,CFG)是用在編譯器中的一個(gè)抽象數(shù)據(jù)結(jié)構(gòu)。它是 一個(gè)過程或程序的抽象表現(xiàn),由編譯器在內(nèi)部維護(hù)。每個(gè)在控制流圖中的節(jié)點(diǎn)代表一個(gè)基 本塊,例如,沒有任何跳轉(zhuǎn)或跳轉(zhuǎn)目標(biāo)的基本塊;跳轉(zhuǎn)目標(biāo)以一個(gè)塊開始,和以一個(gè)塊結(jié)束。 每條在控制流圖中的有向邊,用于代表控制流中的跳轉(zhuǎn)方向,或基本塊之間的跳轉(zhuǎn)關(guān)系。
[0051] 數(shù)據(jù)依賴圖(data cbpendence)是指語句之間存在的數(shù)據(jù)約束關(guān)系,如果兩個(gè)運(yùn) 算操作之間不占用同一變量,又或者它們只讀同一變量進(jìn)行連續(xù)的讀寫,那么執(zhí)行結(jié)果與 它們的執(zhí)行順序無關(guān),數(shù)據(jù)依賴圖Oata Dependence Graph,DDG)就是描述了不同語句間, 同一變量或數(shù)據(jù)之間的數(shù)據(jù)依賴關(guān)系。
[0052] 為了使本技術(shù)領(lǐng)域的人員更好地理解本申請(qǐng)中的技術(shù)方案,下面將結(jié)合本申請(qǐng)實(shí) 施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施 例僅僅是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通 技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請(qǐng)保護(hù) 的范圍。
[0053] 為了使本技術(shù)領(lǐng)域的人員更好地理解本申請(qǐng)方案,使本申請(qǐng)的上述目的、特征和 優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和【具體實(shí)施方式】對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說明。
[0054] 圖1為本申請(qǐng)實(shí)施例提供的一種內(nèi)存訪問溢出的檢測(cè)方法的流程圖。
[0055] 參照?qǐng)D1所示,本申請(qǐng)實(shí)施例提供的內(nèi)存訪問溢出的檢測(cè)方法,包括:
[0056] 步驟S11 :對(duì)源代碼進(jìn)行預(yù)處理和詞法分析、語法分析以及語義分析,生成控制流 圖、數(shù)據(jù)依賴圖以及抽象語義樹;
[0057] 在本申請(qǐng)實(shí)施例中,不僅通過對(duì)源代碼進(jìn)行語法、詞法、語義分析,構(gòu)建靜態(tài)檢測(cè) 過程中適用的多種結(jié)構(gòu),還針對(duì)指針和數(shù)組變量的聲明、賦值、訪問,以及標(biāo)準(zhǔn)庫函數(shù)的調(diào) 用進(jìn)行分析,搜集代碼中與指針數(shù)組以及庫函數(shù)相關(guān)的信息,對(duì)常規(guī)控制流圖、數(shù)據(jù)依賴圖 以及抽象語義樹進(jìn)行剪裁。
[0058] 具體的,本申請(qǐng)?zhí)峁┑膬?nèi)存訪問溢出的檢測(cè)方法,參照?qǐng)D2,對(duì)源代碼進(jìn)行預(yù)處理 和詞法分析、語法分析以及語義分析,生成控制流圖、數(shù)據(jù)依賴圖以及抽象語義樹,包括:
[0059] S111 :對(duì)所述源代碼進(jìn)行詞法分析和語法分析,并基于詞法分析和語法分析的結(jié) 果進(jìn)行語義分析以及上下文分析,生成抽象語義樹;
[0060] S112:根據(jù)所述源代碼的分支跳轉(zhuǎn)和函數(shù)調(diào)用關(guān)系,將所述源代碼切分為多個(gè)基 本塊,并分析每個(gè)基本塊之間的跳轉(zhuǎn)關(guān)系,根據(jù)所述跳轉(zhuǎn)關(guān)系生成控制流圖;
[0061] S113:分析所述源代碼的變量之間的數(shù)據(jù)依賴關(guān)系,生成數(shù)據(jù)依賴圖。
[0062] 本申請(qǐng)實(shí)施例涉及的對(duì)源代碼進(jìn)行預(yù)處理和詞法分析、語法分析以及語義分析, 生成控制流圖、數(shù)據(jù)依賴圖以及抽象語義樹,是基于開源編譯框架GCC(GNU C Compiler)實(shí) 現(xiàn)的,但并不局限于此,諸如開源分析工具Splint等均可實(shí)現(xiàn)替代功能。
[0063] 以開源編譯框架GCC(GNU C Compiler)為例,本申請(qǐng)實(shí)施例對(duì)源代碼進(jìn)行預(yù)處理 和詞法分析、語法分析以及語義分析,生成控制流圖、數(shù)據(jù)依賴圖以及抽象語義樹的流程, 具體步驟如下:
[0064] GCC編譯器的內(nèi)置預(yù)處理工具,首先實(shí)現(xiàn)對(duì)源代碼中include部分的加載,以及宏 定義的替換;
[0065] GCC編譯器的前端分析部分,調(diào)用開源詞法、語法分析工具yacc以及l(fā)ex,對(duì)源代 碼進(jìn)行了詞法、語法分析;
[0066] GCC編譯器的前端分析部分,基于詞法、語法分析的結(jié)果,繼續(xù)進(jìn)行語義層以及上 下文分析,并生成抽象語義樹(Abstract Semantic Tree, AST);
[0067] GCC編譯器的前端分析部分,根據(jù)分支跳轉(zhuǎn)、函數(shù)調(diào)用等將源代碼切分為多個(gè)基本 塊,并分析這些基本塊之間的跳轉(zhuǎn)關(guān)系,生成控制流圖(Control Flow Graph, CFG);
[0068] GCC編譯器的前端分析部分,分析變量之間的寫后讀、讀后寫、寫后寫以及存儲(chǔ)相 關(guān)四種數(shù)據(jù)依賴關(guān)系,生成數(shù)據(jù)依賴圖(Data Dependence Graph, DDG);
[0069] 本申請(qǐng)實(shí)施例提供的后續(xù)內(nèi)存訪問溢出的檢測(cè)方法等操作均是基于AST、CFG、DDG 這三個(gè)圖實(shí)現(xiàn)。
[0070] 步驟S12 :針對(duì)不同的檢測(cè)場(chǎng)景建立多種檢測(cè)模型,并根據(jù)多種檢測(cè)模型分析所 述控制流圖、數(shù)據(jù)依賴圖以及抽象語義樹,進(jìn)行表達(dá)式迭代以及狀態(tài)機(jī)分析,輸出檢測(cè)結(jié) 果;
[0071] 現(xiàn)有技術(shù)中,對(duì)于內(nèi)存訪問溢出的靜態(tài)檢測(cè)是指在源程序不被執(zhí)行的條件下,通 過將內(nèi)存訪問溢出的問題轉(zhuǎn)換為存儲(chǔ)訪問約束,并配合模型定義來建立約束,實(shí)現(xiàn)對(duì)內(nèi)存 訪問訪問漏洞的檢測(cè)。理論上,靜態(tài)檢測(cè)可以通過有限狀態(tài)機(jī)分析出全部的可能,但由于C 語言極其復(fù)雜,而工具模型上為了兼顧效率,設(shè)計(jì)過程中可能會(huì)做一些近似處理,或由于多 線程和控制流變化導(dǎo)致高的誤判率,而且循環(huán)結(jié)構(gòu)下分析通常代價(jià)較高。導(dǎo)致上述問題的 主要原因在于:
[0072] 控制流圖上節(jié)點(diǎn)之間的連接關(guān)系是依托路徑而