我有C源代码,并且使它符合MISRA。我收到与MISRA 2012规则13.3和13.2有关的以下错误:
增量/减量运算与其他具有副作用的运算[MISRA 2012 Rule 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;
}
}
Run Code Online (Sandbox Code Playgroud)
解决了问题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;
}
}
Run Code Online (Sandbox Code Playgroud)
- 增量/减量运算与其他具有副作用的运算[MISRA 2012 Rule 13.3,咨询] buf [count ++] = U1RXREG;
正如您似乎已经注意到的那样,通过将增量移出赋值表达式来解决:
buf[count] = U1RXREG;
count++;
Run Code Online (Sandbox Code Playgroud)
这样做的基本原理是防止编写诸如 buf[count++] = count;
- 双方都有副作用[MISRA 2012规则1.3,必填],[MISRA 2012规则13.2,必填] buf [count] = U1RXREG;
我会说这是一个误报。这条线buf[count] = U1RXREG;是无害的。
警告的原因是,U1RXREG显然是UART硬件的易失性合格rx寄存器,而MISRA-C不喜欢在同一表达式中将易失性访问与其他内容混合在一起,特别是不与其他“副作用”混合使用在这种情况下++,计数与的赋值一起使用buf。它是静态分析器产生误报的常见来源,尽管有时它们确实会发现与此相关的真实错误,例如&&您昨天询问的情况。
假设有32位寄存器,那么修复它的传统方法是使用一个临时变量:
uint32_t rxreg = U1RXREG
buf[count] = rxreg;
Run Code Online (Sandbox Code Playgroud)
就机器代码和程序行为而言,这等效于原始代码。