【问题标题】:MISRA C:2004 10.5 QueryMISRA C:2004 10.5 查询
【发布时间】:2018-08-07 11:58:49
【问题描述】:

我有点卡在导致 MISRA C 2004 10.5 违规的部分代码上,但我无法弄清楚究竟是什么原因。

我已经定义了这个宏来获得 2 的幂。

显示违规的代码是

#define tmM_pow2_16bit(x)   ((tm_uint16)((tm_uint16)1U<<((tm_uint16)x)))

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

符号数量左移 (int) [MISRA 2004 规则 10.5,必需]

谢谢

【问题讨论】:

标签: c misra


【解决方案1】:

最可能的原因是移位运算符强制将 (tm_uint16)1U 隐式提升为 int 类型。

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

((tm_uint16)(1U<<((tm_uint16)x)))

【讨论】:

  • 感谢您的意见。我尝试了您的建议,但仍然收到以下错误违反 MISRA 2004 所需规则 10.5,运算符 '~' 和 '
  • @AnkitShah 听起来像是该工具的误报。 10.5 仅适用于“小整数类型”的操作数,此处并非如此。
【解决方案2】:

问题可能是该工具无法完全确定底层类型是什么。我怀疑它认为底层类型是unsigned int,因为那是1U 的类型。

强制转换 (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)) )

假设xtm_uint16 类型有效。

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

【讨论】:

  • 我建议在宏扩展中用括号括起来x,这是一个比 MISRA-C 假定的违规更大的问题:`#define tmM_pow2_16bit(x) ((tm_uint16)(1U
  • @chqrlie 好点,我会解决的。奇怪的是,这实际上不是 MISRA 要求 - MISRA 只要求宏中表达式的最外层有括号。
  • MISRA 方法的问题在于他们制定了太多规则,而不是简单的建议。如果他们强制系统的宏参数括号,一些有用的宏结构将被禁止。许多嵌入式 C 程序员编写 MISRA-C 代码时并没有很好地理解所有这些类型转换和小类型定义的实际含义和后果。根据我自己审核此类项目的经验,它使代码难以阅读,并且无法防止许多种类的错误产生更糟糕的后果并且很好地隐藏在一系列平淡的愚蠢演员中。
  • @chqrlie 是的,这是 MISRA-C 的主要问题,如果团队中没有至少一名经验丰富的 C 资深人士可以帮助其他人,那么您就无法真正使用它。让初学者或中级 C 程序员单独使用(通常部分损坏)MISRA 检查工具,往往弊大于利。
  • 公平点@Lundin - 但无论是否有 MISRA,无人监督的缺乏经验的程序员都是潜在的责任......
【解决方案3】:

用于检查 MISRA-C 合规性的工具似乎已损坏,但从某种意义上说,您确实在左移有符号整数类型 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)))

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2015-12-02
    相关资源
    最近更新 更多