【问题标题】:How to resolve MISRA C:2012 Rule 13.2 and 13.3 for C code?如何解决 C 代码的 MISRA C:2012 规则 13.2 和 13.3?
【发布时间】:2019-01-09 02:34:49
【问题描述】:

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

  1. 递增/递减操作与其他具有副作用的操作相结合 [MISRA 2012 规则 13.3,咨询]buf[count++] = U1RXREG;

  2. 双方都有副作用[MISRA 2012 Rule 1.3, required], [MISRA 2012 Rule 13.2, required] buf[count] = U1RXREG;

问题一的源码:

 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;
    }
}

【问题讨论】:

  • 函数UART_call中显示的变量count是一个全局变量。对 count 的任何修改都会产生副作用。 MISRA 坚持认为这种副作用在安全关键软件中是不好的。
  • buf 和 count 是如何定义的?
  • 你为什么使用全局变量而不是参数?
  • 我认为将count++ 替换为count = count + 1U 没有任何意义。

标签: c embedded misra


【解决方案1】:
  1. 递增/递减操作与其他具有副作用的操作相结合 [MISRA 2012 规则 13.3,建议]buf[count++] = U1RXREG;

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

buf[count] = U1RXREG;
count++;

这样做的基本原理是为了防止编写诸如buf[count++] = count;之类的错误

  1. 双方都有副作用[MISRA 2012 Rule 1.3, required], [MISRA 2012 Rule 13.2, required] buf[count] = U1RXREG;

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

警告的原因是U1RXREG 显然是 UART 硬件的 volatile 限定 rx 寄存器,MISRA-C 不喜欢在同一个表达式中将 volatile 访问与其他东西混合,尤其是不与另一个“副作用”,在本例中是计数的 ++ 以及对 buf 的赋值。这是静态分析器误报的常见来源,尽管有时他们确实会发现与此相关的真正错误,例如在您询问 yesterday 的 &amp;&amp; 案例中。

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

uint32_t rxreg = U1RXREG
buf[count] = rxreg;

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

【讨论】:

  • 感谢您的帮助。
  • 对我来说这看起来不像是误报。 buf[count++] = count 具有未定义的行为,因为 count 在没有中间序列点的情况下被读取和写入。但 MISRA 13.3 旨在禁止作者认为可能令人困惑的定义明确的代码,例如 buf[count++] = unrelated_value。
  • @KeithThompson 你从哪里得到buf[count++] = count?它既不在问题中,也不在这个答案中。大多数时候 13.3 是合理的,没有太多合理的理由可以将 ++ 与赋值表达式混合使用。
  • @Lundin:不,这不是问题所在。这只是未定义行为的一个示例。恕我直言buf[count++] = some_value; 可以,但 MISRA 不同意。
  • @KeithThompson 我认为重点是for(count=0; count&lt;n; count++) { buf[count] = some_value; 是更好的代码。然后还有答案中提到的易失性访问方面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多