專利名稱:基于靜態(tài)分析的c語言安全規(guī)則檢查方法
技術領域:
本發(fā)明涉及一種基于靜態(tài)分析的C語言安全規(guī)則檢查方法,屬于靜態(tài)代碼分析 技術領域。
背景技術:
C語言在提供給程序員簡潔和靈活的同時,也帶給我們諸多的容易造成漏洞的 副作用。通過靜態(tài)代碼分析,我們可以在不執(zhí)行代碼的前提下檢測到多種容易導致程序 漏洞的代碼。這樣的靜態(tài)分析工具上世紀八十年代就已經產生。目前,像PC-Lint, Coverity Prevent, LDRATestbed等商業(yè)工具廣泛地應用于軟件開發(fā)過程中,還有像Splint
這樣的開源工具也在不斷的演變和完善中。靜態(tài)代碼分析工具極大的提高了軟件工程中 代碼檢查的效率,降低了人工代碼復查的工作量。當前市場上的這些分析工具,其中有 的工具功能非常強大,能夠對程序進行全局分析和對運行時的程序狀態(tài)進行預判。例 如,對空指針引用的預判,堆棧溢出的檢查,運算操作中損失精度的檢查,等等。然 而,C語言中可能導致漏洞的隱患是多方面的,在一些關鍵的應用領域中,比如國防和 航天,即便是潛在的漏洞也是不能容忍的。為了防患于未然,對C語言的語法和語義做 出嚴格的規(guī)范是有必要的。
發(fā)明內容
為了解決這些問題,本發(fā)明提供了一種全新的方法,可以加強對C代碼安全性 的驗證。這個驗證是在編譯的早期階段完成的,所以并不涉及到目標代碼的生成。因此 可以高效率地對大規(guī)模C代碼進行檢查,無論是運行時間還是內存占有方面。本發(fā)明采用的技術方案如下一種基于靜態(tài)分析的C語言安全規(guī)則檢查方法,其特征在于包括以下步驟1)檢查C語言的類型,避免強制類型轉換的發(fā)生,禁止對通用指針類型的聲 明;2)規(guī)定全局變量和局部變量不可同名,全局變量與函數(shù)的形式參數(shù)不可重名;3)對控制流語句的循環(huán)變量做限制;4)強化C語言的聲明和定義;5)對源代碼作詞法、語法、語義的分析,找出源代碼中不符合上述規(guī)定的地方。進一步地在所述步驟3)中,對if-else語句和switch語句的組成結構加以限制,對循環(huán)語 句中循環(huán)控制表達式的組成元素的存儲類嚴格限制。在所述步驟4)中,對沒有使用的聲明和定義進行識別,禁止定義帶有可變參數(shù) 的函數(shù)。本發(fā)明的優(yōu)點是1)在不需要執(zhí)行代碼的前提下找到可能的C語言編程上的漏
3洞2)有效彌補C語言在軟件工程中安全性不足的缺陷。
圖1表示強制類型轉換的隱患;圖2表示通用指針的隱患;圖3表示規(guī)則檢查工具的工作原理;圖4為模塊間的數(shù)據流程圖。
具體實施例方式本發(fā)明提供了一種基于靜態(tài)分析的C語言安全規(guī)則檢查方法,包括以下步驟1)檢查C語言的類型,避免強制類型轉換的發(fā)生,禁止對通用指針類型的聲 明;2)規(guī)定全局變量和局部變量不可同名,全局變量與函數(shù)的形式參數(shù)不可重名;3)對控制流語句的循環(huán)變量做限制;4)強化C語言的聲明和定義;5)對源代碼作詞法、語法、語義的分析,找出源代碼中不符合上述規(guī)定的地方。下面詳細說明。本發(fā)明提出了安全C語言準則的概念,目的在于規(guī)范C語言編程,同時,幫助 C程序員養(yǎng)成良好的C語言編程風格和習慣。它是基于代碼分析工具基礎上的代碼規(guī)范 性檢測工具。對比當前已有的靜態(tài)檢查工具,在遵從C99標準的前提下,它對C語言的 語義和語法進行了更加嚴格的限定。這些限定比較集中的體現(xiàn)在以下幾個方面·類型檢查盡可能的讓C語言向純粹的靜態(tài)類型語言靠近。C語言中的類型強制轉換允許 不同類型間的混合運算,如圖1所示,其中類型轉換是編譯器“自動”完成的。這種隱 性的類型轉換很大程度上削弱了 C語言的類型安全性,因此要盡量避免強制類型轉換的 發(fā)生。如圖2所示,C語言中通用指針(void*)的存在,也是類型安全的巨大隱患。本 發(fā)明禁止對通用指針類型的聲明?!し柮褂玫南拗茷榱嗽鰪姶a的可讀性和可維護性,本發(fā)明對C語言中的符號命名做了嚴格的 限制。比如,在一個文件里,全局變量和局部變量不可以同名,全局變量與函數(shù)的形式 參數(shù)不可以重名,盡管這樣的重名在C語言中是合法的并且C的編譯器可以根據作用域 的差別來解析這些重名的符號?!た刂屏髦械南拗瓶刂屏髡Z句因為可能涉及到復雜的條件分支,最容易造成程序的漏洞。我們對 if-else和switch語句的組成結構加以限制,從而降低使用這兩種語句時漏掉判定條件的 風險。對循環(huán)語句,我們對循環(huán)控制表達式的組成元素的存儲類(即auto,extern, static)做了限制(比如只允許特定的存儲類的變量出現(xiàn)在循環(huán)控制表達式中),同樣是為了降低因使用全局變量的副作用造成的風險。·聲明和定義強化C語言的聲明和定義的規(guī)則,可以幫助我們減少編程中遇到的歧義,增強 代碼的可讀性。比如,對沒有使用的聲明和定義進行識別并且以分析報告的形式反饋給 用戶,禁止定義帶有可變參數(shù)的函數(shù),等等。本發(fā)明的實現(xiàn)原理與編譯器前端的原理一致,都是對文本形式的源代碼作詞 法、語法和語義分析,從而找出源代碼中不符合相關詞法、語法、語義的定義的地方。 由于提出的安全C語言準則主要針對C語言的語義進行規(guī)范,規(guī)則檢查工具的大部分的 工作都是圍繞在語義分析進行的,這其中包括了重要的一環(huán)-類型檢查。如圖3所示,在這一過程中,源代碼被分析并且保存在一個語法樹中,另外各 種符號的屬性信息(比如類型,存儲類,名字)將會保存在一個符號表中。本發(fā)明依 賴于語法樹和符號表的信息來完成對源代碼的靜態(tài)分析。對代碼的靜態(tài)分析包括語法和 語義分析兩部分。其過程是通過將字符流轉換成token流,對token流進行語法分析和部 分語義分析后形成語法樹,然后再對語法樹進行語義分析。如圖4所示,本發(fā)明的內部構造主要由CPP和CCOM兩個模塊組成。CPP模塊 對源代碼進行預處理,并且負責檢查預處理階段的規(guī)則。CPP模塊的輸出是一個中間文 本文件,而這個中間文件隨即由CCOM模塊處理。CCOM模塊對代碼的語法和語義進行 檢查,所以,絕大部分的規(guī)則檢測是由這個模塊完成的。本發(fā)明可以在Windows操作系統(tǒng)的命令行下使用,也可作為集成開發(fā)環(huán)境的插 件部分來使用。例如,它現(xiàn)在已經作為SZIDE(神舟IDE嵌入式軟件集成開發(fā)環(huán)境)中 的一個有效的安全編程輔助工具,應用于我國航空,航天,軍工等領域的關鍵的嵌入式 軟件的研發(fā)中。
權利要求
1.一種基于靜態(tài)分析的C語言安全規(guī)則檢查方法,其特征在于包括以下步驟1)檢查C語言的類型,避免強制類型轉換的發(fā)生,禁止對通用指針類型的聲明;2)規(guī)定全局變量和局部變量不可同名,全局變量與函數(shù)的形式參數(shù)不可重名;3)對控制流語句的循環(huán)變量做限制;4)強化C語言的聲明和定義;5)對源代碼作詞法、語法、語義的分析,找出源代碼中不符合上述規(guī)定的地方。
2.如權利要求1所述的基于靜態(tài)分析的C語言安全規(guī)則檢查方法,其特征在于 在所述步驟3)中,對if-else語句和switch語句的組成結構加以限制,對循環(huán)語句中循環(huán)控制表達式的組成元素的存儲類嚴格限制。
3.如權利要求1所述的基于靜態(tài)分析的C語言安全規(guī)則檢查方法,其特征在于 在所述步驟4)中,對沒有使用的聲明和定義進行識別,禁止定義帶有可變參數(shù)的函
全文摘要
本發(fā)明涉及一種基于靜態(tài)分析的C語言安全規(guī)則檢查方法,其包括以下步驟1)檢查C語言的類型,避免強制類型轉換的發(fā)生,禁止對通用指針類型的聲明;2)規(guī)定全局變量和局部變量不可同名,全局變量與函數(shù)的形式參數(shù)不可重名;3)對控制流語句的循環(huán)變量做限制;4)強化C語言的聲明和定義;5)對源代碼作詞法、語法、語義的分析,找出源代碼中不符合上述規(guī)定的地方。本發(fā)明的優(yōu)點是1)在不需要執(zhí)行代碼的前提下找到可能的C語言編程上的漏洞;2)有效彌補C語言在軟件工程中安全性不足的缺陷。
文檔編號G06F21/22GK102012991SQ20101053987
公開日2011年4月13日 申請日期2010年11月9日 優(yōu)先權日2010年11月9日
發(fā)明者于鵬珊, 崔小磊, 程勝, 陸麒 申請人:北京神舟航天軟件技術有限公司