c - 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_4sec
是uint8
变量。所以我试图像这样修复这个警告
#define bool_rolltime (bool)(roll_time_count < timer_4sec)
此代码是否是避免 Misra 错误的正确方法?如果不是,请建议如何避免此类警告?
解决方案
这基本上与您昨天提出的问题相同。正如我当时回答的那样,您需要告诉您的静态分析器哪些类型是布尔值。比如和。bool
_ 为什么你使用一些自制的标准,我不知道,但你注意到这不是一个好主意。同样,放弃自制并使用标准 C 。false
true
True
uint8
uint8_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 指南中基本类型的规则,否则您将无法理解该工具不断告诉您的内容。
推荐阅读
- javascript - 使用 MyQttHub 将 Reactjs 项目连接到 mqtt
- php - 语法错误,Laravel 更新后出现意外的 ')'
- react-native - React Native - zIndex
- rust - 使用模块化位域从 Rust 中的枚举列表创建位域
- python - 将数据帧传递给 keras 顺序模型
- linux - 新用户的电子邮件会进入 gmail 垃圾邮件,而老用户不会
- c - 在 bst 中查找所有非终端节点的总和
- python - 使用 matplotlib 为子图设置相同的比例但不同的限制
- ruby-on-rails - 重写设计注册控制器以进行重定向
- docker - 来自现有容器的 Docker 卷