misra c 2004 规则 3.1 涵盖的问题 "Implementation-defined behavior documented"

Issues covered by rule 3.1 of misra c 2004 "Implementation-defined behavior documented"

在此规则中,您必须转到 ISO/IEC 9899:1990 附录 G 并研究实施定义的行为的每个案例以记录它们。

确定要在代码中执行哪些手动检查是一项艰巨的任务。

根据这条规则,是否有某种手动检查列表?

MISRA-C 主要关注避免 C 语言中的不可预测行为,那些“陷阱和隐患”(例如未定义和未指定的行为)所有 C 开发人员都应该意识到编译器不会总是警告您.这包括实现定义的行为,其中 C 标准指定某些构造在编译后的行为可能会有所不同。从安全的角度来看,这些往往不太重要,前提是编译器文档按照标准要求描述了其预期行为。

也就是说,对于每个特定的编译器,行为都是明确定义的,但要确保开发人员已经验证了这一点,包括记录语言扩展、编译器(和构建链)中的已知错误和解决方法。

虽然可以完全手动检查 C 代码是否符合 MISRA-C,但不建议这样做。这些指南是在考虑静态分析工具的情况下制定的。并非所有指南都可以通过工具进行全面检查,但是更好的 MISRA-C 工具(在评估时要小心,“好的”工具不多),至少可以帮助它自动识别代码依赖于特定实现的地方行为。这包括规则 3.1 中要求的所有检查,如果工具无法完全检查实现定义的行为,则需要进行人工审查。

此外,如果您要开始一个新的 MISRA-C 项目,我强烈建议您参考 MISRA-C:2012,即使您需要符合 MISRA-C:2004。拥有 MISRA-C:2012 会有所帮助,因为它阐明了许多指南,包括额外的基本原理、解释和示例。该标准(可以在 misra-c.com 获得)列出了 C90 和 C99 实现定义的行为,这些行为被认为有可能导致意外行为。这可能会或可能不会与解决 MISRA-C 特别关注的实现定义行为的指南重叠。

首先,实现定义行为的标准定义是:编译器必须记录的特定行为。因此,只要需要记录如何某个实现定义的行为是如何实现的,您总是可以参考编译器文档。

接下来您要做的就是记录其中代码依赖于实现定义的行为。这最好在源代码注释中完成。

自发地,这里是您需要在代码中寻找的最重要的东西。该列表不包括其他 MISRA 规则已涵盖的情况(例如 char 的签名)。

  • 所有整数类型的大小。 int 的大小是最重要的,因为它决定了整数文字、C "boolean" 表达式、隐式提升的整数等的类型。
  • 不是标准二进制补码的模糊整数格式。
  • 任何对字节顺序的依赖。
  • 枚举类型格式。
  • 浮点格式。
  • 指向整数转换的指针,以防它们在给定系统上模糊不清。
  • 函数内联和 register 关键字的行为,如果使用的话。
  • 对齐问题,包括结构填充。依赖大小一个struct/union.
  • #include 路径,以防它们晦涩难懂。特别是如果它们是绝对的而不是相对的。
  • 按位运算符与有符号类型混合(在大多数情况下,这是错误或设计错误)。