在此规则中,您必须转到ISO / IEC 9899:1990附录G并研究实施定义行为的每个案例以记录它们。
确定代码中要执行的手动检查是一项艰巨的任务。
由于这条规则,是否有某种手动检查清单?
答案 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"表达式,隐式提升整数等等。register
关键字(如果使用这些)。#include
路径,以防它们模糊不清。特别是如果它们是绝对的而不是相对的。