【问题标题】:Misra Violation 10.1 regarding statement operations (MISRA C 2012)关于语句操作的 Misra 违反 10.1 (MISRA C 2012)
【发布时间】:2021-01-08 16:03:54
【问题描述】:

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

例如

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

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

干杯

【问题讨论】:

  • cond ? 1 : 0 将布尔值 cond 转换为 int。
  • if ( 2 > ... ) 将检测到 小于 2 而不是 至少 3 该数组的元素高于阈值。你有你的尤达错误的方式!

标签: c misra


【解决方案1】:

如何打开单衬里的包装,可能是一个循环?它也可能更具可读性:

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

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

【讨论】:

    【解决方案2】:

    这个问题的核心是一个误解......布尔值true 的值是1false0 - 您可以将三个布尔值相加。

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

    在数学上,+ 运算符对布尔值没有意义:这就是这个特定 MISRA 规则的基本原理(另请参阅解释基本类型的附录)......它没有帮助 boolean 的 C 实现如此糟糕。

    其他答案提供了替代方案。但是有一个请求,请不要给我们 yoda 条件句,尤其是当您的解释似乎有错误的方式时...if ( 2 &gt; ... ) 甚至不是您的错误条件,它必须是 if ( 2 &lt; ... )

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 这是个坏主意,因为 ?: 运算符带有原始代码中没有的序列点。你让写得糟糕透顶的代码变得更糟了……因为你强制执行额外的分支,它现在的可读性更差,而且可能更慢。
        猜你喜欢
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        相关资源
        最近更新 更多