我有C源代码,并且使它符合MISRA。我收到与MISRA 2012规则13.3和13.2有关的以下错误:
增/减运算与其他有副作用的运算结合起来[MISRA 2012规则13.3,咨询] buf [count ++] = U1RXREG;
双方都有副作用[MISRA 2012规则1.3,必填],[MISRA 2012规则13.2,必填] buf [count] = U1RXREG;
问题1的源代码
void UART_call(void)
{
if(count < BUF_SIZE)
{
buf[count++] = U1RXREG;
Flag = 1;
}
else
{
count = 0;
Flag = 0;
}
}
从问题1代码解决了13.3错误之后,我遇到了MISRA 1.3和13.2错误。问题2的源代码:
void UART_call(void)
{
if(count < BUF_SIZE)
{
buf[count] = U1RXREG;
count = count + 1U;
Flag = 1;
}
else
{
count = 0;
Flag = 0;
}
}
答案 0 :(得分:4)
- 增加/减少操作与其他具有副作用的操作[MISRA 2012 Rule 13.3,咨询] buf [count ++] = U1RXREG;
正如您似乎已经注意到的那样,通过将增量移出赋值表达式来解决:
buf[count] = U1RXREG;
count++;
其基本原理是防止编写诸如buf[count++] = count;
- 双方都有副作用[MISRA 2012规则1.3,必需],[MISRA 2012规则13.2,必需] buf [count] = U1RXREG;
我会说这是一个误报。 buf[count] = U1RXREG;
行是无害的。
发出警告的原因是U1RXREG
显然是UART硬件的易失性合格rx寄存器,而MISRA-C不喜欢将易失性访问与同一表达式中的其他内容混合使用,特别是另一个“副作用”,在这种情况下,计数为++
以及对buf
的赋值。这是来自静态分析器的误报的常见来源,尽管有时他们确实会发现与此相关的真正错误,例如在您询问yesterday的&&
案例中。
假设使用32位寄存器,则修复该问题的方法是使用临时变量:
uint32_t rxreg = U1RXREG
buf[count] = rxreg;
就机器代码和程序行为而言,这等效于原始代码。