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

raj*_*123 3 c embedded misra

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

  1. 增量/减量运算与其他具有副作用的运算[MISRA 2012 Rule 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;
    }
}
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)

Lun*_*din 5

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

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

buf[count] = U1RXREG;
count++;
Run Code Online (Sandbox Code Playgroud)

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

  1. 双方都有副作用[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)

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