vs/c++缓冲区溢出,未初始化变量检查
缓冲区溢出(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