c - 如何解决有关应用位运算符 ~ 和 << 底层类型的 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 数据类型,是什么导致了警告?
解决方案
据我所知,鉴于您所说的宏定义适用,警告不适用于您提供的语句。但是,我推测它与整数常量有关0x00000001U
。解释为具有 type 的整数常量,unsigned int
但 MISRA 工具可能将其误解为具有更窄的类型,因为它的值适合更窄的类型。
我建议通过明确指定类型来减少机器或人为误解的可能性:
#define CAN_CTL_INIT ((unsigned int) 0x00000001U) // Initialization
或者
#define CAN_CTL_INIT ((uint32_t) 0x00000001U) // Initialization
. 前者在每个符合 C 的实现上产生与原始相同类型和值的表达式。后者可能对你来说是等价的,你可能更喜欢它的风格。(如果后者恰好不适合您,那么您应该考虑它是否真的是您想要的。)
推荐阅读
- javascript - AJAX/JSON 与可能的 Jquery 事件
- ruby-on-rails - 如何从类数组中调用属性
- c - 使用 read() 从文件中一次读取一个字符
- sql - Spark SQL 中的 ARRAY_TO_STRING
- ubuntu - 升级 18.04 后没有 gui 可用只有 tty
- php - Laravel:使用 store() 上传时更改文件名
- unit-testing - 将 .NET Core XUnit 项目的代码覆盖率添加到 VSTS 构建
- typescript - 使用 Typescript 2.8 React Native - 无法重新声明块范围变量“控制台”
- scala - 如何使用 scala 将 csv 字符串解析为 Spark 数据帧?
- go - 了解从频道读取的行为