MISRA的25年
25年過去,90后已成長為現(xiàn)代社會(huì)發(fā)展的中堅(jiān)力量,同樣作為“90后”的MISRA,也已作為覆蓋汽車、航空、軌道交通、核工業(yè)、醫(yī)療等領(lǐng)域的標(biāo)準(zhǔn)編碼規(guī)范,穩(wěn)穩(wěn)占據(jù)靜態(tài)測試編碼規(guī)范發(fā)展的主街期。
1994-2020 MISRA發(fā)展簡史
MISRA,全稱Motor Industry Software Reliability Association(汽車工業(yè)軟件可靠性協(xié)會(huì)),是由汽車制造商、零部件供應(yīng)商、工程咨詢商代表組成的聯(lián)盟,旨在“推動(dòng)開發(fā)安全相關(guān)的嵌入式軟件在車輛及其他嵌入式系統(tǒng)中的最佳實(shí)踐”。
從90年代初期開始,電子在汽車中變得越來越重要,軟件又是電子器件不可或缺的組成,所以出于商業(yè)和安全方面的考慮,應(yīng)對(duì)C/C++的固有問題、保證軟件可靠性勢在必行。
MISRA協(xié)會(huì)于1994年發(fā)布了“Development Guidelines for Vehicle based Software”,描述了軟件開發(fā)過程中所有應(yīng)該使用的方法集,包括對(duì)語言特性的約束,編譯器的選擇等。

圖 1 MISRA協(xié)會(huì)大事記
1998年發(fā)布MISRA C:1998,也叫MISRA C1,即第一版正式的MISRA規(guī)則“Guidelines for the Use of the C Language in Vehicle based Software”,此版本包含127條規(guī)則,其中93項(xiàng)是強(qiáng)制性規(guī)則,34項(xiàng)推薦執(zhí)行的規(guī)則。該規(guī)范在汽車領(lǐng)域產(chǎn)生深遠(yuǎn)影響,以至于13年后還被應(yīng)用于對(duì)遺留系統(tǒng)的維護(hù)。
我們都知道,其實(shí)C語言是有國際標(biāo)準(zhǔn)的,即C90,C99,到最近的C11。但是,嵌入式程序員一般很少把ISO標(biāo)準(zhǔn)當(dāng)作編寫安全代碼的規(guī)范,原因有二:
- C語言標(biāo)準(zhǔn)并不是針對(duì)代碼安全的,也不是專門為嵌入式應(yīng)用設(shè)計(jì)的
- C語言標(biāo)準(zhǔn)非常龐大,難以駕馭
所以,MISRA C填補(bǔ)了這部分空白,讓程序員有規(guī)范可尋。
隨著MISRA C編碼規(guī)范在各汽車廠商的廣泛應(yīng)用,MISRA組織基于C90對(duì)MISRA C:1998做了修訂,發(fā)布MISRA C:2004(MISRA C2),“Guidelines for the Use of the C Language in Critical Systems”。
從命名我們也不難發(fā)現(xiàn),MISRA C已經(jīng)不僅僅是指導(dǎo)“基于車輛”的軟件了,它被擴(kuò)展到其他具有高安全性要求的系統(tǒng)中。
MISRA C:2004包含141條規(guī)則,其中強(qiáng)制性規(guī)則121條,推薦規(guī)則20條,并且MISRA C:2004將這141條規(guī)則分成21個(gè)規(guī)則類別,每個(gè)類別中都有對(duì)應(yīng)的強(qiáng)制/建議性規(guī)則。
這種規(guī)則分類的方式為MISRA C的后續(xù)發(fā)展奠定基礎(chǔ),也更方便開發(fā)人員做診斷問題分類。

圖2 MISRA C:2004規(guī)則類別
之后,經(jīng)過成千上萬的用戶8年時(shí)間的經(jīng)驗(yàn)積累,2013年3月,MISRA發(fā)布了MISRA C:2012(MISRA C3)。
MISRA C的第三版(MISRA C:2012)從頁數(shù)上看達(dá)到了MC2的兩倍,但實(shí)際上只增加了約10%的規(guī)范,MISRA C:2012被擴(kuò)充至159條規(guī)則和指令,其中規(guī)則143條,指令16條。相較上一版本,MISRA C:2012:
- 支持C90的同時(shí),增加對(duì)C99的支持
- 增加了規(guī)則和指令的區(qū)別
- 對(duì)規(guī)則的描述更加詳細(xì)和精確
- 對(duì)大多數(shù)規(guī)則給出了合規(guī)與不合規(guī)的舉例
- 針對(duì)偏離的處理指導(dǎo)(MISRA最新發(fā)布MISRA Compliance 2020用于指導(dǎo)MISRA C2012規(guī)則的使用和偏離。Perforce對(duì)此已做出解讀,詳情請(qǐng)見:https://www.perforce.com/webinars/qac/best-practices-misra-compliance2020(請(qǐng)復(fù)制鏈接到瀏覽器打開)
- 增加了能夠被靜態(tài)測試工具自動(dòng)執(zhí)行的規(guī)則
- 優(yōu)化對(duì)自動(dòng)生成代碼的應(yīng)用指導(dǎo)
那么問題來了,規(guī)則和指令有什么區(qū)別?MISRA C:2012為自動(dòng)生成的代碼提供了哪些指導(dǎo)?
規(guī)則和指令的區(qū)別
規(guī)則
僅對(duì)源代碼進(jìn)行分析,即可對(duì)規(guī)則進(jìn)行合規(guī)性判定,靜態(tài)測試工具都應(yīng)該具有判定這類規(guī)則的能力,不需要結(jié)合人工判定。
指令
僅分析源碼無法對(duì)指令進(jìn)行合規(guī)性判定,往往需要結(jié)合設(shè)計(jì)文檔或開發(fā)人員經(jīng)驗(yàn)綜合判定,靜態(tài)測試工具可以為指令的合規(guī)性判定提供輔助,但不同性能的工具提供的解釋可能會(huì)大不相同。
針對(duì)自動(dòng)生成的代碼
目前,汽車開發(fā)領(lǐng)域越來越多得采用基于模型的開發(fā),尤其是新能源領(lǐng)域,從模型自動(dòng)生成代碼是一個(gè)快速,靈活的過程。那么能否將編碼規(guī)范應(yīng)用于自動(dòng)生成的代碼?
答案是肯定的,MISRA C:2012 6.8 Automatically generated code這一小節(jié)指出:自動(dòng)生成代碼的合規(guī)性取決于建模工具、開發(fā)者及代碼生成工具,如果他們可以在開發(fā)過程中遵循相關(guān)規(guī)范,那無疑會(huì)提高自動(dòng)生成代碼的合規(guī)性。
因此,MISRA也發(fā)布了一系列有關(guān)建模和自動(dòng)生成代碼的文檔:
- 2007年11月發(fā)布MISRA AC AGC(Guidelines for the application of MISRA-C:2004 in the context of automatic code generation)和MISRA AC TL(Modelling style guidelines for the application of Targetlink in the context of automatic code generation)
- 2009年5月發(fā)布MISRA AC SLSF(Modelling design and style guidelines for the application of Simulink and Stateflow)及MISRA AC GMG(Generic modelling design and style guidelines)
另外,MISRA C:2012 還在附錄(Appendix E)中列出應(yīng)用于自動(dòng)生成的代碼的規(guī)則分類變化以及對(duì)代碼自動(dòng)生成工具的文檔要求。部分規(guī)則分類變化見如下圖3:

圖3 部分規(guī)則分類變化
我們發(fā)現(xiàn)在MISRA C:2012中針對(duì)手寫代碼是Required的規(guī)則,對(duì)自動(dòng)生成的代碼變?yōu)锳dvisory規(guī)則,做調(diào)整的規(guī)則涉及到在代碼可讀性、Switch語句、帶有外部鏈接的變量聲明等方面對(duì)使用C語言的約束,所以我們應(yīng)該根據(jù)實(shí)際情況,結(jié)合MISRA C:2012靈活處理自動(dòng)生成的代碼。
MISRA的功能安全和信息安全
近幾年,智能網(wǎng)聯(lián)汽車蓬勃發(fā)展,網(wǎng)絡(luò)信息安全受到越來越多人的關(guān)注。然而人們可能會(huì)有這樣的認(rèn)識(shí)誤區(qū):MISRA C定義的語言子集僅與功能安全相關(guān),不會(huì)涉及信息安全。
為了證明MISRA C:2012同樣適用于與信息安全相關(guān)的應(yīng)用,MISRA協(xié)會(huì)對(duì)C語言標(biāo)準(zhǔn)協(xié)會(huì)(ISO / IEC JTC1 / SC22 / WG14)發(fā)布的C語言信息安全指南ISO / IEC 17961:2013與MISRA C:2012進(jìn)行了比對(duì)。
對(duì)比結(jié)果作為MISRA C:2012 Addendum 2于2018年1月發(fā)布,其中也包含了2016年4月發(fā)布的MISRA C:2012 Amendment1中保證信息安全的規(guī)則,它表明MISRA C:2012對(duì)“C Secure”已經(jīng)有了很好的覆蓋度。
然而,時(shí)代的發(fā)展從未允許任何懈怠的存在。
2008年卡內(nèi)基梅隆大學(xué)軟件工程研究所發(fā)布了CERT C,該編碼規(guī)范旨在清除代碼中可能導(dǎo)致網(wǎng)絡(luò)安全的編碼慣例以及未定義的行為,最近一版CERT C 于2016年發(fā)布。
那么當(dāng)涉及到信息安全時(shí),我們應(yīng)該如何選擇編碼規(guī)范?答案是同時(shí)遵循MISRA C:2012和CERT C 2016。
為什么呢?
MISRA協(xié)會(huì)在2018年1月發(fā)布了MISRA C:2012 Addendum 3,該文檔闡述了兩者規(guī)范映射情況(詳情請(qǐng)參考“如何保證代碼信息安全?還得從代碼靜態(tài)測試說起”)。
雖然MISRA C:2012對(duì)CERT C 2016同樣有很好的覆蓋率,但是前者是基于C99設(shè)計(jì)的,后者是基于C11設(shè)計(jì)的,且存在20%左右不重合的規(guī)范,所以最佳答案應(yīng)是同時(shí)遵循兩種規(guī)范,保護(hù)車輛遠(yuǎn)離黑客攻擊。

圖4 CERT C 2016 & MISRA C 2012規(guī)則覆蓋情況匯總
經(jīng)過前文敘述,我們發(fā)現(xiàn)MISRA C:2012 Addendum 2/3以及Amendment 1都是用來補(bǔ)充和說明MISRA C:2012是如何保證網(wǎng)絡(luò)信息的,今年2月發(fā)布的MISRA C:2012 Amendment 2則不然,說到它,這背后還有一段錯(cuò)過的“緣分”。
在MISRA 正準(zhǔn)備發(fā)布MISRA C:2012時(shí),ISO / IEC 9899:2011(C11)問世,此時(shí)MISRA C工作組再考慮C11為時(shí)已晚。后來隨著C11的普及,MISRA C工作組決定通過MISRA C:2012 Amendment 2來解決MISRA C:2012對(duì)C11的支持,此修正案修改了一些規(guī)則表述,也新增了部分規(guī)則,總算“修得圓滿”。

圖5 MISRA C:2012 Amendment 2新增規(guī)則示例
關(guān)于MISRA C,我們就先聊到這,“簡史”險(xiǎn)些成了“贅述”,接下來我們談一談MISRA C++ 2008。
盡管C仍然是安全關(guān)鍵系統(tǒng)中占主導(dǎo)地位的編程語言,但C ++的使用一直在穩(wěn)步增長。于是2008年6月,MISRA C:2008發(fā)布了,它基于C++03標(biāo)準(zhǔn)編制,包含了228條規(guī)則,其中Required規(guī)則198條,Advisory規(guī)則18條,余下12條為文檔型要求,該規(guī)范到現(xiàn)在也仍在使用中。
但是,隨著C++語言標(biāo)準(zhǔn)的進(jìn)步,編譯器的更新,MISRA C++:2008已顯露“老態(tài)”,如果我們開發(fā)采用C++11之后的語言標(biāo)準(zhǔn),再試圖遵循MISRA C++:2008編碼規(guī)范顯然是有難度的。
于是AUTOSAR組織基于C++14及MISRA C++:2008編寫了一套新的C++編碼規(guī)范:AUTOSAR Coding Guidelines,滿足其Adaptive Platform的開發(fā)需求。
該規(guī)范覆蓋了90%的MISRA C++:2008,同時(shí)覆蓋了部分CERT C++、JSF、C++ Core,可以說為現(xiàn)代C++的安全使用提供了很好的依據(jù),但這并不意味著拋棄MISRA C++:2008。
下面給出靜態(tài)測試編碼規(guī)范選擇方案,供讀者參考:
- 基于C++98/03開發(fā):MISRA C++:2008、CERT C++(考慮信息安全時(shí)需要遵循)
- 基于C++11及之后的C++標(biāo)準(zhǔn):AUTOSAR Coding Guidelines
2019年1月29日,MISRA和AUTOSAR這兩個(gè)世界領(lǐng)先的編碼規(guī)范聯(lián)盟宣布,他們將整合MISRA C++:2008和AUTOSAR Coding Guidelines,為創(chuàng)新領(lǐng)域的軟件開發(fā)提供一組通用的規(guī)則。
新的規(guī)范將基于C++17甚至是C++20開發(fā),致力于實(shí)現(xiàn)汽車、航空航天、電信、醫(yī)療、國防等領(lǐng)域的編碼最佳實(shí)踐,這真是萬眾期待的大事

圖6 MISRA編碼規(guī)范匯總
MISRA編碼規(guī)范與靜態(tài)測試
MISRA編碼規(guī)范就是為靜態(tài)測試而生。
對(duì)于開發(fā)人員來說,寫出符合語言標(biāo)準(zhǔn)的、能工作的代碼很容易,但這些代碼往往存在大量隱患,因?yàn)镃/C++靈活的編程方式和語法規(guī)則可能制造出機(jī)關(guān)重重的陷阱。
一段好的代碼,應(yīng)該是在編碼規(guī)范的約束下,達(dá)到易讀、易維護(hù)、可移植好、可靠性高,可測試性強(qiáng)的狀態(tài),編碼規(guī)范的最重要的作用不僅僅是檢測出代碼缺陷,還可以預(yù)防缺陷的產(chǎn)生。
過去采用人工審查代碼時(shí),很多公司投入大量的時(shí)間和精力去制定編碼規(guī)范,到最后這些規(guī)范文檔卻被束之高閣,原因就是通過人工審查的方式執(zhí)行編碼規(guī)范難度太大,并且審查結(jié)果往往不盡如人意。
所以,人們需要借助工具自動(dòng)完成代碼的靜態(tài)測試。MISRA提早認(rèn)識(shí)到這點(diǎn),并在MISRA C:2012中提高能被靜態(tài)測試工具自動(dòng)執(zhí)行的規(guī)則比例。
我們知道,一些嵌入式開發(fā)編譯工具只是可以在一定程度上遵循編碼規(guī)范,我們需要借助更專業(yè)的靜態(tài)分析工具實(shí)現(xiàn)更為精準(zhǔn)的靜態(tài)檢測,比如對(duì)源代碼的度量、深層數(shù)據(jù)流分析等,所以選擇適合的靜態(tài)分析器尤其重要。
Helix QAC和MISRA
Perforce公司的Helix QAC有30多年的靜態(tài)代碼測試經(jīng)驗(yàn),其技術(shù)專家亦參與了MISRA編碼規(guī)范的制定和實(shí)踐。目前Helix QAC:
- 對(duì)MISRA C++:2008實(shí)現(xiàn)97%的覆蓋
- 對(duì)MISRA C:2004實(shí)現(xiàn)99%的覆蓋
- 對(duì)目前應(yīng)用最為廣泛的MISRA C:2012實(shí)現(xiàn)100%覆蓋
- 提供4000多條診斷消息,118個(gè)度量元,5級(jí)數(shù)據(jù)流分析
可以說是當(dāng)之無愧的靜態(tài)分析領(lǐng)域先驅(qū)。
MISRA 25年的簡單回顧和分析,希望可以減少讀者心中對(duì)MISRA的許多問號(hào)。
更多關(guān)于MISRA、Helix QAC、靜態(tài)測試相關(guān)內(nèi)容,可參考以下往期分享的精彩內(nèi)容,敬請(qǐng)持續(xù)關(guān)注北匯信息公眾號(hào),我們將為您分享更多相關(guān)技術(shù)干貨~
參考文獻(xiàn)
[1] MISRA C:2012 – Addendum 3 Coverage of MISRA C:2012 (including Amendment 1) against CERT C 2016 Edition.
[2] MISRA C:2012 - Amendment 1: Additional security guidelines for MISRA C:2012, ISBN 978-906400-16-3 (PDF), April 2016.
[3] MISRA C:2012-Amendment 2:Updates for ISO/IEC 9899:2011 core functionality, ISBN 978-906400-25-5(PDF),February 2020.
[4] MISRA C:2012 – Addendum 2 Coverage of MISRA C:2012 against ISO/IEC TS 17961:2013”C Secure”, ISBN 978-906400-18-7(PDF),Second Edition,January 2018.
[5] 陳萌萌、邵貝貝.學(xué)習(xí)《MISRA-C》
[6] MISRA C:2004 Guidelines for the Use of the C Language in Critical Systems, ISBN 0 9524156 2 3 (paperback), ISBN 0 9524156 4 X (PDF), October 2004.
[7] MISRA C:2012 Guidelines for the Use of the C Language in Critical Systems, ISBN 978-1-906400-10-1 (paperback), ISBN 978-1-906400-11-8 (PDF), March 2013.
廣告 編輯推薦
最新資訊
-
“汽車爬坡試驗(yàn)方法”將有國家標(biāo)準(zhǔn)
2026-03-03 12:44
-
十年耐久監(jiān)管時(shí)代:電池系統(tǒng)開發(fā)策略將如何
2026-03-03 12:44
-
聯(lián)合國法規(guī)R59對(duì)機(jī)動(dòng)車備用消聲系統(tǒng)的工程
2026-03-03 12:08
-
聯(lián)合國法規(guī)R58對(duì)后下部防護(hù)裝置的工程化約
2026-03-03 12:07
-
聯(lián)合國法規(guī)R57對(duì)摩托車前照燈配光性能的工
2026-03-03 12:07





廣告


























































