MISRA C可用于提高软件质量考虑

嵌入式技术

1368人已加入

描述

  MISRA 简史

  协作 MISRA 项目是在 1990 年代初构思的,旨在为在道路车辆电子系统中创建嵌入式软件制定指南。1994 年 11 月,发布了基于车辆的软件的开发指南。

  合作继续进行,并于 1998 年 4 月出版了 MISRA C 的第一版。

  最初,MISRA C 仅针对汽车行业。然而,很快就认识到它的适用性要广泛得多……这可以通过第二版的名称更改来体现。

  1998 年 4 月 第1版《基于车辆的软件中使用 C 语言的指南》

  2004 年 10 月 第2版C 语言在关键系统中的使用指南

  第 3版 2013 年 3 月 C语言在关键系统中的使用指南

  现在,在其第 3版中,MISRA C 已成为大多数安全相关行业中嵌入式 C 编程的事实标准,在这些行业中,安全性至关重要,并且即使在安全性或安全性不是主要的情况下,也用于提高软件质量考虑。

  MISRA C 的背景

  C 语言定义

  虽然非常流行,但 C 语言有几个缺点。特别是,语言定义(ISO 标准)并未完全指定语言,而是将某些方面置于编译器实现的控制之下。这是有意的,部分原因是希望支持许多针对不同目标处理器的预先存在的实现。

  因此,该语言的某些领域:

  行为未定义——即标准没有强加任何要求

  行为是未指定的 - 即标准允许两种或多种可能性,并且在任何情况下都没有对选择的进一步要求

  实现可以自由选择自己的行为,前提是已记录在案

  依赖于未定义或未指定行为的程序不能保证以可预测的方式运行;同样,依赖于实现定义行为的程序可能难以移植到不同的目标。

  语言滥用

  虽然 C 程序可以以结构化和易于理解的方式进行布局,但 C 使程序员可以轻松编写难以理解的晦涩代码。

  运算符的规范使得编译器难以检测到编程错误。例如,以下两段代码都是完全合法的,因此编译器不可能知道其中一个是否被错误地用来代替另一个:

  if ( a == b ) /* 测试 a 和 b 是否相等 */

  if ( a = b ) /* 将 b 赋值给 a,然后测试 a 是否非零 */

  语言误解

  程序员通常会误解该语言的某些领域。例如,C 比其他一些语言有更多的运算符,因此有大量不同的运算符优先级,其中一些不直观。

  C 提供的类型规则也会让熟悉强类型语言的程序员感到困惑。例如,操作数可能被“提升”为更广泛的类型,这意味着操作产生的类型不一定与操作数的类型相同。

  例如:

  uint8_t c = 0x82;

  签名 int d;

  d = c 《《 1; // UINT8 上的 《《 运算符返回 SIGNED INT

  运行时错误检查

  C 程序可以编译成小而高效的机器代码,但代价是运行时检查的程度非常有限。C 程序通常不为常见问题提供运行时检查,例如算术异常(例如被零除)、溢出、指针有效性或数组绑定错误。

  C 哲学是程序员负责进行此类检查……

  那么,什么是 MISRA C?

  考虑到所有这些,MISRA C 指南定义了一个可预测的 C 语言子集,其中消除或减少了出错的机会。

  除了定义这个子集之外,这些 MISRA C 指南还提供:

  开发 C 程序的教育材料

  工具开发人员参考资料

  这些指南中的建议,当在文档化的软件开发过程中使用时,解决了 C 语言的许多缺点,而与开发代码的最终用途无关。

  通过定义 C 语言的可预测子集并为开发人员提供指导,MISRA C 为嵌入式控制系统和独立软件的安全应用提供了最佳实践指南。

  审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分