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 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

win10无法运行vc6.0怎么办

vc++6.0一打开就出现MSDEV.EXE应用程序错误,无法正常启动0xc0000142

vc 6.0的安装问题

VC++6.0安装教程。

使用 Visual c++ 6.0 时使用啥代码

编程问题:用Visual studio编写的程序cpp文件和sin文件用VC++6.0打开怎么全是乱码