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

时间:2019-01-09 02:34:49

标签: c embedded misra

我有C源代码,并且使它符合MISRA。我收到与MISRA 2012规则13.3和13.2有关的以下错误:

  1. 增/减运算与其他有副作用的运算结合起来[MISRA 2012规则13.3,咨询] buf [count ++] = U1RXREG;

  2. 双方都有副作用[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;
    }
}

1 个答案:

答案 0 :(得分:4)

  
      
  1. 增加/减少操作与其他具有副作用的操作[MISRA 2012 Rule 13.3,咨询] buf [count ++] = U1RXREG;
  2.   

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

buf[count] = U1RXREG;
count++;

其基本原理是防止编写诸如buf[count++] = count;

之类的错误。
  
      
  1. 双方都有副作用[MISRA 2012规则1.3,必需],[MISRA 2012规则13.2,必需] buf [count] = U1RXREG;
  2.   

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

发出警告的原因是U1RXREG显然是UART硬件的易失性合格rx寄存器,而MISRA-C不喜欢将易失性访问与同一表达式中的其他内容混合使用,特别是另一个“副作用”,在这种情况下,计数为++以及对buf的赋值。这是来自静态分析器的误报的常见来源,尽管有时他们确实会发现与此相关的真正错误,例如在您询问yesterday&&案例中。

假设使用32位寄存器,则修复该问题的方法是使用临时变量:

uint32_t rxreg = U1RXREG
buf[count] = rxreg;

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