gpt4 book ai didi

c - 如何解决 C 代码的 MISRA C :2012 Rule 13. 2 和 13.3?

转载 作者:太空狗 更新时间:2023-10-29 16:10:06 25 4
gpt4 key购买 nike

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

  1. 递增/递减运算结合其他具有副作用的运算 [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 访问和其他东西,特别是没有另一个“副作用”,在这种情况下,计数的 ++ 和对 buf 的赋值。这是静态分析器误报的常见来源,尽管有时他们确实会发现与此相关的真正错误,例如您询问的 && 案例 yesterday .

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

uint32_t rxreg = U1RXREG
buf[count] = rxreg;

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

关于c - 如何解决 C 代码的 MISRA C :2012 Rule 13. 2 和 13.3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54102531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com