編排 | strongerHuang
微信公眾號 | 嵌入式專欄
C語言的標準有很多,之前給大家分享過相關的內容,比如:C89、C99標準,ANSI C、ISO C、Standard C標準等。
可能你在一些地方還看到過:MISRA C:2012,MISRA C++:2008,那你知道這是什么嗎?
今天分享的就是另外一種C語言標準:MISRA C.
嵌入式專欄
1
MISRA C是由汽車產業(yè)軟件可靠性協(xié)會(MISRA)提出的C語言開發(fā)標準。
其目的是在增進嵌入式系統(tǒng)的安全性及可移植性,針對C++語言也有對應的標準MISRA C++。
MISRA C一開始主要是針對汽車產業(yè),不過其他產業(yè)也逐漸開始使用MISRA C:包括航天、電信、國防、醫(yī)療設備、鐵路等領域中都已有廠商使用MISRA C。
MISRA C的第一版《Guidelines for the use of the C language in vehicle based software》是在1998年發(fā)行,一般稱為MISRA-C:1998.。MISRA-C:1998有127項規(guī)則,規(guī)則從1號編號到127號,其中有93項是強制要求,其余的34項是推薦使用的規(guī)則。
在2004年時發(fā)行了第二版的MISRA C的第一版《Guidelines for the use of the C language in critical systems》(或稱作MISRA-C:2004),其中有許多重要建議事項的變更,其規(guī)則也重新編號。MISRA-C:2004有141項規(guī)則,其中121項是強制要求,其余的20項是推薦使用的規(guī)則。規(guī)則分為21類,從“開發(fā)環(huán)境”到“運行期錯誤”。
2012年發(fā)布第三版,為當前最新有效的C語言規(guī)范版本,稱為MISRA C:2012。
MISRA版本
發(fā)布年份
C語言版本
指令 數(shù)量
規(guī)則 數(shù)量
指南 總數(shù)
1998
1998
C90
不詳
127
不詳
2004
2004
C90
不詳
142
不詳
2012
2012
C99
16
143
159
2012 AMD-1
2016
C99
17
156
173
2012 AMD-2
2020
C11
17
158
175
MISRA C 版本歷史
嵌入式專欄
2
當前最新有效的C語言規(guī)范版本為MISRA C:2012,下面來講講其修訂版2。
MISRA C工作組發(fā)布了對MISRA C:2012的修訂版,以支持稱為“C11”的C標準,并正式批準為ISO/IEC 9899:2011。C11已得到廣泛使用,對于一直推遲遷移到C11的項目和組織,這是一個廣受歡迎的公告。C11還取代了C99(標準ISO/IEC 9899:1999),并已被C18(標準ISO/IEC 9899:2018)取代。除了更新的C語言準則之外,MISRA C工作組還發(fā)布了MISRA 2020合規(guī)性指南。
MISRA C:2012(修訂版2)現(xiàn)在引用ISO/IEC 9899:2011,并包含C語言更新,為可能使用但受限制的功能和受禁止的功能提供指導,除非其存在您的團隊軟件審查過程已批準的偏差。在制定修訂版2的過程中,還獲得了利用先前的補充內容糾正任何已知問題的機會。MISRA工作組的任務不止是提供指導,以防止發(fā)生不可預測的行為,減少或消除編碼缺陷并在嵌入式軟件系統(tǒng)的環(huán)境中促進代碼安全、安全性、可移植性和可靠性。
新的MISRA C:2012標準:
C11標準化了可能在多核平臺上運行的多線程程序的語義,以及使用原子變量的輕量級線程間通信。使用線程本地的全局內存,其中已標識出未定義和未指定行為的實例,包括未滿足預期的已定義行為。
向前邁進并符合MISRA C:2012(修訂版2),如果我使用_Thread_local,不僅需要進行偏離,而且還需要采取保證措施來解決危害安全性的行為。
_Generic關鍵字是另一個不應使用的C11語言新功能,它可能表現(xiàn)出不良行為,并且一些人發(fā)現(xiàn)C11標準在某些情況下含糊不清。_Generic運算符是一種宏重載。它用于幫助程序員將任何宏都用作通用宏,以使其更高效。下面的代碼行顯示_Generic關鍵字如何用于聲明不同類型的數(shù)據類型的任何宏,以及如何將其聲明為不同方法的泛型。以下面的VOL宏示例為例;VOL(x)根據x的類型轉換為VOLc(x),VOLl(x),VOL(x)或VOLf(x)。
#define VOL(x) _Generic((x), char: VOLc, long double: VOLl, default: VOL, float: VOLf)(x)
最后
還有其他新的MISRA C:2012(修訂版2)規(guī)則,例如_Noreturn函數(shù)說明符、_Atomic類型說明符、_Alignas對齊說明符和_Alignof運算符,非常引人注目。使用這些類型說明符將觸發(fā)類別“必需的違規(guī)”,并且將不被使用,從而解決了C11覆蓋和安全漏洞的問題。此外,還進行了許多修訂版2更新和文本替換,以澄清和改進標準。同樣,再次提醒您非常重要的一點是,與該標準一起,用戶現(xiàn)在可以遵循MISRA Compliance 2020指南的強制性和補充性法規(guī)遵循版本。感謝MISRA工作組繼續(xù)做出色的工作,并為軟件界做出了巨大貢獻。
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!