MISRA的25年
25年过去,90后已成长为现代社会发展的中坚力量,同样作为“90后”的MISRA,也已作为覆盖汽车、航空、轨道交通、核工业、医疗等领域的标准编码规范,稳稳占据静态测试编码规范发展的主街期。
1994-2020 MISRA发展简史
MISRA,全称Motor Industry Software Reliability Association(汽车工业软件可靠性协会),是由汽车制造商、零部件供应商、工程咨询商代表组成的联盟,旨在“推动开发安全相关的嵌入式软件在车辆及其他嵌入式系统中的最佳实践”。
从90年代初期开始,电子在汽车中变得越来越重要,软件又是电子器件不可或缺的组成,所以出于商业和安全方面的考虑,应对C/C++的固有问题、保证软件可靠性势在必行。
MISRA协会于1994年发布了“Development Guidelines for Vehicle based Software”,描述了软件开发过程中所有应该使用的方法集,包括对语言特性的约束,编译器的选择等。
图 1 MISRA协会大事记
1998年发布MISRA C:1998,也叫MISRA C1,即第一版正式的MISRA规则“Guidelines for the Use of the C Language in Vehicle based Software”,此版本包含127条规则,其中93项是强制性规则,34项推荐执行的规则。该规范在汽车领域产生深远影响,以至于13年后还被应用于对遗留系统的维护。
我们都知道,其实C语言是有国际标准的,即C90,C99,到最近的C11。但是,嵌入式程序员一般很少把ISO标准当作编写安全代码的规范,原因有二:
- C语言标准并不是针对代码安全的,也不是专门为嵌入式应用设计的
- C语言标准非常庞大,难以驾驭
所以,MISRA C填补了这部分空白,让程序员有规范可寻。
随着MISRA C编码规范在各汽车厂商的广泛应用,MISRA组织基于C90对MISRA C:1998做了修订,发布MISRA C:2004(MISRA C2),“Guidelines for the Use of the C Language in Critical Systems”。
从命名我们也不难发现,MISRA C已经不仅仅是指导“基于车辆”的软件了,它被扩展到其他具有高安全性要求的系统中。
MISRA C:2004包含141条规则,其中强制性规则121条,推荐规则20条,并且MISRA C:2004将这141条规则分成21个规则类别,每个类别中都有对应的强制/建议性规则。
这种规则分类的方式为MISRA C的后续发展奠定基础,也更方便开发人员做诊断问题分类。
图2 MISRA C:2004规则类别
之后,经过成千上万的用户8年时间的经验积累,2013年3月,MISRA发布了MISRA C:2012(MISRA C3)。
MISRA C的第三版(MISRA C:2012)从页数上看达到了MC2的两倍,但实际上只增加了约10%的规范,MISRA C:2012被扩充至159条规则和指令,其中规则143条,指令16条。相较上一版本,MISRA C:2012:
- 支持C90的同时,增加对C99的支持
- 增加了规则和指令的区别
- 对规则的描述更加详细和精确
- 对大多数规则给出了合规与不合规的举例
- 针对偏离的处理指导(MISRA最新发布MISRA Compliance 2020用于指导MISRA C2012规则的使用和偏离。Perforce对此已做出解读,详情请见:https://www.perforce.com/webinars/qac/best-practices-misra-compliance2020(请复制链接到浏览器打开)
- 增加了能够被静态测试工具自动执行的规则
- 优化对自动生成代码的应用指导
那么问题来了,规则和指令有什么区别?MISRA C:2012为自动生成的代码提供了哪些指导?
规则和指令的区别
规则
仅对源代码进行分析,即可对规则进行合规性判定,静态测试工具都应该具有判定这类规则的能力,不需要结合人工判定。
指令
仅分析源码无法对指令进行合规性判定,往往需要结合设计文档或开发人员经验综合判定,静态测试工具可以为指令的合规性判定提供辅助,但不同性能的工具提供的解释可能会大不相同。
针对自动生成的代码
目前,汽车开发领域越来越多得采用基于模型的开发,尤其是新能源领域,从模型自动生成代码是一个快速,灵活的过程。那么能否将编码规范应用于自动生成的代码?
答案是肯定的,MISRA C:2012 6.8 Automatically generated code这一小节指出:自动生成代码的合规性取决于建模工具、开发者及代码生成工具,如果他们可以在开发过程中遵循相关规范,那无疑会提高自动生成代码的合规性。
因此,MISRA也发布了一系列有关建模和自动生成代码的文档:
- 2007年11月发布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月发布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)中列出应用于自动生成的代码的规则分类变化以及对代码自动生成工具的文档要求。部分规则分类变化见如下图3:
图3 部分规则分类变化
我们发现在MISRA C:2012中针对手写代码是Required的规则,对自动生成的代码变为Advisory规则,做调整的规则涉及到在代码可读性、Switch语句、带有外部链接的变量声明等方面对使用C语言的约束,所以我们应该根据实际情况,结合MISRA C:2012灵活处理自动生成的代码。
MISRA的功能安全和信息安全
近几年,智能网联汽车蓬勃发展,网络信息安全受到越来越多人的关注。然而人们可能会有这样的认识误区:MISRA C定义的语言子集仅与功能安全相关,不会涉及信息安全。
为了证明MISRA C:2012同样适用于与信息安全相关的应用,MISRA协会对C语言标准协会(ISO / IEC JTC1 / SC22 / WG14)发布的C语言信息安全指南ISO / IEC 17961:2013与MISRA C:2012进行了比对。
对比结果作为MISRA C:2012 Addendum 2于2018年1月发布,其中也包含了2016年4月发布的MISRA C:2012 Amendment1中保证信息安全的规则,它表明MISRA C:2012对“C Secure”已经有了很好的覆盖度。
然而,时代的发展从未允许任何懈怠的存在。
2008年卡内基梅隆大学软件工程研究所发布了CERT C,该编码规范旨在清除代码中可能导致网络安全的编码惯例以及未定义的行为,最近一版CERT C 于2016年发布。
那么当涉及到信息安全时,我们应该如何选择编码规范?答案是同时遵循MISRA C:2012和CERT C 2016。
为什么呢?
MISRA协会在2018年1月发布了MISRA C:2012 Addendum 3,该文档阐述了两者规范映射情况(详情请参考“如何保证代码信息安全?还得从代码静态测试说起”)。
虽然MISRA C:2012对CERT C 2016同样有很好的覆盖率,但是前者是基于C99设计的,后者是基于C11设计的,且存在20%左右不重合的规范,所以最佳答案应是同时遵循两种规范,保护车辆远离黑客攻击。
图4 CERT C 2016 & MISRA C 2012规则覆盖情况汇总
经过前文叙述,我们发现MISRA C:2012 Addendum 2/3以及Amendment 1都是用来补充和说明MISRA C:2012是如何保证网络信息的,今年2月发布的MISRA C:2012 Amendment 2则不然,说到它,这背后还有一段错过的“缘分”。
在MISRA 正准备发布MISRA C:2012时,ISO / IEC 9899:2011(C11)问世,此时MISRA C工作组再考虑C11为时已晚。后来随着C11的普及,MISRA C工作组决定通过MISRA C:2012 Amendment 2来解决MISRA C:2012对C11的支持,此修正案修改了一些规则表述,也新增了部分规则,总算“修得圆满”。
图5 MISRA C:2012 Amendment 2新增规则示例
关于MISRA C,我们就先聊到这,“简史”险些成了“赘述”,接下来我们谈一谈MISRA C++ 2008。
尽管C仍然是安全关键系统中占主导地位的编程语言,但C ++的使用一直在稳步增长。于是2008年6月,MISRA C:2008发布了,它基于C++03标准编制,包含了228条规则,其中Required规则198条,Advisory规则18条,余下12条为文档型要求,该规范到现在也仍在使用中。
但是,随着C++语言标准的进步,编译器的更新,MISRA C++:2008已显露“老态”,如果我们开发采用C++11之后的语言标准,再试图遵循MISRA C++:2008编码规范显然是有难度的。
于是AUTOSAR组织基于C++14及MISRA C++:2008编写了一套新的C++编码规范:AUTOSAR Coding Guidelines,满足其Adaptive Platform的开发需求。
该规范覆盖了90%的MISRA C++:2008,同时覆盖了部分CERT C++、JSF、C++ Core,可以说为现代C++的安全使用提供了很好的依据,但这并不意味着抛弃MISRA C++:2008。
下面给出静态测试编码规范选择方案,供读者参考:
- 基于C++98/03开发:MISRA C++:2008、CERT C++(考虑信息安全时需要遵循)
- 基于C++11及之后的C++标准:AUTOSAR Coding Guidelines
2019年1月29日,MISRA和AUTOSAR这两个世界领先的编码规范联盟宣布,他们将整合MISRA C++:2008和AUTOSAR Coding Guidelines,为创新领域的软件开发提供一组通用的规则。
新的规范将基于C++17甚至是C++20开发,致力于实现汽车、航空航天、电信、医疗、国防等领域的编码最佳实践,这真是万众期待的大事
图6 MISRA编码规范汇总
MISRA编码规范与静态测试
MISRA编码规范就是为静态测试而生。
对于开发人员来说,写出符合语言标准的、能工作的代码很容易,但这些代码往往存在大量隐患,因为C/C++灵活的编程方式和语法规则可能制造出机关重重的陷阱。
一段好的代码,应该是在编码规范的约束下,达到易读、易维护、可移植好、可靠性高,可测试性强的状态,编码规范的最重要的作用不仅仅是检测出代码缺陷,还可以预防缺陷的产生。
过去采用人工审查代码时,很多公司投入大量的时间和精力去制定编码规范,到最后这些规范文档却被束之高阁,原因就是通过人工审查的方式执行编码规范难度太大,并且审查结果往往不尽如人意。
所以,人们需要借助工具自动完成代码的静态测试。MISRA提早认识到这点,并在MISRA C:2012中提高能被静态测试工具自动执行的规则比例。
我们知道,一些嵌入式开发编译工具只是可以在一定程度上遵循编码规范,我们需要借助更专业的静态分析工具实现更为精准的静态检测,比如对源代码的度量、深层数据流分析等,所以选择适合的静态分析器尤其重要。
Helix QAC和MISRA
Perforce公司的Helix QAC有30多年的静态代码测试经验,其技术专家亦参与了MISRA编码规范的制定和实践。目前Helix QAC:
- 对MISRA C++:2008实现97%的覆盖
- 对MISRA C:2004实现99%的覆盖
- 对目前应用最为广泛的MISRA C:2012实现100%覆盖
- 提供4000多条诊断消息,118个度量元,5级数据流分析
可以说是当之无愧的静态分析领域先驱。
MISRA 25年的简单回顾和分析,希望可以减少读者心中对MISRA的许多问号。
更多关于MISRA、Helix QAC、静态测试相关内容,可参考以下往期分享的精彩内容,敬请持续关注北汇信息公众号,我们将为您分享更多相关技术干货~
参考文献
[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] 陈萌萌、邵贝贝.学习《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.
-
汽车测试网V课堂
-
微信公众号
-
汽车测试网手机站
编辑推荐
最新资讯
-
NVIDIA 发布 2025 财年第三季度财务报告
2024-11-21 13:30
-
Mack卡车为买家推出创新的虚拟现场探索体验
2024-11-21 13:29
-
氢燃料电池卡车从1到100要多长时间?戴姆勒
2024-11-21 13:28
-
聚焦消费者用车极限环境,2024中国汽研汽车
2024-11-21 13:21
-
新能源汽车高寒环境可靠性行驶试验研究
2024-11-21 13:19