近年來,軟件質量、安全和保障已成為重中之重。在我們之前的文章中,我們已經提到了歷史上的一些事件,這些事件既造成了巨大的經濟損失,也造成了人員死亡。Ariane 5的爆炸,Therac-25放射治療機使患者暴露于 20,000 拉德的過量劑量,89 人因豐田的過錯而死亡。所有這些故事都有一個共同點:導致巨大損失的軟件錯誤。
那么什么是 MISRA?
最初,MISRA(汽車行業軟件可靠性協會)成立的目的是為道路車輛中使用的微控制器設計一套軟件開發指南。從那時起,它就被應用于汽車工業、醫療設備、航空航天和國防等所有對可靠性和安全性至關重要的領域。MISRA 標準是由一組規則和建議組成的文檔,C 和 C++ 開發人員在開發其應用程序時應遵守這些規則和建議。MISRA-C:1998 版本有127條規則。
所有這些規則都可以分為以下幾類:
強制的
必需 – 允許偏離規則(但建議記錄在案)
咨詢——非強制性
(來源: 什么是 MISRA 以及如何烹飪)
首先要提到的是,MISRA 標準的應用應該在開發過程真正開始之前就開始,并且只有在真正需要的時候才開始。在其他情況下,特別是當代碼庫足夠大并且不打算在嵌入式系統上使用時,開發人員將不得不進行漫長而乏味的重構。為什么這樣?
WinMerge 的源代碼長約 25 萬行 C 和 C++ 代碼。這是一個小項目,但是將if語句的主體括在花括號中的規則在其中被破壞了大約 2000 次。有 127-228 條這樣的規則(取決于標準的版本)。
Nana 是一個用于創建圖形用戶界面的跨平臺庫,其源代碼長度不到 10 萬行。在這個項目中,同樣的規則被打破了大約三千次。
除了關于花括號的規則之外,還有一些規則:
不得使用 continue 語句;
每個 switch 語句都應該有一個默認標簽;
不得使用 goto 語句;
所有 if 。.. else if 結構都應以 else 子句終止;
那么,它是用來做什么的呢?
但是,這些規則并不意味著讓開發人員的生活更加艱難。這些是用鮮血寫成的規則,它們用于使安全關鍵代碼不易出現錯誤。這個想法是簡單而清晰的代碼不太可能包含錯誤。以下是一些作為證據的診斷示例:
賦值運算符不得用于返回布爾值的表達式;
所有非 void 的函數都應該返回一個值;
循環計數器不應具有本質上的浮動類型;
一個函數最后應該有一個退出點;
遵循 MISRA 指南將有助于提高軟件的可靠性。但是,不熟悉 MISRA 的人可能想知道它是如何使用的。你真的必須記住所有這 127 條規則嗎?這就是靜態分析器可以提供幫助的地方。
靜態分析的目的是什么?
手動檢查代碼是否符合 MISRA 標準是一項漫長而乏味的工作。但實際上你不必記住所有這些規則。靜態代碼分析器可以為您完成所有工作。
靜態代碼分析是檢測計算機程序源代碼中的錯誤和小缺陷的過程。它可以被視為自動代碼審查。一些靜態分析器可以檢查代碼是否符合 MISRA 規則,正是這些工具將幫助您找到并修復程序中所有不符合規則的點。為此,您只需使用分析儀檢查您的項目并研究檢查結束時生成的分析報告。下面我將簡要演示如何使用 PVS-Studio 分析器和項目 Shairport 作為示例來執行此操作。PVS-Studio 可在此處下載。
克隆存儲庫。
運行構建配置腳本。
在跟蹤模式下運行 PVS-Studio 并構建項目。
根據上一步的結果分析項目文件。
將日志轉換為 html。
完畢。我們現在可以查看日志。
所以,我們今天了解了 MISRA:我們查看了一些規則,討論了為什么需要這些指南,如何將它們應用到您的項目中,等等。我希望這篇文章足夠有趣,不會讓你昏昏欲睡,而且仍然能提供豐富的信息,讓作者的工作值得。希望現在您對 MISRA 是什么以及需要什么靜態代碼分析器有了更好的理解。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7646瀏覽量
151965 -
C++
+關注
關注
22文章
2114瀏覽量
73817 -
源代碼
+關注
關注
96文章
2946瀏覽量
66894
發布評論請先 登錄
相關推薦
評論