关于'**过度换班值'的澄清警告**

时间: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<< 8 = 0总是当前,但我现在不能明确指定零,因为宏 SCC_BUFFERSIZE 的值可能会稍后更改。 所以请让我知道如何解决这个lint错误。 如果您需要我的任何其他意见,请告诉我。 我正在使用GHS编译器。

提前致谢,

JEEE

1 个答案:

答案 0 :(得分:1)

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

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

这是一个' bug'在价值追踪系统中。

根据文档

,以下两个工作
#define SCC_BUFFERSIZE (0x0080)

const uint16 SCC_BUFFERSIZE = 0x80;

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

不幸的是,实际上都没有效果。

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

如果您删除了' const'从常量它工作正常:

uint16 SCC_BUFFERSIZE = 0x80;

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

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