关于语句操作的 Misra 违规 10.1 (MISRA C 2012)

Misra Violation 10.1 regarding statement operations (MISRA C 2012)

我需要一段代码方面的帮助。 我有一个数组,我们称它为数组[4]。 现在我想检查这个数组中至少有 3 个元素高于阈值。 (if 语句)

例如

if(2 > ((array[0] > threshold) + (array[1] > threshold) + (array[2] > threshold) + (array[3] > threshold) ))

米斯拉在这里抱怨。 (规则 10.1 不允许的操作数运算符“+”) 有没有另一种方法可以在不检查所有可能的排列的情况下编写此 if 语句?

干杯

将那些讨厌的不可加的布尔值显式转换为整数 1/0 怎么样?:

if(2 > ((array[0] > threshold?1:0) + (array[1] > threshold?1:0) + (array[2] > threshold?1:0) + (array[3] > threshold?1:0) ))

如何将单行文件解包,可能是一个循环?它也可以更具可读性:

int check = 0;
for (int i = 0; i<4; i++) {
  if (array[i] > threshold) {check++;}
}
if (check >= 3) ...

您的 if 语句实际上似乎是在测试“至少 3 个更高”与 if (2 > ...)(至多一个?)的对比。

这个问题的核心是一个误解......布尔值 true 的值为 1false 的值为 0 - 而你可以将三个布尔值加在一起。

布尔值是 truefalse

从数学上讲,+ 运算符对布尔值毫无意义:这就是此特定 MISRA 规则的基本原理(另请参阅解释 基本类型 的附录) ...布尔值的 C 实现如此糟糕,这无济于事。

其他答案提供了替代方案。但是有一个请求,请不要再使用 yoda 条件语句了,尤其是当你似乎用错误的方式来解释它时...... if ( 2 > ... ) 甚至不是你的错误条件,它需要是 if ( 2 < ... )

MISRA 警告是因为您试图对“本质上是布尔值”的类型进行算术运算,这是荒谬的。

但这还不是你的问题,这行代码写得非常糟糕,以至于有人会怀疑是故意混淆的。它不会“检查该数组的至少 3 个元素是否高于阈值”。无法挽回了。

重写此代码的一种方法是(符合 MISRA-C:2012):

uint32_t above_count=0;
for(size_t i=0; i<N; i++) // where N is some named variable for the amount of items / array size etc
{
  if(array[i] > threshold)
  {
    above_count++;
  }
}

if(above_count >= 3) // "check that at least 3 elements of this array are taller than a threshold"
{
  ...
}