[英]Unpermitted operand to operator '|' [MISRA 2012 Rule 10.1, required]
[英]Unpermitted operand to operator '!' [MISRA 2012 Rule 10.1, required]
观察下面Misra警告的下面部分代码。
运算符'!'不允许的操作数 [MISRA 2012规则10.1,必填]
不知道这里有什么解决方法可以消除此警告。
#define C_BYTE unsigned char
C_BYTE SessionStatus;
#define DISCONNECTED 0x10
if((!(SessionStatus & (C_BYTE) DISCONNECTED)))
{
//Do something
}
我尝试了几次机会,但没有如下工作。
1)
if((~(SessionStatus & (C_BYTE) DISCONNECTED)))
{
//Do something
}
2)
if((!(SessionStatus & (C_BYTE) DISCONNECTED)) != 0u)
{
//Do something
}
警告的原因是MISRA-C规则10.1期望操作数为! && ||
! && ||
运算符必须是“基本布尔值”。 在您的情况下,由于隐式类型提升规则 ,它实际上是一个int
。
您的第二个示例几乎解决了它,但是您必须在应用前将其转换为布尔值!
。 那是:
if(!( (SessionStatus & (C_BYTE)DISCONNECTED) != 0u ))
这是可以的,因为!=
运算符的结果应视为基本布尔值。 因此该代码符合MISRA-C的要求,但有点难以阅读。 相反,我建议这样做:
#define DISCONNECTED 0x10u // u suffix makes this essentially unsigned
...
bool disconnected = (bool) (SessionStatus & DISCONNECTED);
if(!disconnected)
通过将u
后缀添加到整数常量,它实际上是无符号的,与无符号char属于相同的类型类别。 因此, &
操作在不使用任何强制转换的情况下是有效的。 但是,我们不允许将本质上从无符号转换为本质上是布尔值,因此将强制类型转换添加到bool
。
编辑
由于SessionStatus & DISCONNECTED
是“复合表达式”,因此MISRA不允许将结果分配或强制转换为其他或更广泛的基本类型。 这样做的理由是,他们担心不称职的程序员,他们认为例如(uint32_t)(u16a + u16b)
是由于(uint32_t)(u16a + u16b)
而使用uint32_t
进行的,这当然是胡说八道。 (对程序员进行基本的C方面的教育比提出人为的规则要好,但是无论如何...)
我建议您完全忽略此规则,但是如果出于某种原因您不能这样做,则可以选择以下解决方法:
#define DISCONNECTED 0x10u
...
unsigned char disconnected = SessionStatus & DISCONNECTED;
if(!(bool)disconnected)
但是,当然,这比我的第一个示例更糟糕。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.