2010-05-29 65 views
1

我有一個適用於x86的現有C代碼庫。在x64上沒有溢出溢出

我現在編譯它爲x64。

我想要做的是將size_t轉換爲DWORD,並在數據丟失時拋出異常。

問題:有沒有一個成語呢?


這也是爲什麼我這樣做:

一堆的Windows API的接受DWORD值作爲參數,並且代碼目前假設的sizeof(DWORD)==的sizeof(爲size_t)。這個假設適用於x86,但不適用於x64。因此,編譯x64時,傳遞size_t代替DWORD參數,會生成編譯時警告。

在幾乎所有這些情況下,實際大小不會超過2^32。但我想要防守和明確地進行編碼。

這是我的第一個x64項目,所以...要溫柔。

回答

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