如何解决 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 相关的错误:
increment/decrement 操作与其他具有副作用的操作相结合 [MISRA 2012 Rule 13.3, advisory]buf[count++] = U1RXREG;
双方都有副作用[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;
}
}
- 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;
之类的错误
- 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;
就机器代码和程序行为而言,这等同于原始代码。
我有 C 源代码,我正在使其符合 MISRA 标准。我收到以下与 MISRA 2012 规则 13.3 和 13.2 相关的错误:
increment/decrement 操作与其他具有副作用的操作相结合 [MISRA 2012 Rule 13.3, advisory]buf[count++] = U1RXREG;
双方都有副作用[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;
}
}
- 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;
- 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;
就机器代码和程序行为而言,这等同于原始代码。