使用 && 和 || 时违反 MISRA 12.5 在 if 语句中

Sim*_*kel 7 c boolean-logic if-statement misra

我正在开发一个应用 MISRA 2004 的项目。

对于大多数违规行为,我都找到了原因,但有一个我不明白:

它在 if 语句中带有&&||操作。

例子:

uint8 getValue()
{
   // Some algorithm, simplified with return 1
   uint8 someValue = 1u;
   return someValue;
}
int main(int argc, char *argv[]) {
    uint8 currentState = 0u;
    uint8 var_a = getValue();
    uint8 var_b = getValue();
    uint8 var_c = getValue();
    uint8 var_d = getValue();

    const uint8 const_a = 1u;
    const uint8 const_b = 2u;
    const uint8 const_c1 = 3u;
    const uint8 const_c2 = 30u;
    const uint8 const_d = 4u;

    if ((var_a == const_a) && (var_b == const_b) && ((var_c == const_c1) || (var_c == const_c2)) && (var_d == const_d))
    {
        currentState = 1;
    } else 
    {
        currentState = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

这使我两次违反 MISRA 规则 12.5 与逻辑运算符一起使用的非主表达式。两者都符合 IF 语句

我不认为这个 if 语句有什么问题,尽管它有点长。

有谁知道这里出了什么问题以及如何解决该违规问题?

编辑:我对示例进行了一些调整。我还注意到,如果将 if 语句简化为:

if ((var_a == const_a) && ((var_c == const_c1) || (var_c == const_c2)) && (var_d == const_d))
Run Code Online (Sandbox Code Playgroud)

如果更改为:则不违反规定:

if ((var_a == const_a) && ((var_c == const_c1) || (var_c == const_c2)))
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 6

这似乎是静态分析仪的误报。您的代码是合规的。

MISRA C:2004 12.5(以及 2012 版本中的等效规则)的基本原理是避免运算符优先级可能不明显的情况。总的来说,MISRA 坚持认为涉及二元运算符的子表达式(“复杂表达式”)应始终带有括号。

特别是布尔值&&||运算符的情况下,规则 12.5 允许在同一表达式中链接多个它们,但不能在不带括号的同一表达式中混合&&和,因为它们具有不同的优先级。||

如果你&& (var_c == const_c1) || (var_c == const_c2) &&这样写的话,代码将是不合格的。然而你没有,而且你也在内部子表达式周围加上了括号。