C在转换为void指针时可能溢出

时间:2014-11-05 06:32:57

标签: c pointers casting void arithmetic-overflow

我正在使用名为Polyspace的代码分析工具。我在一个代码部分得到了“可能的溢出”通知,只是可以弄明白:)

  

错误:在标量溢出上操作[从无符号int32转换为无符号int16](结果总是严格大于MAX UINT16)从unsigned int 32转换为unsigned int 16 right:[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 );

非常欢迎任何帮助:)

2 个答案:

答案 0 :(得分:2)

T_EEP_ADDRESS类似于16位,((0x00E9800UL)+ (T_ULONG)luw_BlockPointer )是32位结果,因此您需要将较大的数字转换为较小的数字并丢失信息。

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

答案 1 :(得分:1)

有两个潜在问题:

错误可能在上面一行:

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 );