[英]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没有意义, C是C (不是bash或true可能为0的任何值),并且true始终为1,因此除非您对编程语言中的bool值一无所知,否则将其定义为表达式是没有用的。
我认为对于我的海豚来说,最好的解决方案是将宏重新定义为:
#define TRUE (1U)
#define FALSE (0U)
我已经看到AUTOSAR堆栈为我提供了在集成文件中重新定义此值的选项
这样,我就可以与我所有的应用程序代码和现有的AUTOSA堆栈保持兼容,并且我不需要在继承的代码中进行任何更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.