首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MISRA C:2004 10.5查询

MISRA C:2004 10.5查询
EN

Stack Overflow用户
提问于 2018-08-07 11:58:49
回答 3查看 1.2K关注 0票数 3

我有点被代码的一部分给米斯拉C 2004 10.5违规,但无法找出确切的原因可能是什么。

我定义了这个宏来得到2的幂。

显示违规行为的代码是

代码语言:javascript
复制
#define tmM_pow2_16bit(x)   ((tm_uint16)((tm_uint16)1U<<((tm_uint16)x)))

来自静态分析工具的消息是

左移符号数量(int) MISRA 2004规则10.5,要求

谢谢

EN

回答 3

Stack Overflow用户

发布于 2018-08-07 12:06:17

最可能的原因是shift操作符强制将(tm_uint16)1U隐式提升到int类型。

删除第二个强制转换以确保您移动无符号类型:

代码语言:javascript
复制
((tm_uint16)(1U<<((tm_uint16)x)))
票数 2
EN

Stack Overflow用户

发布于 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兼容代码应该是这样的:

代码语言:javascript
复制
#define tmM_pow2_16bit(x)   ( (tm_uint16)(1U << (x)) )

假设xtm_uint16类型有效。

(请注意,MISRA-C也不鼓励使用类似函数的宏。)

票数 1
EN

Stack Overflow用户

发布于 2018-08-07 15:41:01

用于检查MISRA遵从性的工具似乎坏了,但在某种意义上,您确实需要移动一个有符号整数类型的int:在int大于16位的体系结构上,(tm_uint16)1U在转换发生之前被提升为int,但是没有问题,因为它的值是正的。

但是,请注意,这个宏中有一个更糟糕的问题:在展开中没有插入x,这会导致非平凡表达式(如tmM_pow2_16bit(1|2) )的意外行为。

您可能可以通过删除不必要的强制转换来修复警告:

代码语言:javascript
复制
#define tmM_pow2_16bit(x)   ((tm_uint16)(1U << (tm_uint16)(x)))

如果工具仍然抱怨潜在的左移位量大于int的位宽,那么添加一个掩码:

代码语言:javascript
复制
#define tmM_pow2_16bit(x)   ((tm_uint16)(1U << ((x) & 15U)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51726255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档