如何解决有关对基础类型应用按位运算符〜和<<的Misra警告

时间:2018-06-22 13:17:08

标签: c embedded misra

我有以下声明

CAN0_CTL_R &= ~ CAN_CTL_INIT;

和必需的错误警告:

  

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

寄存器定义如下:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

。在每个符合C的实现中,前者产生的表达式类型和值与原始表达式相同。后者可能对您来说是等效的,并且您可能在样式上更喜欢它。 (而且,如果后者发生 not 对您来说是等效的,那么您应该考虑它是否确实是您想要的。)