C++ 代码在 msdev 6.0 中运行良好,在 Visual Studio 2010 中崩溃
Posted
技术标签:
【中文标题】C++ 代码在 msdev 6.0 中运行良好,在 Visual Studio 2010 中崩溃【英文标题】:C++ code works fine in msdev 6.0 and crashes in Visual Studio 2010 【发布时间】:2015-11-24 11:44:41 【问题描述】:我不是 C 编程专家,但这是我正在编写的一段代码
static char gszBuf[10] ="1234567890";
#define LS_MAX_STRING 255
LoadDatatoBuffer(id, gszBuf, LS_MAX_STRING);
// this method will load the data wrt ID to gszBuf
考虑到上述方法加载的char字符串超过10个字符,即gszBuf = "abcdefghijklmnopqr";
以上代码将在 msdev 6.0 中正常运行。但是当我们尝试复制上述数据时,使用 Visual Studio 2010 创建的同一应用程序崩溃。我的问题是是什么让上面的代码在 msdev 6.0 中工作以及为什么它不能在 Visual Studio 2010 中运行
【问题讨论】:
我会说这是因为 VS2010 已经实现了一些数组边界检查,而这些检查在 MSDEV 6.0 中是不存在的。我进行了快速搜索,但没有发现任何可以证实这一点的东西。 哦,代码在 MSDEV 6.0 中不起作用。它溢出缓冲区导致未定义的行为。 但是在尝试显示 gszBuf 中的值时,它会显示正确的值,在 MSDEV 6.0 中超过 10 个字符 如果您的程序中有未定义的行为,一切都可能发生。示例:它会正常工作,或者有时会正常工作,或者它会爆炸宇宙,或者它会让你的猫怀孕,......你在某处有正确值的事实有时并不能证明你的程序是正确的。大多数情况下,这些都是指针问题、越界数组访问、堆栈缓冲区溢出、堆损坏等。应用程序中所有邪恶事物的根源是您试图用 C++ 编写 C。 C 很难。 【参考方案1】:您应该感谢 VS2010 使您的代码“崩溃”。 当你有缓冲区溢出时,最好尽快崩溃,而不是让黑客利用你的缓冲区溢出。
VS2010 有几项安全改进和缓冲区溢出检查:考虑它们机会以提高代码质量并修复缓冲区溢出相关的错误。
【讨论】:
非常感谢。我把这件事告诉了老板,他很满意。【参考方案2】:未定义的行为可能意味着代码会崩溃,但也可能意味着代码看起来可以工作,但会导致失败。
在这种情况下,如果 gszBuf 位于 CPU 页面的开头,并且在它之后,没有什么是重要的,那么它不会崩溃。
【讨论】:
以上是关于C++ 代码在 msdev 6.0 中运行良好,在 Visual Studio 2010 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章