2

由于情况模糊,我很犹豫要不要问这个问题,但我想了解这怎么可能。我有一个使用 Visual Studio 2008 开发的 C++ 应用程序。当我在 Windows 7 64 位(或 Vista 32 位)上编译该应用程序时,该应用程序运行良好。当我在 32 位 Windows XP SP3 上编译应用程序时,我收到缓冲区溢出警告并且进程终止。这是使用与 Visual Studio 2008 C++ 编译器相同的版本。为什么我在 XP 上收到缓冲区溢出,但在其他 Windows 平台上却没有?

4

5 回答 5

4

运气,宇宙的基本不确定性,或者(比以前更可能)在 XP 和 7 之间的 msvcrt.dll 中更改的实现细节。

底线是您的应用程序中有错误,您应该修复它。

于 2011-02-22T15:59:40.807 回答
4

编写代码,以免缓冲区溢出,并且在任何平台上都不会出现此问题。即,确保您检查您正在访问的缓冲区的边界,以确保您没有尝试在正确的边界之外进行读/写。

于 2011-02-22T16:04:25.193 回答
3

在这两种情况下,您可能都有缓冲区溢出,首先它没有被检测到并且(显然)没有造成任何伤害。在第二个它被检测到。(如果它在动态分配的内存上,您必须知道分配器分配的内存通常比要求的多,因此一个合理的解释是,在第一种情况下,溢出停留在该区域中,而在第二种情况下则没有)。

于 2011-02-22T15:59:25.373 回答
1

数据类型的大小可能会从一个编译器更改为另一个(感谢@AndreyT)。使用硬编码的数字sizeof(4)来表示代码中数据类型的大小,可能会在您的应用程序中弹出错误。您应该sizeof(int)改用或使用您感兴趣的任何类型。

于 2011-02-22T16:15:02.907 回答
1

Windows-7 有一个称为容错堆的功能,正如它所说,它可以容忍一些错误的缓冲区访问。Windows XP 没有这个功能(Vista,我不知道)。Mark Russinovich 在 channel9.msdn.com 或 sysinternal.com 上有一个关于它的视频(忘了具体在哪里)。

于 2011-02-23T00:34:32.757 回答