c - 如何使我的代码符合 MISRA 2012 规则 10.4

标签 c misra

    if(fn1())   //Line 1
     {
     a++;
     }

这里函数fn1的返回类型是uint8_t。该函数仅返回值 0 或 1。

PC Lint 在第 1 行抛出错误,显示“二元运算符的基本类型类别不匹配”[需要规则 10.4]

规则 10.4 规定“执行通常算术转换的运算符的两个操作数应具有相同的基本类型类别”

最佳答案

MISRA-C 不允许对零进行隐式检查 - 条件语句的所有输入都必须是“本质上是 bool 值”,如果您显式使用 == 等逻辑运算符,就会得到这种结果。

此外,MISRA-C 有各种规则阻止您在同一表达式中混合“本质上有符号”和“本质上无符号”,从而依赖隐式类型提升。因此,由于这个原因,您不能编写 if (fn1() == 1) ,因为 1 是有符号类型,并且还有一条规则要求所有整数常量具有u 后缀。

因此,一种可能的解决方法是if (fn1() == 1u)。但是,由于该函数仅返回 0 或 1,因此您也可以将其结果转换为 bool 类型,这也可以:if ((bool)fn())。不过,最好的解决方案是重写该函数以返回 bool,然后您可以使用 if(fn1())

关于c - 如何使我的代码符合 MISRA 2012 规则 10.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59065730/

相关文章:

c - "allowed"什么时候不释放动态分配的内存?

c - MISRA-2012 违反规则 20.12 : misra_c_2012_rule_20_12_violation: macro parameter "val" is used in both expanded and raw forms

c - 如何在 cppcheck 中向 Misra 检查提供#defines?

c - 如何将 C 代码制作成 MISRA C :2012 compliance?

c++ - 静态函数模板和 MISRA C++

c - MISRA-C 2012 规则 10.8 查询

mysql - 无法连接到现有 MySQL 数据库

c - 使用不同类型的字段填充结构

c - mmap 保护标志对进程间共享的影响

c - Dev-c++编译错误对象