缓冲区溢出(buffer overrun)是c/c++开发中比较令人头痛的问题,vs2005中有若干编译选项
可以有效的帮助程序员定位这些问题:
1,/GS:优化模式下有效,检测缓冲区溢出,只能检测出覆盖了返回地址的情况.
2,/RTCs:优化模式下无效,检测缓冲区溢出
void
Test2()
{
char buffer1[ 100 ];
char buffer2[ 100 ];
buffer1[ 0 ] = 0 ;
for ( int i = 0 ; i <= sizeof (buffer2); i ++ )
{
buffer2[i] = ' a ' ;
}
buffer2[ sizeof (buffer2) - 1 ] = 0 ; // 检测出buffer2溢出,上面的for中应该使用<而不是<=
cout << buffer2 << ' - ' << buffer1 << endl;
}
{
char buffer1[ 100 ];
char buffer2[ 100 ];
buffer1[ 0 ] = 0 ;
for ( int i = 0 ; i <= sizeof (buffer2); i ++ )
{
buffer2[i] = ' a ' ;
}
buffer2[ sizeof (buffer2) - 1 ] = 0 ; // 检测出buffer2溢出,上面的for中应该使用<而不是<=
cout << buffer2 << ' - ' << buffer1 << endl;
}
注:以上方法只能检测栈中的内存溢出,对于堆的内存(new出来的内存)溢出无效.
3,/RTCc: 优化模式下无效,可以检测出数据截断的情况
void
Test5(
int
value)
{
unsigned char ch;
ch = (unsigned char )value; // 检测出错误!
}
{
unsigned char ch;
ch = (unsigned char )value; // 检测出错误!
}
4,/RTCu:优化模式下无效,检测使用未初始化的变量
void
test()
{
int i;
int k = i * 100 ; // 检测出错误!
}
{
int i;
int k = i * 100 ; // 检测出错误!
}
参考:
1,http://msdn.microsoft.com/en-us/library/aa289171.aspx
2,http://msdn.microsoft.com/en-us/library/aa290051.aspx