首页 > 解决方案 > 如何解决有关应用位运算符 ~ 和 << 底层类型的 Misra 警告

问题描述

我有以下声明

CAN0_CTL_R &= ~ CAN_CTL_INIT;

以及所需的 misra 警告:

如果按位运算符 ~ 和 << 应用于基础类型 unsigned char 或 unsigned short 的操作数,则结果应立即转换为操作数的基础类型

寄存器定义如下:

#define CAN_CTL_INIT            0x00000001U  // Initialization
#define CAN0_CTL_R              (*((volatile uint32_t *)0x40040000U))

由于没有 short 或 char 数据类型,是什么导致了警告?

标签: cembeddedmisra

解决方案


据我所知,鉴于您所说的宏定义适用,警告不适用于您提供的语句。但是,我推测它与整数常量有关0x00000001U。解释为具有 type 的整数常量,unsigned int但 MISRA 工具可能将其误解为具有更窄的类型,因为它的值适合更窄的类型。

我建议通过明确指定类型来减少机器或人为误解的可能性:

#define CAN_CTL_INIT            ((unsigned int) 0x00000001U)  // Initialization

或者

#define CAN_CTL_INIT            ((uint32_t) 0x00000001U)  // Initialization

. 前者在每个符合 C 的实现上产生与原始相同类型和值的表达式。后者可能对你来说是等价的,你可能更喜欢它的风格。(如果后者恰好适合您,那么您应该考虑它是否真的是您想要的。)


推荐阅读