繁体   English   中英

违反MISRA规则10.4

[英]MISRA Rule 10.4 Violation

我收到下一个MISRA错误:Rule-10.4此相等运算符的操作数是不同“基本类型”类别(布尔值和无符号)的表达式。 代码如下所示:


#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:“控制表达式不是'本质上是布尔'表达式”

所以我不知道解决方案,

我看到使用

#define TRUE 1U
#define FALSE 0U

解决了问题,但是我担心我负担不起,因为我正在使用(1!= 0)表达式使用来自第三方的大型继承代码。 我猜该表达式更“智能”且可移植,因为在某些系统中TRUE / FALSE的含义可能会变为0/1,但我想知道是否可以保留:

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

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

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

如果您被C90所困, 只有这样 :您需要以某种方式告知您的工具所使用的自定义布尔类型。 否则,它将无法分辨出这些宏的用途。

否则,只需使用stdbool.h 2019年几乎没有任何借口。

感谢所有的答案和评论。

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

我宁愿不要欺骗MISRA工具来指示布尔类型,我认为这将是我们必须导出到团队中任何PC的东西(临时解决方案)

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

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

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

我已经看到AUTOSAR堆栈为我提供了在集成文件中重新定义此值的选项

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM