【问题标题】:How to solve this lint warning "Implicit binary conversion from int to unsigned int"如何解决此 lint 警告“从 int 到 unsigned int 的隐式二进制转换”
【发布时间】:2016-05-09 12:13:17
【问题描述】:

代码如下:

test.cpp

unsigned short x;
bool y;
if ((x==1)&& y)
{
  ...
}
else
{
  ...
}

我收到一条 lint 消息:

Note 912 Implicit binary conversion from int
to unsigned int [MISRA Rule 48]

为什么?以及如何避免这种情况?

【问题讨论】:

  • if ((x==1u)&& y),如果这不起作用,您需要提供一个完整的示例(无论如何您应该首先完成)。
  • 请注意这个 MISRA-C:1998,这是 C++。它在 MISRA-C++:2008 中很好。

标签: c++ lint misra pc-lint


【解决方案1】:

试试这个

if ( ( static_cast<unsigned int>(1) == x ) && y)

【讨论】:

  • 获取新错误:注释 970 在 typedef [MISRA 规则 13] 之外使用修饰符或类型“无符号”
  • if ((unsigned short)(1)==x) && y) 有效,谢谢,但为什么呢?
  • 因为这里的静态分析工具以某种方式抱怨“字面 int 到无符号的转换”,而不是“C 风格的转换将所有类型安全都抛到了窗外”。
  • MISRA C++ 2008 禁止使用 C 样式转换(5-2-2、5-2-7/8/9)。我假设 MISRA C++ 作为@HeyJoy 引用 MISRA 规则。 MISRA C 不会抱怨。
  • @HeyJoy if ((unsigned short)(1)==x) && y) 不兼容 MISRA,它不应该工作。两个操作数都被隐式提升。
【解决方案2】:

因为 1 被视为 int。使用

unsigned int x 

或投射

【讨论】:

    【解决方案3】:

    您正在比较 x(默认情况下为 unsigned short)和 1(默认情况下为 int)。因此,您得到了隐式二进制转换。

    给你的编译器一个提示,你实际上想将 x 与另一个 unsigned 值进行比较:

    if ((x==1U) &amp;&amp; y)

    【讨论】:

    • 这并不能解决警告,MISRA 禁止隐式转换。
    【解决方案4】:

    不清楚您使用的是哪个版本的 MISRA。在编写 C++ 代码时,您应该使用 MISRA-C++,否则将违反 MISRA 规则。 MISRA-C++ 的合规性显然不能用 MISRA-C 检查器来检查。

    无论如何,假设您有一个 32 位整数的系统,无论 MISRA 版本如何,这都应该可以解决问题:

    if ( ( static_cast<uint32_t>(x) == 1u ) && y)   // compliant
    

    要了解的重要部分是隐式促销的工作原理以及如何避免它们:

    • 1 文字转换为 unsigned short 不会解决任何问题。这样的强制转换完全是多余的,因为无论如何操作数都会立即将整数提升回int

      if ( ( x == static_cast&lt;unsigned short&gt;(1) ) &amp;&amp; y) // not compliant

      unsigned short ushort=1u; if ( ( x == ushort ) &amp;&amp; y) // not compliant

    • 1 文字转换为 unsigned int 或仅将其更改为 1u(同样的事情)将使程序按预期运行,但它不会解决 MISRA 警告。因为您仍然有 x 操作数的隐式类型提升,这是 MISRA 违规。

      if ( ( x == 1u ) &amp;&amp; y) // not compliant

      if ( ( static_cast&lt;unsigned int&gt;(1) == x ) &amp;&amp; y) // not compliant

    研究整数提升常用的算术转换

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-04
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2013-09-03
      • 1970-01-01
      相关资源
      最近更新 更多