违反 MISRA 规则 10.4

MISRA Rule 10.4 Violation

我收到下一个 MISRA 错误: 规则 10.4 此相等运算符的操作数是不同 'essential type' 类别(布尔和无符号)的表达式。 代码如下:


#define TRUE (1!=0)
#define FALSE (0!=0)
typedef unsigned char   boolean;


boolean active;
getActive(&active);

if (TRUE == active)  <<<<<<<<<<<< HEre is the conflicting line
{

// DO Something
}

如果我删除 TRUE :


if (active)

MISTA 规则 14.4 出现:"Controlling expression is not an 'essentially Boolean' expression"

所以我想不出解决办法,

我看到使用

#define TRUE 1U
#define FALSE 0U

解决了问题,但恐怕我负担不起这个解决方案,因为我使用的是使用 (1!=0) 表达式从第 3 方继承的大量代码。 我想这个表达式更 'smart' 并且可移植,因为在某些系统中,真/假的含义可能会变成 0/1 但我想知道我是否可以保留:

#define TRUE (1!=0)
#define FALSE (0!=0)

并以应对 MISRA 问题的方式编写我的条件表达式

您的 MISRA 检查器无法确定这些是您的布尔类型。

万一您受困于 C90 并且仅在那时:您需要以某种方式告知您的工具您正在使用哪种自定义 bool 类型。否则它无法分辨这些宏是干什么用的。

否则,只需使用stdbool.h。 2019 年几乎没有理由不这样做。

感谢大家的回答和评论。

不幸的是,我不允许使用 stdbool.h ,我使用的是 AUTOSAR(汽车)堆栈,他们不使用任何标准库。

我不想欺骗 MISRA 工具来指示布尔类型,我认为我们必须将其导出到团队的任何 PC(临时解决方案)

感谢@R 关于 (1 != 0) 的澄清;这是没有意义的,CC(不是 bash 或任何可能为 0 的地方),并且 true 将始终为 1,因此除非您不了解编程语言中的 bool 值,否则作为表达式的定义是无用的。

我认为对于我的海豚来说,最好的解决方案是将宏重新定义为:

#define TRUE (1U)
#define FALSE (0U)

我看到 AUTOSAR 堆栈让我可以选择在 Integration 文件

中重新定义这些值

这样我就可以保持与所有应用程序代码和现有 AUTOSA 堆栈的兼容性,而且我不需要更改继承代码中的任何内容。