在汽车嵌入式软件开发中,采用MISRA C规范作为代码级别规范,模型级别的规范则采用Mathworks提出的建模规范MAAB(MathWorks Automotive Advisory Board)。
1 MISRA C
在第一章中,我们介绍了在嵌入式系统中大多数软件采用C/C++语言编写,但是C/C++语言是弱类型语言,编写的程序最大的问题是可靠性很难保证。目前避免C/C++语言中不安全因素的普遍做法是遵照已制定的编码标准(规范)或从中选定的安全子集来编写程序,其中MISRA C是欧洲汽车工业针对嵌入式C语言的应用所编写的安全子集,经多年发展,MISRA C已经从汽车行业编码规范发展成为跨行业的编码规范,成为世界范围内广泛使用的C语言编码规范。
1.1 MISRA C:2004编程规范
在MISRA C:2004中共有必要规则(Required Rules)121条,推荐规则(Advisory Rules)20条。任何符合MISRA C:2003编程规范的代码都应该严格遵循121条必要规则的要求,并应该在条件允许的情况下尽可能符合20条推荐规则。
MISRA C:2004将其141条规则分为21个类别,每一条规则对应一条编程准则。
#建议规则:是非严格遵守的规则,是对程序员的强烈建议。
#必要规则:是必须遵守的规则,是对程序员的强制要求
1.2 MISRA C:2012 编程规范
对于那些遵循MISRA C:2004开发的代码,MISRA C:2012对其造成的影响是极为有限的。
MISRA C:2012的文档看起来比MISRA C:2004要大得多,但实际上,编码规则总数并没有增加多少:MISRA C:2004包含了141条规则,而MISRA C:2012包含了143条规则和16条指令。MISRA C:2012的文档之所以大了许多,在于其每条编码规则的体积都“变大”了:
更精确的规则描述
- 原理:解释本编码规则的必要性;
- 例外:列举不适用本编码规则的特殊情况;
- 举例:从代码遵从本编码规则和代码不遵从本编码规则两个角度进行举例。
增加了规则和指令的区别
指令:仅仅依靠源代码分析,无法对“指令”进行合规性判定,往往需要开发人员提供更多的信息,如设计文档和要求说明。静态代码检测工具可以判定代码符合“指令”,但对于代码不符合“指令”的情况,静态代码检测工具给出的判定结果可能千差万别。
规则:仅仅依靠源代码分析,就可以对“规则”进行合规性判定,不需要开发人员提供更多的信息。所有的静态代码检测工具都应具对“规则”进行合规性判定的能力。
增加了系统规则和单一翻译单元规则之间的区别
编码规则执行的难易程度有着很大的差别。最简单的规则(如“不得使用八进制常量”)可以通过简单的语句语法分析进行判定。然而,很多编码规则的判定,需要一条控制语句、一个完整的功能、一个完整的翻译单元、甚至一个项目的整个代码库的支撑才能进行判定。
在MISRA C:2012中,每条编码规则都被划分为“系统规则”或“单一翻译单元规则”,用来反映编码规则的执行范围。这两者之间的区别如下:
- 单一翻译单元无法进行系统规则的合规性判定。
- 进行系统规则的合规性判定,往往意味着更高的要求及更多的时间。
增加了可判断性内容
编码规则的另一个重要属性是可判定性。对于一些简单的编码规则,只需进行简单的语法分析即可实现判定;而对于某些复杂的规则,则需要深入地分析代码的结构和语义。
对于一些编码规则,其本质是“不可判定的”——不论静态代码检测工具进行多么深入的分析,都无法判定代码的合规性;相反,当某个编码规则被违反,任何工具都可判定且不会误报,那么该规则被认为是“可判定的”。换句话说,任何工具对于“可判定的”编码规则,只会给出两个可能的答案:
- Yes – 此处违反该规则;
- No –此处没有违反该规则;
MISRAC:2012中,所有的规则都被划分为“可判定的”和“不可判定的”两类。共计143条编码规则,其中28条为“不可判定的”。当一个编码规则为“不可判定的”,那么对于这条规则,永远不能保证其合规性,工具可能会给出第三个答案:
- 无法保证合规性检查结果的准确性。
2 MAAB
关于MAAB建模规范在先前的专题中已有详细的介绍,此处不再赘述,可参考之前的专题。申老shi学习笔记--MAAB控制算法建模规范介绍申老shi学习笔记--MAAB建模规范之命名规则一申老shi学习笔记--MAAB建模规范之命名规则二申老shi学习笔记--MAAB建模规范之Simulink一申老shi学习笔记--MAAB建模规范之Simulink二申老shi学习笔记--MAAB建模规范之Simulink三申老shi学习笔记--MAAB建模规范之Simulink四申老shi学习笔记--MAAB建模规范之Signals一申老shi学习笔记--MAAB建模规范之Block Usage一申老shi学习笔记--MAAB建模规范之Block Usage二申老shi学习笔记--MAAB建模规范之Block Parameters一申老shi学习笔记--MAAB建模规范之Simulink Patterns一申老shi学习笔记--MAAB建模规范之Simulink Patterns二