在Windows 7上,我使用Visual Studio 2008将以下代码段编译为调试项目:
{
char bufBef[32];
char buf[8];
char bufAfter[32];
sprintf(buf,"AAAAAAA\0");
buf[8]='\0';
printf("%s\n",buf);
}
三个缓冲区相邻。我用调试器找到了他们的地址,如下所示:
bufBef 0x001afa50
buf 0x001afa40
bufAfter 0x001afa18
语句“buf [8] ='\ 0'”将地址写入buf。当我运行该程序时,操作系统报告“调试错误:运行时检查失败#2 - 变量'buf'周围的堆栈已损坏。”
然后我将其编译为发布项目。它安静地运行,没有提出任何错误报告。
我的问题是运行时检测缓冲区如何溢出?