【发布时间】:2015-09-13 21:40:15
【问题描述】:
我的 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
...
我的代码中没有发现问题。是误报还是我的错误?
【问题讨论】:
-
我认为使用增量\减量运算符的返回值是一个非常糟糕的主意,无论标准对序列点等有何规定。最好将其拆分为单独的行以避免任何歧义并使其对任何人(包括您自己或编译器)都更具可读性。
-
分析器很少聪明到可以完全消除可能的混叠。只需将该增量运算符保留在单独的语句中,它就会停止抱怨。
-
好吧,如果我使用:
diag->buffer[diag->bufferCnt] = data; diag->bufferCnt++;,第一个语句中的警告仍然存在。但是我在下面看到了答案,请在此处查看我的评论。 -
您的分析仪似乎真的很糟糕。提交错误报告。在这种情况下,我认为他们只是列出了错误的错误号。该行违反了 MISRA,但不违反规则 12.2。