我有点被代码的一部分给米斯拉C 2004 10.5违规,但无法找出确切的原因可能是什么。
我定义了这个宏来得到2的幂。
显示违规行为的代码是
#define tmM_pow2_16bit(x) ((tm_uint16)((tm_uint16)1U<<((tm_uint16)x)))来自静态分析工具的消息是
左移符号数量(int) MISRA 2004规则10.5,要求
谢谢
发布于 2018-08-07 12:06:17
最可能的原因是shift操作符强制将(tm_uint16)1U隐式提升到int类型。
删除第二个强制转换以确保您移动无符号类型:
((tm_uint16)(1U<<((tm_uint16)x)))发布于 2018-08-07 15:00:47
问题可能是该工具无法确定底层类型是什么。我怀疑它认为底层类型是unsigned int,因为这是1U的类型。
cast (tm_uint16)1U是多余的int为32位或更大的系统,这只会强制转换为小整数类型,然后该类型将立即被隐式转换为int。这将是MISRA-C:2004的违规行为,因为这种改变签名性的隐式转换可能不会发生。我建议学习Implicit type promotion rules。
(tm_uint16)x也是多余的,因为移位运算符的右操作数不参与决定操作数的结果。
MISRA-C:2004兼容代码应该是这样的:
#define tmM_pow2_16bit(x) ( (tm_uint16)(1U << (x)) )假设x对tm_uint16类型有效。
(请注意,MISRA-C也不鼓励使用类似函数的宏。)
发布于 2018-08-07 15:41:01
用于检查MISRA遵从性的工具似乎坏了,但在某种意义上,您确实需要移动一个有符号整数类型的int:在int大于16位的体系结构上,(tm_uint16)1U在转换发生之前被提升为int,但是没有问题,因为它的值是正的。
但是,请注意,这个宏中有一个更糟糕的问题:在展开中没有插入x,这会导致非平凡表达式(如tmM_pow2_16bit(1|2) )的意外行为。
您可能可以通过删除不必要的强制转换来修复警告:
#define tmM_pow2_16bit(x) ((tm_uint16)(1U << (tm_uint16)(x)))如果工具仍然抱怨潜在的左移位量大于int的位宽,那么添加一个掩码:
#define tmM_pow2_16bit(x) ((tm_uint16)(1U << ((x) & 15U)))https://stackoverflow.com/questions/51726255
复制相似问题