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

问题描述

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

例如

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

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

干杯

解决方法

如何拆开单衬,可能是一个循环?它也可能更具可读性:

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

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

,

这个问题的核心是一个误解......布尔值 1 的值为 false0true - 您可以添加三个布尔值在一起。

布尔值要么是 false,要么是 +

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

其他答案提供了替代方案。但是一个请求,请不要使用尤达条件句,尤其是当您的解释似乎以错误的方式进行时...... if ( 2 < ... ) 甚至不是您的错误条件,它需要是 AVG()>

,

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"
{
  ...
}
,

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

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