gpt4 book ai didi

c - 运算符 '!' 的未经允许的操作数 [MISRA 2012 规则 10.1,必需]

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:44 28 4
gpt4 key购买 nike

观察以下代码部分的 Misra 警告。

Unpermitted operand to operator '!' [MISRA 2012 Rule 10.1, required]

不确定这里有什么办法可以消除此警告。

#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 需要 的操作数! && || 运算符“本质上是 bool 值”。在你的情况下,它实际上是一个 int,因为 implicit type promotion rules .

您的第二个示例几乎解决了它,但您必须在 应用 ! 之前转换为本质上的 bool 值。即:

if(!( (SessionStatus & (C_BYTE)DISCONNECTED) != 0u )) 

这没问题,因为 != 运算符的结果基本上被视为 bool 值。所以该代码符合 MISRA-C,但有点难以阅读。相反,我会推荐这个:

#define DISCONNECTED   0x10u // u suffix makes this essentially unsigned
...

bool disconnected = (bool) (SessionStatus & DISCONNECTED);
if(!disconnected)

整型常量加上u后缀,本质上是无符号的,与unsigned char属于同一类型范畴。因此 & 操作在不使用任何转换的情况下是有效的。但是,我们不允许从本质上无符号隐式转换为本质上 bool 值,因此将转换添加到 bool

编辑

由于 SessionStatus & DISCONNECTED 是一个“复合表达式”,MISRA 不允许将结果分配或转换为不同或更广泛的基本类型。理由是他们害怕无能的程序员相信例如 (uint32_t)(u16a + u16b) 中的计算是用 uint32_t 执行的,因为转换,这是当然是废话。 (教育程序员基本的 C 语言比提出人为的规则要好,但无论如何......)

我建议完全忽略此规则,但如果您出于某种原因不能这样做,这里有一个替代修复方法:

#define DISCONNECTED   0x10u
...

unsigned char disconnected = SessionStatus & DISCONNECTED;
if(!(bool)disconnected)

当然,这比我的第一个例子更糟糕。

关于c - 运算符 '!' 的未经允许的操作数 [MISRA 2012 规则 10.1,必需],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57557562/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com