C++ 代码在 msdev 6.0 中运行良好并在 Visual Studio 2010 中崩溃
C++ code works fine in msdev 6.0 and crashes in Visual Studio 2010
我不是 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
考虑到上述方法加载的是超过10个字符的char字符串,即gszBuf = "abcdefghijklmnopqr";
以上代码 运行 在 msdev 6.0 中没有任何问题。但是当我们尝试复制上述数据时,使用 visual studio 2010 创建的同一个应用程序崩溃了。我的问题是是什么让上面的代码在 msdev 6.0 中工作,为什么它不能在 visual studio 2010
中 运行
未定义的行为可能意味着代码会崩溃,但也可能意味着代码看似有效,但会导致失败。
在这种情况下,如果 gszBuf 位于 CPU 页面的开头,并且之后没有任何重要内容,则它不会崩溃。
你应该感谢 VS2010 制作了你的代码 "crash"。
当你的缓冲区溢出时,最好尽快崩溃,而不是让黑客利用你的缓冲区溢出。
VS2010 有多项安全改进和缓冲区溢出检查:考虑它们机会来提高代码质量并修复缓冲区溢出相关的错误。
我不是 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
考虑到上述方法加载的是超过10个字符的char字符串,即gszBuf = "abcdefghijklmnopqr";
以上代码 运行 在 msdev 6.0 中没有任何问题。但是当我们尝试复制上述数据时,使用 visual studio 2010 创建的同一个应用程序崩溃了。我的问题是是什么让上面的代码在 msdev 6.0 中工作,为什么它不能在 visual studio 2010
中 运行未定义的行为可能意味着代码会崩溃,但也可能意味着代码看似有效,但会导致失败。
在这种情况下,如果 gszBuf 位于 CPU 页面的开头,并且之后没有任何重要内容,则它不会崩溃。
你应该感谢 VS2010 制作了你的代码 "crash"。
当你的缓冲区溢出时,最好尽快崩溃,而不是让黑客利用你的缓冲区溢出。
VS2010 有多项安全改进和缓冲区溢出检查:考虑它们机会来提高代码质量并修复缓冲区溢出相关的错误。