Jianyuan Lab
發(fā)布時(shí)間:2024-01-08 作者:上海工業(yè)控制安全創(chuàng)新科技有限公司 點(diǎn)擊次數(shù):次
前幾篇我們介紹了代碼的不同類型結(jié)構(gòu)覆蓋率測(cè)試,屬于代碼的動(dòng)態(tài)測(cè)試,本章我們介紹代碼編碼規(guī)則的靜態(tài)測(cè)試。
01
關(guān)于代碼靜態(tài)檢測(cè)
靜態(tài)代碼測(cè)試通常按照既定的編碼規(guī)則,檢查被測(cè)試代碼的語法、語義、結(jié)構(gòu)等,是否符合編碼規(guī)則的要求。代碼的靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試的區(qū)別主要有以下幾點(diǎn):
1. 代碼靜態(tài)測(cè)試不會(huì)運(yùn)行代碼,代碼動(dòng)態(tài)測(cè)試會(huì)運(yùn)行代碼;
2. 靜態(tài)測(cè)試會(huì)依據(jù)相應(yīng)語言的編碼規(guī)則,動(dòng)態(tài)測(cè)試跟編碼規(guī)則沒有直接關(guān)系;
3. 靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試都可以通過人工結(jié)合工具輔助的方式執(zhí)行,工具在靜態(tài)編碼規(guī)則檢測(cè)效率和工具自動(dòng)執(zhí)行完成率上,普遍高于動(dòng)態(tài)的結(jié)構(gòu)覆蓋測(cè)試;
4. 代碼靜態(tài)規(guī)則檢測(cè)的部分準(zhǔn)則內(nèi)容在編譯器編譯代碼時(shí)會(huì)執(zhí)行類似的檢查,但是編譯器不會(huì)在編譯時(shí)執(zhí)行代碼的動(dòng)態(tài)結(jié)構(gòu)覆蓋檢測(cè)。
02
代碼規(guī)則檢測(cè)的編碼標(biāo)準(zhǔn)
不同的編程語言有不同的編碼標(biāo)準(zhǔn),我們以C語言為例,C代碼的編碼標(biāo)準(zhǔn)廣為人知的有Misra-C、CERT-C、EADS-C、BARR-C等,我國(guó)常見C編碼標(biāo)準(zhǔn)有GJB 5369、GJB 8114等。這其中應(yīng)用最廣泛的可能就是Misra-C了,有很多文章專門對(duì)其進(jìn)行介紹,我們不做過多說明。同樣C++和JAVA也有對(duì)應(yīng)的國(guó)際組織或行業(yè)小組編制了相應(yīng)的編碼標(biāo)準(zhǔn)規(guī)范。
03
國(guó)軍標(biāo)編碼規(guī)范的舉例說明
本章我們使用GJB 8114標(biāo)準(zhǔn)列舉其中的一些編碼準(zhǔn)則,讓大家有所認(rèn)識(shí)。該標(biāo)準(zhǔn)的規(guī)則大體可以分為兩類,一類是強(qiáng)制準(zhǔn)則,還有一類是建議推薦準(zhǔn)則。
3.1 強(qiáng)制準(zhǔn)則舉例
[GJB8114-2013] R-1-1-1 禁止通過宏定義改變關(guān)鍵字和基本類型含義。
描述:禁止通過宏定義改變關(guān)鍵字和基本類型含義。
3.2 建議準(zhǔn)則舉例
[GJB8114-2013] A-2-9-2 建議除常數(shù)指針外,const說明均在類型說明的最外層。
描述:建議除常數(shù)指針外,const說明均在類型說明的最外層。
GJB8114定義的C代碼準(zhǔn)則從13個(gè)方面逐個(gè)進(jìn)行約束,準(zhǔn)則的條目較多,工作中涉及到政府、國(guó)企的高安全要求項(xiàng)目時(shí)該規(guī)范的使用率比較高,有需要時(shí)可以直接參考標(biāo)準(zhǔn)文檔。
04
代碼靜態(tài)規(guī)則檢測(cè)的過程
我們對(duì)一個(gè)工程的代碼或者工程中幾個(gè)代碼文件進(jìn)行靜態(tài)規(guī)則檢測(cè)時(shí),必須提前做一些準(zhǔn)備工作,來保證測(cè)試的順利執(zhí)行。
首先要確定代碼編寫的語言,C、C++或者其他語言,要確認(rèn)工程使用的IDE以及編譯器,最好能確定工程代碼的頭文件或者路徑,以及宏定義。然后我們需要確定進(jìn)行代碼靜態(tài)檢測(cè)的標(biāo)準(zhǔn)依據(jù),是Misra C還是GJB 8114,以及標(biāo)準(zhǔn)的版本如Misra-C 2004。
完成上述的準(zhǔn)備工作后我們就可以選擇使用的測(cè)試工具,是否已購(gòu)買相關(guān)工具,還是使用開源產(chǎn)品,目前可以支持代碼靜態(tài)規(guī)則檢測(cè)的開源工具還是比較多的,其中也有做的很好的產(chǎn)品,考慮到項(xiàng)目客戶方對(duì)檢測(cè)結(jié)果的認(rèn)可程度,建議使用已通過相關(guān)認(rèn)證的商用軟件工具進(jìn)行測(cè)試。
我們以TestGrid工具(SmartRocket TestGrid嵌入式軟件自動(dòng)化測(cè)試平臺(tái))為例展示一個(gè)開源C代碼項(xiàng)目基于Micra-C 2004準(zhǔn)則的靜態(tài)代碼測(cè)試。首先我們建立一個(gè)規(guī)則模板,并將Micra-C 2004標(biāo)準(zhǔn)應(yīng)用到該模板,如下圖:
從圖中我們也可以得知,規(guī)則的模板是允許自定義組合的,意味著可以從已知的標(biāo)準(zhǔn)規(guī)則集中自由選取相關(guān)條目,根據(jù)需要組合成新的規(guī)則集合用于測(cè)試活動(dòng)。
接下來我們將收集的工程相關(guān)信息填入測(cè)試配置,填入信息必須要準(zhǔn)確,如下圖所示:
配置完成后執(zhí)行規(guī)則檢查,執(zhí)行完成結(jié)果如下圖顯示:
可以通過詳情查看違反編碼準(zhǔn)則的詳細(xì)內(nèi)容,開發(fā)人員可以根據(jù)說明有針對(duì)性地進(jìn)行代碼改進(jìn)。
05
測(cè)試小結(jié)
在執(zhí)行代碼的靜態(tài)規(guī)則檢測(cè)時(shí)我們有以下建議供大家參考:
1.使用工具執(zhí)行代碼的規(guī)則檢查可以大大提高測(cè)試工作的執(zhí)行效率。
2.工具設(shè)置規(guī)則執(zhí)行嚴(yán)格時(shí)容易誤報(bào),執(zhí)行規(guī)則設(shè)置寬松時(shí)容易漏報(bào),這是正常現(xiàn)象。
3.代碼的規(guī)則檢測(cè)需要跟實(shí)際項(xiàng)目上需要使用的規(guī)則進(jìn)行適當(dāng)結(jié)合和調(diào)整匹配,切不可不顧實(shí)際直接使用Misra C等規(guī)則進(jìn)行生搬硬套。客戶方的項(xiàng)目需求提出明確要求時(shí)除外。
4.即使使用Misra C或者國(guó)軍標(biāo)的相關(guān)標(biāo)準(zhǔn),規(guī)則內(nèi)的約束門限值也需要結(jié)合實(shí)際情況在項(xiàng)目?jī)?nèi)協(xié)商確定,如單個(gè)函數(shù)的建議和最大行數(shù),圈復(fù)雜度,if后一次判定參與條件的最大個(gè)數(shù)等等門限值設(shè)定。
參考文獻(xiàn):
[1] GJB 8114-2013 《C/C++語言編程安全子集》