繁体   English   中英

MISRA C:2012规则14.4

[英]MISRA C:2012 Rule 14.4

根据MISRA规则if语句的控制表达式和迭代语句的控制表达式应基本上具有布尔类型

#include <stdbool.h>
#include <stdlib.h>

void foo(void){
    int i = 0;

    if(i){}              /* Non-compliant - int32_t is not boolean */

    if(i != 0){}         /* Compliant */

}

我无法理解如何仅使用该值导致问题。为什么如果仅添加布尔表达式被视为良好实践。 任何见解都会有所帮助

理由提供了以下规则:强类型。 控制表达式应该基本上是布尔类型。 等于,关系等运算符的结果被视为基本上是布尔值,而在没有运算符的int或指针中显示表达式是使用的类型。

(作为旁注,这对于与C ++的兼容性很重要,其中许多运算符实际上返回一个bool ,并且可能会因为返回booloperator函数而过载。)

然而,主要原因不是MISRA提供的,那就是自我记录的代码。 if(ptr != NULL)只能将指针与NULL进行比较。 没有误解的余地。 if(ptr)可以是与NULL的比较,也可能是手指的意外滑动,程序员实际上是指if(*ptr) 此外,如果指针有一些神秘的名称, if(xyz)并不明显,但显然if(xyz != NULL)是什么。

此规则还可以防止错误,例如if(func) if(func())意图。 请记住,为了静态分析器的利益,许多MISRA规则都存在。


关于强类型,请考虑以下示例:

#include <stdio.h>
#include <stdbool.h>

int main (void)
{
  int x = false;
  x = ~x;

  if(x)
  {
    puts("x is true");
    if(x!=true)
    {
      puts("but x is not true\n");
    }
  }

  bool y = x;

  if(y)
  {
    puts("y is true");
    if(y==true)
    {
      puts("I swear, y is really true");
    }
  }
}

输出:

x is true
but x is not true

y is true
I swear, y is really true

为什么只添加一个布尔表达式被视为良好的做法?

“MISRA-C引入了一个强大的打字模型,以帮助用户避免在C类型模型中出现的意外问题。该规则可以防止在意图使用布尔表达式时意外使用整数表达式。”MISRA论坛中所述,“作为”官方“MISRA C WG回答

如何在if语句中使用整数会导致问题?

我无法想到,但在项目中强制执行一致的代码风格和哲学也很重要。

我想不出一个特别的原因。

我正在考虑类型转换的行,例如,使用double d事情可能会出错,但double将被评估为/不是0.0,因此仍然是if或iteration语句的有效表达式。 或指向字符(字符串)的指针,但它也会产生有效的表达式。

所以我能想出的唯一原因是它现在很清楚它是一个布尔表达式,即更好的可读性。

例如,如果MISRA也会检查适当的第二个操作数,那将是一件好事

char *s;
if (s != NULL && *s != '\0')

也可以写成:

if (s != 0 && *s != 0)

而对于双d

if (d != 0.0)

另一个可能的原因可能是识别这样的潜在错误:

#include <stdbool.h>
#include <stdlib.h>

void foo(void){
    int i = 0;

    if(i){}              /* Non-compliant - int32_t is not boolean */

    if(i |= 0){}         /* Non-compliant - type is still int32_t */

} 

或者更明显

#include <stdbool.h>
#include <stdlib.h>

void foo(void){
    int i = 0;

    if(i){}              /* Non-compliant - int32_t is not boolean */

    if(i = 0){}         /* Non-compliant */

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM