gpt4 book ai didi

c - 按位运算符违反 Misra

转载 作者:太空狗 更新时间:2023-10-29 15:17:35 26 4
gpt4 key购买 nike

我写了下面一段 MISRA 不喜欢的代码:

UartPtr->C &= ((uint8_t)(~SIO_C2_SBK));

#define SIO_C2_SBK ((uint8_t)0x01u)

UartPtr定义为

UartPtr = (UartStruct*) 0x12345678; /* I know that this is also a violation of MISRA */

底层数据结构:

typedef volatile struct UartStructTag
{
uint8_t BDH;
uint8_t BDL;
uint8_t C1;
uint8_t C2;
} UartStruct;

我的 Misra 检查器提示第一行并指出,

An integer constant expression with negative value is being converted to an unsigned type.

但是,以下行不会导致 MISRA 出现问题:

UartPtr->C |= ((uint8_t)(SIO_C2_SBK));

所以问题出在按位取反。但是由于所有操作都直接转换为 uint8_t,因此我没有违反 MISRA 标准。谁想在这里帮助我?

最佳答案

在任何算术表达式中,类型小于 int 的值在被处理之前被隐式转换为 int。 C 语言不能对小于 int 的类型进行算术运算。因此,您的代码实际上是这样的:

UartPtr->C &= ((uint8_t)(~(int)(uint8_t)0x01u));

这只是

UartPtr->C &= ((uint8_t)(~1));

其中 ~1 在二进制补码架构上的值为 -2

要解决此问题,请在应用按位非之前转换为 unsigned 或任何其他大于 int 的无符号类型:

UartPtr->C &= ((uint8_t)(~(unsigned)SIO_C2_SBK));

关于c - 按位运算符违反 Misra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34040433/

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