如何解决 C 代码的 MISRA C:2012 规则 13.2 和 13.3?

How to resolve MISRA C:2012 Rule 13.2 and 13.3 for C code?

我有 C 源代码,我正在使其符合 MISRA 标准。我收到以下与 MISRA 2012 规则 13.3 和 13.2 相关的错误:

  1. increment/decrement 操作与其他具有副作用的操作相结合 [MISRA 2012 Rule 13.3, advisory]buf[count++] = U1RXREG;

  2. 双方都有副作用[MISRA 2012 Rule 1.3, required], [MISRA 2012 Rule 13.2, required] 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;
    }
}
  1. increment/decrement operation combined with other operation with side-effects [MISRA 2012 Rule 13.3, advisory]buf[count++] = U1RXREG;

正如您似乎已经注意到的那样,通过将增量移出赋值表达式来解决:

buf[count] = U1RXREG;
count++;

这背后的基本原理是防止编写诸如buf[count++] = count;

之类的错误
  1. both sides have side effects [MISRA 2012 Rule 1.3, required], [MISRA 2012 Rule 13.2, required] buf[count] = U1RXREG;

我会说这是误报。 buf[count] = U1RXREG; 行是无害的。

警告的原因是 U1RXREG 显然是 UART 硬件的 volatile-qualified rx 寄存器,MISRA-C 不喜欢在同一表达式中将 volatile 访问与其他内容混合,特别是不与另一个 "side-effect" 一起计数,在本例中 ++ 与对 buf 的赋值一起计数。这是静态分析器误报的常见来源,尽管有时他们确实会发现与此相关的真正错误,例如您询问 .

&& 案例

假设是 32 位寄存器,那么迂腐的修复方法是使用临时变量:

uint32_t rxreg = U1RXREG
buf[count] = rxreg;

就机器代码和程序行为而言,这等同于原始代码。