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挥发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的演变

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还建议软件开发人员一旦编写完代码,就检查代码的遵从性之前,代码评审或者单元测试。在开发生命周期的早期解决违规问题比推迟到后面的阶段要便宜得多,效率也高得多。

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

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

为了帮助用户进一步实现MISRA C遵从性,MathWorks维护了一个可行性分析包,并建议在使用嵌入式Coder与Simulink和Stateflow模型时生成MISRA C代码。MISRA C分析包包括:

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

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

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

Baidu
map