什么是MISRA C?

安全、可靠的嵌入式软件编码标准

MISRA C和MISRA c++标准是针对C和c++编程语言的一套编码指南,它们促进了嵌入式系统软件的安全性、安全性和可靠性。这些指南是由汽车工业软件可靠性协会(MISRA)发布的,该协会是汽车制造商、零部件供应商和工程咨询公司之间的合作组织。MISRA C准则最初只针对汽车行业,现在已被广泛接受并应用于其他行业,如航空航天和国防、工业自动化和医疗设备。

大多数工程组织最初将MISRA C和c++标准应用到他们手写的C和c++代码中。MISRA标准已经经过了改进,以适应从MATLAB等工具生成的代码的使用®和仿真软件®

为什么MISRA C对嵌入式系统很重要?

C编程语言是嵌入式系统中最流行的语言之一,因为它具有内在的功能,例如性能、跨硬件的可移植性和对内存的直接控制。然而,某些C语言结构可能导致编程错误、未定义的行为或实现定义的行为。

MISRA C指南定义了C语言的“安全子集”,以防止可能危及嵌入式系统安全和安全性的语言方面。

例如,C99允许使用初始化器列表,其中的表达式只能在运行时求值。但是,没有定义计算列表元素的顺序。举个简单的例子:

1 int x = 0;2 int y = 1;3 volatile int v;4 5 void func() {6 int arr[2] = {x+y, x-y};7 int arr2[2] = {x++, x+y};8 int arr3[2] = {v, v};9}

在第7行和第8行,列表的一个元素修改了另一个元素中使用的变量的值。计算顺序的模糊性可能导致意外值。例如,arr2[]可以用\(\{1,1\}\)或\(\{1,2\}\)初始化,这取决于计算x++的顺序。因此,MISRA C:2012规则13.1规定,在初始化列表中出现的表达式不能修改这些表达式中使用的变量。

MISRA C .的演变

MISRA C第一版于1998年出版。此后MISRA又出版了两个版本,MISRA C:2004和MISRA C:2012,以及MISRA C:2012的两个修订版。随着每一份出版物的发布,MISRA都增加了新的指导方针,并就如何实现MISRA C的符合性提供了更多的指导。

MISRA的历史

MISRA C:2012也有以下补充:

  • MISRA C:2012 -附录1显示了MISRA C:2004和MISRA C:2012之间的双向规则映射关系。
  • MISRA C:2012 -附录2将MISRA C:2012映射到ISO/IEC TS 17961:2013“C安全”规则。
  • MISRA C:2012 -附录3地图MISRA C:2012到CERT C规则。

解决越来越多的建模和自动代码生成工具的使用,例如动态仿真模块Stateflow®,嵌入式编码器®, MISRA在2007年11月发布了MISRA AC AGC。本文档包含如何在代码生成工具中应用MISRA-C:2004规则的指导。该指南最近被纳入MISRA C:2012。

如何确保符合MISRA C:2012?

MISRA C:2012指南是作为规则或指示编写的。指南被标记为:

  • 规则是否可以利用所提供的信息明确地检查源代码的遵从性。如果一条规则可以是决定性的,它就被进一步归类为可决定的验证使用静态代码分析等工具Polyspace®.例如,MISRA C:2012规则11.1(“不能在指向函数的指针和任何其他类型的指针之间执行转换”)是一个可判定规则。
  • 指令如果所提供的信息是开放的解释或与软件开发过程有关。例如,MISRA C:2012 Dir 1.1(“程序输出所依赖的任何实现定义的行为都应该被记录和理解”)就是一个指令。

每个指导原则还被标记为咨询的、必需的或强制性的。为了确保符合MISRA C:2012,项目源代码必须满足:

  • 所有强制性的准则
  • 所有规定的准则,除非有正式偏差
  • 切实可行的咨询指南

MISRA通过MISRA符合性:2016和MISRA符合性:2020等出版物提供了额外的符合性指导。

MISRA C:2012采用的一些重要考虑因素是什么?

在软件开发过程中集成MISRA C

MISRA建议将MISRA C指南集成到项目的软件开发过程中。MISRA C没有定义软件开发过程,但建议使用可以在功能安全标准中找到的过程,如ISO 26262、DO 178C、IEC 62304和IEC 61508。

生成合规矩阵

每个项目都应该创建一个法规遵循矩阵,记录所有的指导方针和相应的实施方法。对于不能使用诸如静态代码分析器之类的工具完全执行的指导方针,需要手动检查。

文档的偏差

MISRA允许在指导方针可能不切实际或不合理的情况下偏离指导方针。所有此类偏差都必须记录在案并得到批准。文档应该包括指导方针、情况、偏差的理由和风险分析。

使用生成的代码

代码生成简化了MISRA C遵循过程。自动代码生成器列出了生成的代码不会违反的准则。为了生成符合misra的代码,工程师必须使用适当的建模模式和代码生成选项。MISRA C:2012提供了关于哪些规则不太适用于生成的代码的指导。例如,关注可读性的规则就不那么重要了,因为生成的代码不应该被人修改。

使用手写代码

MISRA C规则可以手动检查,但是查看数十万甚至数百万行代码是否违反规则是不实际的。因此,MISRA C推荐使用静态代码分析确保遵从性的工具。MISRA C还建议软件开发人员一旦编写完代码,就检查是否符合规定之前,代码评审或单元测试。在开发生命周期的早期处理违规要比推迟到后期处理成本低得多,效率也高得多。

用于开发MISRA C兼容应2022世界杯八强谁会赢?用程序的主要MathWorks产品

Simulink, Stateflow, Simulink Check™和Embedded Coder被广泛用于生成符合MISRA C和MISRA-C++的嵌入式软件。工程师可以通过遵循建模指南、代码生成目标和代码生成顾问检查来实现与MISRA C:2012和MISRA c++指南的符合性。

为了帮助用户进一步努力实现MISRA C的符合性,MathWorks维护了一个可行性分析包和建议,用于在使用Simulink和Stateflow模型的Embedded Coder时生成MISRA C代码。MISRA C分析包包括:

  • 带有规则摘要和详细示例的文档
  • 仿真软件模型

Polyspace®代码验证产品用于分析手写的或生成的符2022世界杯八强谁会赢?合MISRA C的代码。Polyspace错误发现者™支持MISRA-C:2004、MISRA C:2012、MISRA AC AGC、MISRA-C++:2008、AUTOSAR c++ 14编码规则检测。该工具可用于检查生成的代码,并获得代码确实符合MISRA c的独立确认。工程师还可以将Polyspace的结果追溯到模型,并在模型级别注释以证明偏差。

7种方法使嵌入式软件安全和安全

Baidu
map