嵌入式技术
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 为嵌入式控制系统和独立软件的安全应用提供了最佳实践指南。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !