Windows x64上没有溢出强制转换
我有一个在x86上工作的现有C代码库 我现在正在为x64编译它 我想做的是将一个大小t转换为DWORD,如果数据丢失,则抛出一个异常 Q:这有成语吗Windows x64上没有溢出强制转换,windows,visual-c++,64-bit,32bit-64bit,Windows,Visual C++,64 Bit,32bit 64bit,我有一个在x86上工作的现有C代码库 我现在正在为x64编译它 我想做的是将一个大小t转换为DWORD,如果数据丢失,则抛出一个异常 Q:这有成语吗 这就是为什么我要这么做: 许多Windows API接受DWORD作为参数,并且代码当前假定sizeof(DWORD)==sizeof(size\t)。这种假设适用于x86,但不适用于x64。因此,在为x64编译时,传递size_t代替DWORD参数会生成编译时警告 在几乎所有这些情况下,实际大小不会超过2^32。但我想用防御性的、明确的方式编写
这就是为什么我要这么做: 许多Windows API接受DWORD作为参数,并且代码当前假定sizeof(DWORD)==sizeof(size\t)。这种假设适用于x86,但不适用于x64。因此,在为x64编译时,传递size_t代替DWORD参数会生成编译时警告 在几乎所有这些情况下,实际大小不会超过2^32。但我想用防御性的、明确的方式编写代码
这是我的第一个x64项目,所以。。。温柔一点。参见boost::numeric\u cast
参见boost::numeric\u cast
我刚刚定义了一个函数来执行强制转换 我加入了一个类似断言的行为,以确保我不会默默地诋毁指针
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;
}
DWORD CONVERTSIZETO32位(大小\u t sz,字符*文件,整数行)
{
如果(!(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;
}
DWORD CONVERTSIZETO32位(大小\u t sz,字符*文件,整数行)
{
如果(!(0)
编辑:
或者更好的做法是,这样您就可以在表达式中使用它:
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);
}
编辑:
或者更好的做法是,这样您就可以在表达式中使用它:
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);
}
那是C++,我也在使用C.,我只想抛出,我想要一个简单的成语,而不是一个库。那是C++,我用C.,我也只想抛出;我想要一个简单的成语,而不是一个库。