我最近在我们的代码中遇到了一个64位兼容性错误,其中一个64位指针被存储在一个32位数字中,并且已经结束被使用,导致访问冲突。 该错误已经在我们的代码2年了! 直到最近,当我们改变到VC2012 C运行时,我们从来没有崩溃,当它开始崩溃的时候。 我很好奇,为什么我们从来没有见过这样的编译器警告。 我创build了以下程序并在VC2012编译器上打开/W4
。 我build立在64位模式。
int _tmain(int argc, _TCHAR* argv[]) { void* b = new int; ULONG ulB = (ULONG)b; return 0; }
这个程序编译没有警告,但是,当我打开/ Wp64我看到这个警告:
1>cl : Command line warning D9035: option 'Wp64' has been deprecated and will be removed in a future release 1>ConsoleApplication5.cpp(10): warning C4311: 'type cast' : pointer truncation from 'void *' to 'ULONG'
..这是我所期待的那种东西。
当我看到文档时,我发现/Wp64
的确已被弃用。 但是,现在应该将其构build到标准/W4
警告集中,并且页面显示“不使用此选项和关键字来检测64位可移植性问题,而是使用一个面向64位平台的Visual C ++编译器并指定/W4
选项“
http://msdn.microsoft.com/en-us/library/yt4xw8fh(v=vs.110).aspx
那么给了什么? /W4
不会像旧的弃用/Wp64
一样产生64位警告…
所以答案似乎并不是所有的64位警告在/W4
都可用。 但是,如果你想捕捉这个特定类型的bug,你应该使用/w14302
来构建,这会将警告4302切换到1级。因此,它将被打印出来,而不必打开所有的警告。