什么是 MISRA C:2012
MISRA C:2012是由汽车工业软件可靠性协会( MISRA , Motor Industry Software Reliability Association)于 2012 年发布的第三版 C 语言开发标准。其目的是增进嵌入式系统的安全性及可移植性。
二十世纪九十年代,汽车制造业发展迅猛,汽车电子软件的安全性备受关注.同时由于汽车制造业包含大量的嵌入式编码,人们急需一个编码规范来保证汽车电子软件的安全性、可靠性。MISRA C 应运而生。
MISRA 先后发布了三代编码规范,分别是MISRA C:1998、MISRA C:2004 和 MISRA C:2012。经过多年的发展,MISRA C 已经成为汽车,航空航天,电信,医疗设备,国防,铁路等领域的开发人员广泛接受的最佳编码规范。
MISRA C:2012在前两版的基础上扩展了对 C 语言 C99 版本的支持(同时维护 C90 的指南),进一步降低了编码合规性的成本和复杂程度,更好地提升了关键系统(critical systems)中编码的一致性和安全性。

(左上为 MISRA C:1998、 左下为 MISRA C:2004 、右图为 MISRA C:2012)图源 MISRA 官网
MISRA C:2012 共有159条规则,分为两个类型:Directive 和 Rule. Rule 相比 Directive,有更加明确的描述。每一条规则对应一条编码准则。下面例举 MISRA C:2012中的几条规则,便于更好地说明规则如何帮助程序员提升代码的质量。

Rule:
- 共有 143 条
- 有三种分类:Advisory / Required / Mandatory
- 具有可判定性
- 具有作用域
Rule 7.1中规定不可以使用八进制常量,例如”010“(注:八进制常数通常以 0 开头),而”010“既可以理解为八进制的 010(对应十进制的 8),也可以理解为十进制的 10(开头的 0 只是前导的 0)。这一条规定可以避免这样的混淆。

Directive:
- 共有 16 项
- 有三种分类:Advisory / Required / Mandatory
- 具有可判定性
Dir 4.4 中规定不应”注释掉“代码段。有的时候程序员在编写过程中经常会需要调试程序,但是又不想删掉代码段所以采用添加注释符号暂时将程序段脱离运行,等程序调试后,只需取消那几个注释符,即可令原有的程序段重新被启用,这就是”注释掉“。但是使用注释记号来实现这一目的很容易出现错误,因为 C 语言不支持嵌套注释,如果代码部分已经存在注释,那么就会改变代码效果。如图四所示:

代码段1上方和下方分别有注释1和注释2两个注释,程序员新添加了注释4是想把代码段1”注释掉“,但是由于 C 语言不支持嵌套注释,实际上注释在代码段1上方已经结束,代码段1照常运行。这就背离了程序员的设想。
序号 | 分类 | Advisory | Required | Mandatory | 总计 |
---|---|---|---|---|---|
1 | Directive | 16 | 16 | ||
2 | Rule-标准的C语言环境 | 1 | 2 | 3 | |
3 | Rule-未使用的代码 | 5 | 2 | 7 | |
4 | Rule-注释 | 2 | 2 | ||
5 | Rule-字符集和词法约定 | 1 | 1 | 2 | |
6 | Rule-标识符 | 1 | 8 | 9 | |
7 | Rule-类型 | 2 | 2 | ||
8 | Rule-字面量和常量 | 4 | 4 | ||
9 | Rule-声明和定义 | 4 | 10 | 14 | |
10 | Rule-初始化 | 4 | 1 | 5 | |
11 | Rule-基本类型模型 | 1 | 7 | 8 | |
12 | Rule-指针类型转换 | 2 | 7 | 9 | |
13 | Rule-表达式 | 3 | 1 | 4 | |
14 | Rule-副作用 | 2 | 3 | 1 | 6 |
15 | Rule-控制语句表达式 | 4 | 4 | ||
16 | Rule-控制流 | 3 | 4 | 7 | |
17 | Rule-switch语句 | 7 | 7 | ||
18 | Rule-函数 | 2 | 3 | 3 | 8 |
19 | Rule-指针和数组 | 2 | 6 | 8 | |
20 | Rule-重叠的存储 | 1 | 1 | 2 | |
21 | Rule-预处理指令 | 3 | 11 | 14 | |
22 | Rule-标准库 | 1 | 11 | 12 | |
23 | Rule-资源 | 2 | 4 | 6 | |
总计 | 32 | 101 | 10 | 159 |
按照 MISRA C 的标准来写代码,一方面可以帮助嵌入式程序员慢慢摒弃那些可能存在风险的编程行为,逐渐树立一些好的编程习惯和编程思路;另一方面,可以避免程序流程产生混淆和混乱,排除其中的不确定因素,使程序真正按照程序员设想的工作,并使代码更清晰易懂,真正实现安全可靠,并具有良好的可读性和可维护性。
一个程序能够符合编程规范,一种方法就是程序员严格按照 MISRA C 来写代码,但是显然这种边写边检查的方式极大的消耗人力,影响工作效率。还有一种更便捷、省力的方法就是利用第三方软件来帮助程序员检查代码中的错误。比如 NaiveSystems™ Analyze 就支持绝大多数 MISRA C:2012 规则的静态检查,包括 AMD1 和 AMD2 的内容。
您可以点击链接,跳转官网,或者扫描文末二维码,关注 Naive Systems 微信公众号,获取更多产品咨询。
