Misra C 规则 12.2 - 误报警告?

Misra C Rule 12.2 - false positive warning?

我的 CCS 6.1 ARM 编译器(适用于 LM3Sxxxx Stellaris)发出警告:

"MISRA Rule 12.2. The value of an expression shall be the same under any order of evaluation that the standard permits"

以下代码:

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
...

我没有发现我的代码有问题。是误报还是我的bug?

diag->bufferCnt++ 放在单独的语句中(正如 Hans 在 OP 评论中所建议的那样)并且不应出现警告。

但关于 MISRA 规则 12.2,我在你的程序中没有发现违反 12.2 的情况(你的语句中有一个序列点,没有未指定的行为),我认为这是你的 MISRA 软件中的一个错误。

有关信息,MISRA 中还有一条建议性 12.13 规则:

(MISRA-C:2004, 12.13) "The increment (++) and decrement (--) operators should not be mixed with other operators in an expression"

MISRA 的问题是他们的术语使用远非完美,对于 12.3,而 ->= 是 C 运算符,在解释中他们似乎只谈论算术运算符。 ..

虽然您没有指明,但这是 MISRA-C:2004 规则 12.2,现在是 MISRA-C:2012 规则 13.2。正如oauh所说,这与“评估顺序”无关。

我强烈建议参考 MISRA-C:2012,即使您需要符合 MISRA-C:2004,了解 MISRA-C:2012 也会有所帮助,因为它阐明了许多指南,包括其他基本原理、解释和示例。

您不应该使用编译器来单独检查 MISRA-C 合规性,这很好,但编译器的第一个目标不是警告您它专用于利用的语言的所有陷阱和隐患(优化)。它们也不是很精确,就像在这种情况下一样。此外,翻译单元中有许多未定义的行为,编译器无法发出警告。最好还使用专用的 MISRA 静态分析工具,该工具不是特定于编译器的,但它会从 ISO C 标准的角度警告所有不可预测的构造,而不是特定的实现。

正如 oauh 所说,这违反了 MISRA-C:Rule 12.13,现在是 MISRA-C:2012 Rule 13.3,它已被放宽以允许 ++ 和 -- 与其他运算符混合,前提是 ++ 或 -- 是唯一的副作用来源(在您的情况下,赋值也是 C 术语中的副作用)。

该规则并不重要,即其定义明确的行为,但前缀版本和后缀版本产生的不同值可能会导致混淆,因此它是“建议”,意味着不需要正式的偏差(同样,一个体面的 MISRA-C 工具可以让您抑制这种特殊的违规行为。