MISRA 簡史
協作 MISRA 項目是在 1990 年代初構思的,旨在為在道路車輛電子系統中創建嵌入式軟件制定指南。1994 年 11 月,發布了基于車輛的軟件的開發指南。
合作繼續進行,并于 1998 年 4 月出版了 MISRA C 的第一版。
最初,MISRA C 僅針對汽車行業。然而,很快就認識到它的適用性要廣泛得多……這可以通過第二版的名稱更改來體現。
1998 年 4 月 第1版《基于車輛的軟件中使用 C 語言的指南》
2004 年 10 月 第2版C 語言在關鍵系統中的使用指南
第 3版 2013 年 3 月 C語言在關鍵系統中的使用指南
現在,在其第 3版中,MISRA C 已成為大多數安全相關行業中嵌入式 C 編程的事實標準,在這些行業中,安全性至關重要,并且即使在安全性或安全性不是主要的情況下,也用于提高軟件質量考慮。
MISRA C 的背景
C 語言定義
雖然非常流行,但 C 語言有幾個缺點。特別是,語言定義(ISO 標準)并未完全指定語言,而是將某些方面置于編譯器實現的控制之下。這是有意的,部分原因是希望支持許多針對不同目標處理器的預先存在的實現。
因此,該語言的某些領域:
行為未定義——即標準沒有強加任何要求
行為是未指定的 - 即標準允許兩種或多種可能性,并且在任何情況下都沒有對選擇的進一步要求
實現可以自由選擇自己的行為,前提是已記錄在案
依賴于未定義或未指定行為的程序不能保證以可預測的方式運行;同樣,依賴于實現定義行為的程序可能難以移植到不同的目標。
語言濫用
雖然 C 程序可以以結構化和易于理解的方式進行布局,但 C 使程序員可以輕松編寫難以理解的晦澀代碼。
運算符的規范使得編譯器難以檢測到編程錯誤。例如,以下兩段代碼都是完全合法的,因此編譯器不可能知道其中一個是否被錯誤地用來代替另一個:
if ( a == b ) /* 測試 a 和 b 是否相等 */
if ( a = b ) /* 將 b 賦值給 a,然后測試 a 是否非零 */
語言誤解
程序員通常會誤解該語言的某些領域。例如,C 比其他一些語言有更多的運算符,因此有大量不同的運算符優先級,其中一些不直觀。
C 提供的類型規則也會讓熟悉強類型語言的程序員感到困惑。例如,操作數可能被“提升”為更廣泛的類型,這意味著操作產生的類型不一定與操作數的類型相同。
例如:
uint8_t c = 0x82;
簽名 int d;
d = c 《《 1; // UINT8 上的 《《 運算符返回 SIGNED INT
運行時錯誤檢查
C 程序可以編譯成小而高效的機器代碼,但代價是運行時檢查的程度非常有限。C 程序通常不為常見問題提供運行時檢查,例如算術異常(例如被零除)、溢出、指針有效性或數組綁定錯誤。
C 哲學是程序員負責進行此類檢查……
那么,什么是 MISRA C?
考慮到所有這些,MISRA C 指南定義了一個可預測的 C 語言子集,其中消除或減少了出錯的機會。
除了定義這個子集之外,這些 MISRA C 指南還提供:
開發 C 程序的教育材料
工具開發人員參考資料
這些指南中的建議,當在文檔化的軟件開發過程中使用時,解決了 C 語言的許多缺點,而與開發代碼的最終用途無關。
通過定義 C 語言的可預測子集并為開發人員提供指導,MISRA C 為嵌入式控制系統和獨立軟件的安全應用提供了最佳實踐指南。
審核編輯:郭婷
評論
查看更多