2004年misra c规则3.1所涵盖的问题"记录了实施定义的行为"

时间:2015-09-07 10:56:50

标签: c iso misra

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

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

由于这条规则,是否有某种手动检查清单?

2 个答案:

答案 0 :(得分:2)

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特别关注的实现定义行为的指南重叠。

答案 1 :(得分:2)

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

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

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

  • 所有整数类型的大小。 int的大小是最重要的,因为它决定了赋予整数文字的类型,C" boolean"表达式,隐式提升整数等等。
  • 模糊的整数格式,不是标准的补码。
  • 依赖于endianess。
  • 枚举类型格式。
  • 浮点格式。
  • 指向整数转换的指针,以防它们在给定系统上模糊不清。
  • 函数内联的行为和register关键字(如果使用这些)。
  • 对齐问题,包括struct padding。依赖于struct / union的大小。
  • #include路径,以防它们模糊不清。特别是如果它们是绝对的而不是相对的。
  • 按位运算符与签名类型混合(在大多数情况下,这是错误或设计错误)。