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

MISRA Violation 12.5 when using && and || in if-statement

提问人:Simon Garfunkel 提问时间:3/24/2022 最后编辑:Simon Garfunkel 更新时间:3/24/2022 访问量:707

问:

我正在做一个项目,我们正在应用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;
    }
}

这给了我两倍的 MISRA 违反规则 12.5 与逻辑运算符一起使用的非主要表达式。两者都符合 IF-Statement

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

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

编辑: 我稍微调整了一下这个例子。 我还注意到,如果我将 if 语句简化为:

if ((var_a == const_a) && ((var_c == const_c1) || (var_c == const_c2)) && (var_d == const_d))

如果它更改为:

if ((var_a == const_a) && ((var_c == const_c1) || (var_c == const_c2)))
c if 语句 布尔逻辑 misra

评论

2赞 Jabberwocky 3/24/2022
到底是什么,在你的情况下?var_Xconst_X
0赞 Ulrich Eckhardt 3/24/2022
我想知道其中哪一个被认为是“非主要的”。我的猜测是两个或的表达式。
1赞 Simon Garfunkel 3/24/2022
@Jabberwocky:它们都是uint8
2赞 Ulrich Eckhardt 3/24/2022
然后我会支持伦丁的回答,这是一个误报。但是,以上显然不是您的实际代码(我希望),所以我想知道您是否尝试过从您的代码中提取一个最小的可重现示例
1赞 Eric Postpischil 3/24/2022
编辑问题以提供最小的可重现示例

答:

6赞 Lundin 3/24/2022 #1

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

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

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

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