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