如何使(1 << 9)通过MISRA?
这个问题在这里已经有了答案:
你也可以简单地通过使用来规避移位问题
#define MOTOR_ON ((uint16_t)512U) /* 1 << 9 = 2^9 */
我的建议是定义一个隐藏丑陋演员的宏,但是继续做丑陋的演员让MISRA感到高兴。
就像是:
#define LSHIFT(x, n)
(((unsigned int)(x)) << ((unsigned int)(n)))
然后在你的实际代码中:
#define MOTOR_ON LSHIFT(1, 9)
编辑:在下面的评论中,@Lundin说MISRA会抱怨函数式的宏。 我从来没有使用MISRA,所以我不知道。
快速谷歌搜索发现,MISRA有特殊的评论,你可以添加到你的代码来禁用警告。 这提示了两种可能性:
在您定义RSHIFT()
LSHIFT()
和RSHIFT()
以及任何其他位操纵宏的头文件中,将宏定义包装在MISRA警告禁用注释中。
在您想要进行位移的源文件中,添加MISRA警告禁用注释,并将您的代码像以前一样放入。
http://www.gimpel.com/Discussion.cfm?ThreadMode=Prev&ThreadID=2261
如果我理解正确,MISRA具有全局启用/禁用功能,但没有禁用功能,随后按“恢复原样”。 因此,禁用和启用的注释将始终全局启用检查,所以理想情况下,这些神奇注释不应位于头文件中。
所以我想我现在的建议是将你的原始位移代码放在一个.C源文件中,并且将魔法注释禁用/启用移位代码周围的MISRA警告。
表达式的值正在分配给一个较窄类型的对象。 “1U << 9U”仅导致保留低位。
“让MISRA高兴”与丑陋的铸造不会改变这一事实,尽管一个可怜的工具可能会被玩弄,但它不应该。
直接的解决方案是使用明确的演员:
#define MOTOR_ON ((uint16_t)0x200) /* 9th bit on turns on motor */
但是如果你相信“转移对可读性更好”,那么就简单地关闭这个案例的规则并记录推理。 如果事实完全符合是不可能的,MISRA兼容开发中的偏离过程是完全正确的(并鼓励)。 您必须有一个偏差管理流程才能完全符合标准。 意识的证据是目标,而不是一致性的证据。
顺便说一句,@托马斯,你说得对,这不是MISRA C:2004的完全重复,你也写了一些偏移的错误。 虽然这是违反规则10.3的规定,但所描述的“基础类型”概念对于理解此特定问题的警告意图并无帮助。 我对所有人的建议都是关于最新版本的MISRA-C:2012中的规则10.3的描述(这里可以找到:http://misra.org.uk),这使得工程师对于概念和意图更加清楚,工具制造商。
链接地址: http://www.djcxy.com/p/77165.html