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

如何解决MISRA C:2012 C代码规则13.2和13.3?,c,embedded,misra,C,Embedded,Misra,我有C源代码,我正在使它符合MISRA。我发现与MISRA 2012规则13.3和13.2相关的以下错误: 增量/减量操作与具有副作用的其他操作相结合[MISRA 2012规则13.3,建议]buf[count++]=U1RXREG 双方都有副作用[MISRA 2012规则1.3,必需],[MISRA 2012规则13.2,必需]buf[计数]=U1RXREG 问题1的源代码: void UART_call(void) { if(count < BUF_SIZE) {

我有C源代码,我正在使它符合MISRA。我发现与MISRA 2012规则13.3和13.2相关的以下错误:

  • 增量/减量操作与具有副作用的其他操作相结合[MISRA 2012规则13.3,建议]buf[count++]=U1RXREG

  • 双方都有副作用[MISRA 2012规则1.3,必需],[MISRA 2012规则13.2,必需]buf[计数]=U1RXREG

  • 问题1的源代码:

     void UART_call(void)
     {
        if(count < BUF_SIZE)
        {
            buf[count++] = U1RXREG;
            Flag = 1;
        }
        else
        {
            count = 0;
            Flag = 0;
        }
    }
    
    void UART\u调用(void)
    {
    如果(计数
    在解决了问题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;
        }
    }
    
    void UART\u调用(void)
    {
    如果(计数
  • 增量/减量操作与具有副作用的其他操作相结合[MISRA 2012规则13.3,建议]buf[count++]=U1RXREG 正如您所注意到的,通过将递增移出赋值表达式来解决此问题:

    buf[count] = U1RXREG;
    count++;
    
    这背后的基本原理是防止编写错误,例如
    buf[count++]=count

  • 双方都有副作用[MISRA 2012规则1.3,必需],[MISRA 2012规则13.2,必需]buf[计数]=U1RXREG 我认为这是一个假阳性。行
    buf[count]=U1RXREG是无害的

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

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

    uint32_t rxreg = U1RXREG
    buf[count] = rxreg;
    

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

    函数UART\u调用中显示的变量计数是一个全局变量。对计数的任何修改都会产生副作用。MISRA坚持认为这些副作用在安全关键软件中是有害的。如何定义
    buf
    count
    呢?为什么使用全局变量而不是参数?我认为用
    count=count+1U
    取代
    count++
    没有任何意义。谢谢你的帮助。这看起来不像是假的对我来说是积极的
    buf[count++]=count
    具有未定义的行为,因为读取和写入
    count
    时没有插入序列点。但是MISRA 13.3的目的是禁止作者认为可能混淆的定义良好的代码,如<代码> Buf[Cuth++] =不相关的值< /代码>。@ KeththpPsPn,您从哪里得到代码> Buf[Cuth++]=计数< /代码>?这既不在问题中,也不在这个答案中。大多数情况下,13.3是合理的,没有太多合理的理由说明为什么人们会将++与赋值表达式混合使用。@Lundin:不,这不是问题所在。这只是一个未定义行为的例子。IMHO
    buf[count++]=某个值
    可以,但MISRA不同意。@KeithThompson我想重点是(count=0;count)的