由于情况模糊,我对于提出这个问题犹豫不决,但我想了解这是怎么回事。我有一个使用Visual Studio 2008开发的C ++应用程序。当我在Windows 7 64位(或Vista 32位)上编译应用程序时,应用程序运行正常。当我在32位Windows XP SP3上编译应用程序时,我收到缓冲区溢出警告,并且该过程终止。这是使用与Visual Studio 2008 C ++编译器相同的版本。我是如何在XP上收到缓冲区溢出的,但在其他Windows平台上却没有?
答案 0 :(得分:4)
运气,宇宙的根本未确定性,或者(比之前更有可能)在XP和7之间的msvcrt.dll中发生变化的实现细节。
底线是您的应用程序中有错误,您应该修复它。
答案 1 :(得分:4)
编写代码,这样就不会出现缓冲区溢出,并且在任何平台上都不会出现此问题。也就是说,确保检查您正在访问的缓冲区的边界,以确保您没有尝试在正确的边界之外进行读/写。
答案 2 :(得分:3)
在这两种情况下,您可能都有缓冲区溢出,在第一种情况下,它未被检测到并且(显然)没有造成任何伤害。在第二个中检测到它。 (如果它位于动态分配的内存中,你必须知道分配器通常分配的内容多于所要求的内容,因此一个合理的解释是,在第一种情况下,溢出保留在该区域中,在第二种情况下它不会。) / p>
答案 3 :(得分:1)
数据类型的大小可能会从一个编译器变为另一个(感谢@AndreyT)。使用像sizeof(4)
这样的硬编码来表示代码中数据类型的大小,可能会在应用程序中弹出一个错误。您应该使用sizeof(int)
或您感兴趣的任何类型。
答案 4 :(得分:1)
Windows-7有一个称为容错堆的功能,正如它所说的那样,它容忍一些错误的缓冲区访问。 Windows XP没有此功能(Vista,我不知道)。 Mark Russinovich在channel9.msdn.com或sysinternal.com上发布了一段关于它的视频(忘了确切地说在哪里)。