【问题标题】:C Possible overflow on casting to void pointerC 强制转换为 void 指针时可能溢出
【发布时间】:2014-11-05 06:32:56
【问题描述】:

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

错误:标量溢出时的操作 [从 unsigned int32 转换为 unsigned int16](结果始终严格大于 MAX UINT16)    从 unsigned int 32 到 unsigned     正确的转换:  [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 );

非常欢迎任何帮助:)

【问题讨论】:

    标签: c pointers casting void arithmetic-overflow


    【解决方案1】:

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

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

    【讨论】:

    • 你说得对,这是一个嵌入式系统,使用 16bit int。所以演员很可能会受到它的影响:)。我必须仔细检查,但我猜你是对的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-29
      • 2016-08-07
      • 2011-02-15
      • 2013-06-03
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      相关资源
      最近更新 更多