本文將深入說明MISRA C++ 2023!協助您了解其歷史、為何它如此重要、指導方針,以及Parasoft如何為安全和關鍵性軟體開發提供完整的MISRA支援。
MISRA C++ 2023幫助使用現代C++語言的組織開發安全關鍵性軟體。透過使用新的MISRA標準,開發人員可以依照功能安全標準(如IEC 6108或ISO 26262)中的靜態分析要求,確保並記錄軟體應用程式的MISRA合規性。
什麼是MISRA C++ 2023?
AUTOSAR和MISRA共同編制了一套程式碼指導方針,以使用C++17語言實現安全可靠的編程。這份已發表的文件即為MISRA C++ 2023。
MISRA C++是一套編碼指導方針,定義了在關鍵系統中使用C++語言的子集,以降低錯誤發生的風險並最小化程式不符合規範的風險。
C++標準並未完全定義語言。某些情況下,行為是未定義的、未指定的或是實現定義的。如果C++程式依賴這些,則無法保證其行為是可預測的或可移植的。
MISRA指導方針旨在檢測這些情況,以確保軟體的安全性和可靠性。此外,符合規範的程式可能會以某種方式編寫,明確顯示程式碼中的錯誤,或可能被開發人員誤解。MISRA指導方針針對這些情況。
MISRA C++的演變
2008年首版的MISRA C++聚焦於C++03獲得了高度普及,但隨著C++語言的進步和C++11中新增特性,其逐漸不再符合現代需求。為了填補這個空白,AUTOSAR聯盟於2017年3月發表了AUTOSAR C++指導方針以作為其自適應平台的一部分。
自適應AUTOSAR選擇C++14作為首選語言,並且平台要求一個針對安全和安全性導向的編程標準來支持開發者。大約70%的未修改的MISRA C++2008指導方針被納入了AUTOSAR C++。
但隨著語言的持續發展,C++17中新增的語言特性催生了對新編碼指導方針的需求。MISRA和AUTOSAR決定將標準合併為一個出版物,並且MISRA接手了新版標準的工作,更新了所有C++17所需的內容。這項工作的成果就是於2023年10月發佈的MISRA C++ 2023。
MISRA C++ 2023指導方針與規則
MISRA C++ 2023指導方針分為規則和指令。規則是指包含完整合規與不合規定義的指導方針。而指令則無法提供進行合規檢查所需的完整描述,因為這通常取決於特定專案中的設計決策。
每項指導方針會被分類為以下之一:
- 具強制性
- 必須遵循
- 顧問性建議
規則還會透過進一步分類來進行可決性和範疇分析。
強制性的指導方針必須遵循,無法偏離。必須遵循的指導方針在遵循正式偏離程序並解決所有潛在問題的情況下可以偏離。顧問性建議則是應在可行的情況下遵循。
可決性屬性定義了規則是否通常可以由自動化工具分析。範疇屬性定義了是否應該通過分析單一翻譯單位或整個系統來檢查指導方針。
MISRA C++ 2023共有179項指導方針,4項指令,以及175項規則,這些規則被分組到與C++標準相對應的章節中,包括以下內容:
- 基本概念
- 標準轉換
- 表達式
- 語句
- 特殊成員函數
- 異常處理
其中一些規則來自AUTOSAR編程指導方針或舊版MISRA C++ 2008。然而,MISRA指導方針僅專注於實現,而AUTOSAR則提供了與設計、工具鏈基礎設施或文檔相關的建議。一般來說,MISRA C++ 2023更注重程式碼的語義,並避免錯誤,而不會給予過多的風格性指導。
為什麼MISRA C++ 2023對於安全和可靠的軟體至關重要?
MISRA C++旨在提供C++語言的一個安全子集。這是透過對C++原始碼的多項要求和限制來增強應用程序的安全性與可靠性。
錯誤預防
C++標準將某些情況指定為未定義行為,主要是允許編譯器生成更高效的程式碼。編譯器被允許假設未定義的行為情況永遠不會發生,並基於這一假設進行額外的優化。這帶來的風險是,如果該情況發生,程式的行為將變得不可預測。在某些情況下,這意味著程式在運行測試時行為正常,但在生產環境中失敗,這可能會使整個驗證過程變得徒勞無功。
程式碼可維護性
C++標準中描述了抽象機器的某些方面作為實現定義的行為。這意味著程式碼的行為是明確定義的,並需要檔案化,但在不同實現之間可能有所差異。
仰賴於實現定義行為的程式可能難以移植到另一個目標平台。這種行為的一個例子是sizeof(int),它會影響算術運算的行為,例如所有具有較窄類型的運算元在實際運算發生之前會被提升。最終,這可能會導致根據編譯目標不同,算術運算的結果也有所不同。
MISRA C++指導方針透過其標準轉換規則來防範這類問題,例如:
- Rule 7.0.5: Integral promotion and the usual arithmetic conversions shall not change the signedness or the type category of an operand.
- 規則7.0.5:整數提升和常規算術轉換不得改變運算元的符號或類型分類。
- Rule 7.0.6: Assignment between numeric types shall be appropriate.
- 規則7.0.6:數值類型之間的賦值必須是適當的。
風險管理
MISRA指導方針還解決了由於開發者的困惑或對有效C++原始碼的錯誤理解而可能引起的風險。例如,代碼if (x = y)是完全有效的C++,但很可能是由於打字錯誤,意外使用了賦值運算符而不是等號運算符。
規則8.18.2:不應使用賦值運算符的結果,確保這類程式碼將被報告並審查其正確性。
結論
使用合理的編碼指導方針和安全的語言子集是功能安全標準的必要要求,如此將能夠聲明符合MISRA C++ 2023的組織,增強其現代C++應用程式的安全性與可靠性。
歡迎瀏覽FSG了解更多資訊
本文由parasoft提供