在x64上没有溢出

时间:2010-05-29 21:02:38

标签: windows visual-c++ 64-bit 32bit-64bit

我有一个适用于x86的现有C代码库。

我现在正在为x64编译它。

我想做的是将size_t强制转换为DWORD,如果数据丢失则抛出异常。

:这有成语吗?


这就是我这样做的原因:

一堆Windows API接受DWORD作为参数,代码当前假设sizeof(DWORD)== sizeof(size_t)。这个假设适用于x86,但不适用于x64。因此,在编译x64时,传递size_t代替DWORD参数,会生成编译时警告。

在几乎所有这些情况下,实际尺寸不会超过2 ^ 32。但我想以防御性和明确的方式对其进行编码。

这是我的第一个x64项目,所以......要温柔。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我刚刚定义了一个执行强制转换的函数。

我包含了类似于断言的行为,以确保我不会默默地抛弃指针。

DWORD ConvertSizeTo32bits(size_t sz, char *file, int line) 
{
    if (!(0 <= sz && sz <= INT32_MAX)) {
        EmitLogMessage("Invalid Pointer size: %d file(%s) line(%d)",
                       sz, file, line);

        ExitProcess( 0 );  
    }
    return (DWORD) sz;
}

答案 2 :(得分:0)

#define size_t_to_DWORD(st,dw)  if ((DWORD)(st) != st)  RaiseException(exLossOfData, 0, 0, NULL); else dw = (DWORD)(st)

size_t  st;
DWORD   dw;
st = 0xffffffff;
size_t_to_DWORD(st,dw);  // this succeeds
st = 0xffffffff1;
size_t_to_DWORD(st,dw);  // this throws

编辑:

或者更好的是,这样做可以在表达式中使用它:

DWORD MyRaiseException()
{
    RaiseException(1, 0, 0, NULL);
    return 0;
}


#define size_t_to_DWORD(st)  (DWORD)(st) != (st) ? MyRaiseException() : (DWORD)(st)


void main(void)
{
    size_t  st;
    DWORD   dw;
    st = 0xffffffff1;
    dw = size_t_to_DWORD(st);
    printf("%u %u\n", st, dw);
}