首页 > 解决方案 > Misra 警告 C 代码 - if 循环中布尔值和无符号值的比较

问题描述

在下面的 C 代码中,在检查 if 条件时,我收到 Misra 警告

The operand of the opeartor '=='do not have same essential type category: one is 'Boolean' and other is 'unsigned'

在头文件中file1.h

#define timer_4sec       (uint8)160
#define bool_rolltime    (roll_time_count < timer_4sec)

在源文件中,file1.c

static uint8 roll_time_count = timer_4sec

void function()
{
  if(bool_rolltime == True)
  {
     printf("rolling ..\n");
  }
}
void function2()
{
    //update the roll_time_count status , increment and decrement static timer variable.
}

问题就在这里if(bool_rolltime == True)。我已经理解roll_time_count并且timer_4secuint8变量。所以我试图像这样修复这个警告

#define bool_rolltime    (bool)(roll_time_count < timer_4sec)

此代码是否是避免 Misra 错误的正确方法?如果不是,请建议如何避免此类警告?

标签: cif-statementbooleanmisra

解决方案


这基本上与您昨天提出的问题相同。正如我当时回答的那样,您需要告诉您的静态分析器哪些类型是布尔值。比如和。bool_ 为什么你使用一些自制的标准,我不知道,但你注意到这不是一个好主意。同样,放弃自制并使用标准 C 。falsetrueTrueuint8uint8_t

此外,由于隐藏了简单表达式的臭宏,您会违反 MISRA。这是明显的不好的做法,MISRA 或没有 MISRA。你不应该发明一些神秘的宏语言。保持简单易读:

#define timer_4sec       160u // no need for cast but you need the u suffix for MISRA-C

static uint8_t roll_time_count = timer_4sec;

void function (void) // empty parenthesis is obsolete C, write (void)
{
  if(roll_time_count < timer_4sec)
  {
     printf("rolling ..\n");
  }
}

现在我们使代码保持简单易读,它也自动符合 MISRA-C。的两个操作数<都属于相同的“无符号”基本类型类别,这要归功于“u”后缀。

同样,就像我昨天已经回答的那样,您需要研究 MISRA-C 指南中基本类型的规则,否则您将无法理解该工具不断告诉您的内容。


推荐阅读