自动化检测工具助力GJB 8114-2013 C/C++语言编程安全子集标准落地应用
? ? ? ? 2013年7月10日,中國人民解放軍總裝備部發(fā)布了中華人民共和國國家軍用標(biāo)準(zhǔn)GJB 8114,全稱為GJB 8114-2013《C/C++語言編程安全子集》,提出軟件編程標(biāo)準(zhǔn),以提高國家軍用軟件的安全性,并作為靜態(tài)規(guī)則檢查的依據(jù)。GJB 8114的提出源于2005年發(fā)布的GJB 5369,全稱為GJB 5359-2005《航天型號(hào)軟件C語言安全子集》是航天領(lǐng)域嵌入式C語言的編程標(biāo)準(zhǔn),GJB 8114對原有的規(guī)則進(jìn)行了升級和擴(kuò)充,擴(kuò)展了應(yīng)用場景,適用于所有軍用軟件開發(fā),同時(shí)明確的提出了C語言的編程規(guī)范和C++語言的編程規(guī)范內(nèi)容,即標(biāo)準(zhǔn)中的第五章規(guī)定C和C++語言編程時(shí)應(yīng)該遵守的共同準(zhǔn)則,第六章規(guī)定C++語言編程時(shí)應(yīng)遵守的專用準(zhǔn)則,其中C 和 C++共用的強(qiáng)制準(zhǔn)則共124條,C++專用的強(qiáng)制準(zhǔn)則28條,C 和 C++共用的建議準(zhǔn)則41條,C++專用的建議準(zhǔn)則11條。標(biāo)準(zhǔn)總計(jì)204條。標(biāo)準(zhǔn)中每條準(zhǔn)則采取固定格式描述,并給出違背和遵循正反兩個(gè)示例,以供開發(fā)人員和評測中心參照。
? ? ? 大量數(shù)據(jù)表明,軟件存在的問題或隱患很大部分根源在于沒有遵守編程規(guī)范或標(biāo)準(zhǔn),所以很多科院院所和企業(yè)大多制定了自己企業(yè)的編程規(guī)范。編程規(guī)范或標(biāo)準(zhǔn)的落實(shí),一方面可以使代碼開發(fā)人員在編程過程中遵守規(guī)則,從而保證代碼的可理解性和可維護(hù)性;另一方面也可以讓測試人員按照規(guī)則來檢查代碼,及時(shí)發(fā)現(xiàn)代碼問題。航空、航天、電子、船舶等軟件測評中心作為第三方評測機(jī)構(gòu),在測試過程中會(huì)嚴(yán)格按照GJB8114的規(guī)則進(jìn)行檢測,不但可以在評測體系內(nèi)保證代碼規(guī)則的一致性,還可以在全軍體系內(nèi)實(shí)施推動(dòng)軟件標(biāo)準(zhǔn)化,落實(shí)提高軟件的可維護(hù)性和可靠性,增強(qiáng)我國軍用軟件質(zhì)量。
? ? ? ?鑒于傳統(tǒng)的代碼規(guī)則檢查需要靠評測中心人工閱讀和審查代碼,如果開發(fā)方提交的代碼本身沒有遵守標(biāo)準(zhǔn),導(dǎo)致評測中心消耗很多時(shí)間和資源在靜態(tài)代碼審查上,所以需要自動(dòng)化的檢查工具來實(shí)現(xiàn)對代碼進(jìn)行快速有效的規(guī)則檢查。很多企事業(yè)單位自己編制了自動(dòng)化測試規(guī)則檢查工具,但是由于資源有限,以及標(biāo)準(zhǔn)的理解等限制,導(dǎo)致很多自研工具沒有普適性,甚至對一些提交的代碼無法檢測。
? ? ? 另外,由于GJB 8114中只是C/C++代碼安全的一個(gè)子集,只是滿足了該標(biāo)準(zhǔn),也不等于軟件就消除了安全隱患。畢竟,C和C++由于其語法靈活的特性,決定了代碼質(zhì)量需要通過更多的角度去度量和評測。國外工具很少能夠支持國標(biāo),國內(nèi)做標(biāo)準(zhǔn)檢測的廠家鳳毛麟角,還有最近兩年一款工具在市場上比較活躍,是由北京大學(xué)軟件工程國家工程研究中心和北大軟件合作研發(fā)的CoBOT工具。能夠很好的支持GJB 8114,全部204從規(guī)則都能進(jìn)行檢測,運(yùn)行完成給出中文的檢測報(bào)告,非常便于閱讀和整合到出具的評測報(bào)告中。另外,也支持GJB 5369。如果評測的目的不僅僅是滿足GJB 8114標(biāo)準(zhǔn),則可以借助CoBOT中超過1000個(gè)C和C++檢測器,包括MISRA 2004、MISRA 2008、MISRA 2012、ISO 17961、CWE、OWASP等標(biāo)準(zhǔn)和公開缺陷和安全漏洞模型,能夠全面檢測出超過100種缺陷和安全漏洞,為軟件質(zhì)量提供最大限度的保障。畢竟,不管是作為軍工研發(fā)單位,還是作為評測單位,防微杜漸上的付出總比聯(lián)合實(shí)驗(yàn)中缺陷歸零時(shí)責(zé)任要小很多。
? ? ? ?根據(jù)實(shí)際經(jīng)驗(yàn),代碼靜態(tài)分析比動(dòng)態(tài)測試更有效率,能夠自動(dòng)快速發(fā)現(xiàn)缺陷,尤其是邏輯設(shè)計(jì)和編碼缺陷。筆者認(rèn)為代碼靜態(tài)分析和動(dòng)態(tài)測試可以相互補(bǔ)充,動(dòng)態(tài)測試發(fā)現(xiàn)功能、時(shí)序、性能等方面的缺陷。動(dòng)態(tài)測試往往由于難于構(gòu)造動(dòng)態(tài)測試執(zhí)行的平臺(tái)環(huán)境而往往采用在全數(shù)字仿真或半數(shù)字半實(shí)物仿真上執(zhí)行測試,此類測試更容易發(fā)現(xiàn)功能上的缺陷。根據(jù)CoBOT工具從軍工客戶落地使用的效果反饋來看,能夠全面滿足對于GJB 8114標(biāo)準(zhǔn)的檢測,更多的價(jià)值是幫助客戶發(fā)現(xiàn)了該標(biāo)準(zhǔn)之外的大量代碼上的缺陷。另外,通過工具給出的超過30種靜態(tài)度量數(shù)據(jù),能夠?qū)Ρ粰z測代碼進(jìn)行各種維度的度量,例如圈復(fù)雜度、扇入、扇出、注釋率、循環(huán)嵌套深度等等。
? ? ? ?下面我們給出兩個(gè)例子,分別是通過GJB 8114標(biāo)準(zhǔn)檢測出的缺陷、GJB 8114標(biāo)準(zhǔn)未發(fā)現(xiàn)的缺陷作為參考。
? ? ? ?案例1:下面代碼違反了數(shù)組下標(biāo)必須大于等于零的正整數(shù)規(guī)則。為GJB 8114中的GJB_R_01_06_09?數(shù)組下標(biāo)必須是大于等于零的整型數(shù)
?
? ? ? ?案例2:下面代碼違反了給變量賦值與其類型不一致的規(guī)則。經(jīng)過作者核實(shí),該違反了GJB5369中的6_1_9,雖然GJB 8114沒有明確該條標(biāo)準(zhǔn),很明顯,GJB 5369這一條還是需要遵守的,否則導(dǎo)致數(shù)據(jù)溢出或丟失。
下面是該缺陷的工具報(bào)出的提示。
所屬缺陷:給變量賦的值與其類型不一致
缺陷發(fā)生位置:在gd.c中zif_imagecopymergegray函數(shù)的第3703行。
缺陷說明:在(gd.c)文件第(3688)行聲明了[int]類型變量[pct],在第(3703)行將[long?int]類型變量[PCT]賦值給[int]類型變量[pct],兩者類型不一致,可能導(dǎo)致數(shù)據(jù)丟失。
通過上面兩個(gè)案例可以看出,代碼中違反了GJB 8114或GJB 5369中的規(guī)則,給程序運(yùn)行帶來了故障隱患。同時(shí)在遵守GJB 8114標(biāo)準(zhǔn)的同時(shí),也不能丟掉GJB 5369,有人說GJB 8114代替了5369,其實(shí)很多規(guī)則并沒有完全替代。通過支持兩個(gè)GJB的檢測工具進(jìn)行檢測,發(fā)現(xiàn)代碼中違反標(biāo)準(zhǔn)的地方,進(jìn)行修復(fù)才是最安全的編程。
(完)
總結(jié)
以上是生活随笔為你收集整理的自动化检测工具助力GJB 8114-2013 C/C++语言编程安全子集标准落地应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言缓冲文件系统和非缓冲文件系统
- 下一篇: RocksDB事务实现Transacti