我的CCS 6.1 ARM编译器(用于LM3Sxxxx Stellaris)发出警告:
“MISRA规则12.2。在标准允许的任何评估顺序下,表达的价值应相同”
用于以下代码:
typedef struct { ... uint32_t bufferCnt; uint8_t buffer[100]; ... } DIAG_INTERFACE_T; static DIAG_INTERFACE_T diagInterfaces[1]; ... DIAG_INTERFACE_T * diag = &diagInterfaces[0]; uint8_t data = 0; diag->bufferCnt = 0; diag->buffer[diag->bufferCnt++] = data; // line where warning is issued ...
我的代码中没有发现问题。 这是误报还是我的错误?
虽然你没有说明,但这是MISRA-C:2004,规则12.2,现在是MISRA-C:2012规则13.2。 正如oauh所说,这与“评估顺序”无关。
我强烈建议您参考MISRA-C:2012,即使您需要符合MISRA-C:2004标准,MISRA-C:2012也有帮助,因为它已经阐明了许多指导原则,包括其他基本原理,解释和示例。
您不应该使用编译器来单独检查MISRA-C合规性,这很好,但编译器#1的目标不是要警告您关于它所使用的语言的所有陷阱和陷阱(优化)。 它们也不是很精确,就像在这种情况下一样。 此外,翻译单元中存在许多未定义的行为,编译器无法警告。 最好还使用专用的MISRA静态分析工具,该工具不是特定于编译器的,但是从ISO C标准的角度来看警告所有不可预测的构造,而不是特定的实现。
正如oauh所说,这违反了MISRA-C:规则12.13,现在是MISRA-C:2012规则13.3,放宽了允许++和 – 与其他运营商混合,前提是++或 – 是副作用的唯一来源(在您的情况下,赋值也是C术语中的副作用)。
规则并不重要,即其定义明确的行为,但前缀版本和后缀版本产生的不同值可能会引起混淆,因此它是“建议性”意味着不需要正式偏差(同样,一个体面的MISRA-C工具会允许你压制这种特殊的违规行为)。
将diag->bufferCnt++
放在一个单独的语句中(因为Hans在OP注释中也建议这样做)并且不应出现警告。
但是对于MISRA规则12.2,我认为你的程序中没有违反12.2(你的语句中有一个序列点,没有未指定的行为),我认为这是你的MISRA软件中的一个错误。
有关信息,MISRA中还有一条咨询12.13规则:
(MISRA-C:2004,12.13)“增量(++)和减量( – )运算符不应与表达式中的其他运算符混合”
MISRA的问题是他们的术语使用远非完美,对于12.3,而->
或=
是C算子,在解释中他们似乎只谈论算术运算符……
以上就是c/c++开发分享Misra C规则12.2 – 误报警告?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/523311.html