违反 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) 的澄清;这是没有意义的,C 是 C(不是 bash 或任何可能为 0 的地方),并且 true 将始终为 1,因此除非您不了解编程语言中的 bool 值,否则作为表达式的定义是无用的。
我认为对于我的海豚来说,最好的解决方案是将宏重新定义为:
#define TRUE (1U)
#define FALSE (0U)
我看到 AUTOSAR 堆栈让我可以选择在 Integration 文件
中重新定义这些值
这样我就可以保持与所有应用程序代码和现有 AUTOSA 堆栈的兼容性,而且我不需要更改继承代码中的任何内容。
我收到下一个 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) 的澄清;这是没有意义的,C 是 C(不是 bash 或任何可能为 0 的地方),并且 true 将始终为 1,因此除非您不了解编程语言中的 bool 值,否则作为表达式的定义是无用的。
我认为对于我的海豚来说,最好的解决方案是将宏重新定义为:
#define TRUE (1U)
#define FALSE (0U)
我看到 AUTOSAR 堆栈让我可以选择在 Integration 文件
中重新定义这些值这样我就可以保持与所有应用程序代码和现有 AUTOSA 堆栈的兼容性,而且我不需要更改继承代码中的任何内容。