从日经看到下面一篇报道:
http://china.nikkeibp.co.jp/china/news/com/com200404130115.html
http://itpro.nikkeibp.co.jp/free/NT/NEWS/20040409/1/
Whidbey中C运行时函数具备防缓冲溢出功能!
微软正在开发的开发工具“Visual Studio 2005”(开发代号:Whidbey)中,将在C运行时函数里采取防止缓冲区溢出的措施。具体而言,就是在strcat、strcpy、strlen等以str开头的各种字符串操作函数与lsearch、memmove等内存区操作函数中,将提供添加了缓冲区长度检查功能的新函数。所谓缓冲溢出,就是指在程序提供的输入缓冲区中通过写入超过缓冲区长度的长数据,来运行非法程序的攻击方法。
作为新函数,一旦遇到超过缓冲区长度的访问,就会强制终止程序。不仅是微软产品,现有的标准C语言运行时间的字符串操作函数集均不检查缓冲区长度,因此均存在缓冲溢出的潜在危险。
防缓冲溢出的函数增加了一个提取缓冲区长度的参数。新的安全函数名均在相应的原函数名后面加上了一个“_s”,比如,与strcat函数对应的新函数名为strcat_s。
例如,对于下列程序,在strcpy函数处就会产生缓冲溢出:
int main( void )
{
char strDst[5];
const char* strSrc = "Hello World!";
strcpy( strDst, strSrc );
printf( strDst );
return 0;
}
下面是用新函数对上述代码进行改写后的结果:
int main( void )
{
char strDst[5];
const char* strSrc = "Hello World!";
strcpy_s( strDst, 5, strSrc );
printf( strDst );
return 0;
}
另外,现有的Visual C++如果利用/GS选项进行编译,那么运行时一旦检测到缓冲溢出,也会强制终止程序。而作为Whidbey中的Visual C++,/GS选项在标准状态下是有效(ON)的。顺便提一下,定于今年6月发布的Windows XP Service Pack 2就是在/GS选项下进行编译的。
----------
看strcpy_s的调用方法不由得让我想起vb中调用api时,有字符串参数做为返回值的写法。