如何使(1 << 9)通过MISRA?

这个问题在这里已经有了答案:

  • MISRA C:2004,错误与位移2答案

  • 你也可以简单地通过使用来规避移位问题

     #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

    上一篇: How to make (1 << 9) pass MISRA?

    下一篇: Making multiple plots from a list of data frames