没有溢出投在x64上

我有一个在x86上工作的现有C代码库。

我现在编译它为x64。

我想要做的是将一个size_t转换为一个DWORD,并且在数据丢失的情况下抛出一个exception。

:这有一个成语吗?


这就是为什么我这样做:

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

在几乎所有这些情况下,实际大小不会超过2 ^ 32。 但我想要防守和明确地编码。

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

我刚刚定义了一个函数来执行演员。

我包含了一个类似assert的行为,以确保我不是在默默地指责垃圾。

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