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/