1

我正在使用一个名为 Polyspace 的代码分析工具。我在一个代码部分收到“可能溢出”通知,我可以弄清楚:)

错误:操作 [conversion from unsigned int32 to unsigned int16] 标量溢出(结果总是严格大于 MAX UINT16)从 unsigned int 32 到 unsigned int 16 的转换正确:[956448 .. 972799]

代码是:

typedef unsigned char       T_UBYTE;
typedef unsigned short int  T_UWORD;
typedef unsigned long int   T_ULONG;

typedef  void __far * T_EEP_ADDRESS;
..

T_EEP_ADDRESS beeeblock_GetBlockPointer(T_UWORD luw_BATAddress)
{
   T_UWORD luw_BlockPointer;
   T_EEP_ADDRESS lpul_BATEntry;
..
   luw_BlockPointer =  ( READ_EEP_32(lpul_BATEntry) & 0xFFFFuL );
..
   return (T_EEP_ADDRESS)((0x00E9800UL)+ (T_ULONG)luw_BlockPointer ); 
}

导致错误的行是这样的:

return (T_EEP_ADDRESS)((0x00E9800UL)+ (T_ULONG)luw_BlockPointer );

非常欢迎任何帮助:)

4

2 回答 2

2

看起来类型T_EEP_ADDRESS是 16 位,并且((0x00E9800UL)+ (T_ULONG)luw_BlockPointer )是 32 位结果,因此您将大数字转换为较小的数字并丢失信息。

这是在什么系统上?你知道指针的大小,因为T_EEP_ADDRESS是指针吗?

于 2014-11-05T06:49:50.650 回答
1

有2个潜在问题:

错误可能在上面的行中:

luw_BlockPointer = ( READ_EEP_32(lpul_BATEntry) & 0xFFFFuL );
sizeof(0xFFFFuL) == 8 and sizeof(luw_BlockPointer) == 2

尝试取消强制转换T_ULONG,因为它应该允许您在没有强制unsigned short转换的情况下添加一个unsigned long

return (T_EEP_ADDRESS)((0x00E9800UL)+ luw_BlockPointer );
于 2014-11-05T06:49:51.143 回答