【问题标题】:Misra 2012 Rule 10.1米斯拉 2012 年规则 10.1
【发布时间】:2021-12-10 05:21:37
【问题描述】:

以下 C 代码违反 QAC - MISRA 2012 规则 10.1

sLhsStatesInfo->ucLhsMssgCntr = ((Pack_Array_2[4] & (uint8)0xF0)>>4);

错误消息:“基本有符号”类型(有符号字符)的非负常量表达式正用作此移位运算符 (>>) 的右手操作数。 Misra C:2012 规则 10.1

谁能建议出了什么问题以及如何解决它?

【问题讨论】:

  • 您可以尝试4u 使其未签名。
  • 坦率地说,MISRA 规则检查器很愚蠢。
  • 我同意这是一个愚蠢的规则。但原因如下:stackoverflow.com/a/44132801/421195
  • @paulsm4:这与移位运算符的右侧有什么关系?
  • 这是一个工具错误。此表达式中的任何地方都没有带符号的字符。 4 本质上是签名类型 int

标签: c misra


【解决方案1】:

显然您的工具供应商没有阅读 MISRA C:2012 规则 10.1,其中有一个例外:

例外情况
本质上是有符号类型的非负整数常量表达式 可以用作移位运算符的右手操作数。

这是误报...向您的工具供应商举报。在此期间为您的代码添加注释(或类似内容)以突出显示它是误报。

查看隶属关系的个人资料

【讨论】:

  • 10.1 非常混乱。如果再往上看,我们会得出“7。移位运算符的右手操作数应该是基本上无符号类型,以确保未定义的行为不会由负移位引起。 "这仅比您引用的例外情况高出几行,并且非常矛盾但同样规范的文本。
  • 过去我也错过了那个例外。对于变量 #7 是有意义的,但对于文字来说,这样的规则是无意义的。不幸的是,Coverity 和 cppcheck 都已将此类代码报告为问题。 ...除了更糟糕的废话。 ;)
  • @Lundin - 变量 应该是无符号类型,但文字无关紧要
猜你喜欢
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多