【问题标题】:Clarification on '**Excessive shift value' Lint warning**澄清“**过度移位值”Lint 警告**
【发布时间】:2014-09-17 13:20:11
【问题描述】:

关于“过度移位值”Lint 警告的说明-

初始参数如下,

*#define SCC_BUFFERSIZE 0x80*  

*uint16 DeviceConfigMsg[10];*

另请参阅下面的编码部分

**DeviceConfigMsg[0] =  SCC_BUFFER_SIZE;*
*DeviceConfigMsg[1] =  SCC_R_OK;*
*DeviceConfigMsg[2] =  SCC_BUFFERSIZE & 0xFF;*
*DeviceConfigMsg[3] = (SCC_BUFFERSIZE>>8) & 0xFF;**

执行代码时,我收到最后一行的 lint 警告 ****DeviceConfigMsg[3] = (SCC_BUFFERSIZE>>8) & 0xFF**** 如下。 警告 572:prio2:过度移位值(精度 8 右移 8)

我知道 0x80 SCC_BUFFERSIZE 的值可能会在以后更改。 所以请让我知道如何解决这个 lint 错误。 让我知道您是否需要我的任何其他输入。 我正在使用 GHS 编译器。

提前致谢,

JEEE

【问题讨论】:

  • 不是说 0x80 是一个 8 位的值,所以向右移动 8 位总是会产生零值吗?

标签: lint


【解决方案1】:

我认为你只需要压制这个:

DeviceConfigMsg[3] = (SCC_BUFFERSIZE>>8) & 0xFF; //lint !e572 

这是价值跟踪系统中的一个“错误”。

根据文档,以下两个应该都可以工作:

#define SCC_BUFFERSIZE (0x0080)

const uint16 SCC_BUFFERSIZE = 0x80;

因为这让 Lint 知道 SCC_BUFFERSIZE 最多可以为 16 位,它应该很乐意将其仅移动 8 位。

不幸的是,两者都不起作用。

由于它们是常量,Lint 似乎计算出实际值,缩小它们,然后发出警告。

如果您从常量中删除“const”,它可以正常工作:

uint16 SCC_BUFFERSIZE = 0x80;

因为它假定它们可以是任何有效的 uint16。

这会使代码变得更糟,所以在这种情况下,抑制是一个更好的解决方法。

【讨论】:

  • 那么您打算传达的最终和最佳解决方案是什么?
  • 只需使用 //lint !e572 抑制消息
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2014-08-23
  • 2010-11-11
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多