我思故我在

歌德说,人的一辈子其实只能做一件事,做了,就要扎扎实实地把它做好。我也只能通过一种行业来认定我自己的人生价值。我选择了写程序,我希望我能写好。
随笔 - 55, 评论 - 457, 引用 - 159

导航

每月存档

最新留言

广告

 

从日经看到下面一篇报道:

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时,有字符串参数做为返回值的写法。

打印 | 张贴于 2004-04-20 08:32:00 | Tag:暂无标签

留言反馈

#re:Whidbey中C运行时函数具备防缓冲溢出功能 编辑
Whidbey中C运行时函数具备防缓冲溢出功能 ooeess
2005-06-10 16:59:00 | [匿名:有害气体报警器]
#re:Whidbey中C运行时函数具备防缓冲溢出功能 编辑
^_~,pretty good!csharpsseeoo
2005-05-16 13:22:00 | [匿名:数据采集分析软件]
#re:Whidbey中C运行时函数具备防缓冲溢出功能 编辑
^_^,Pretty Good!
2005-04-16 01:11:00 | [匿名:超声波液位计]
#re:Whidbey中C运行时函数具备防缓冲溢出功能 编辑
^_^,Pretty Good!
2005-04-10 19:54:00 | [匿名:高度尺]
#回复: Whidbey中C运行时函数具备防缓冲溢出功能 编辑
有点不大明白,作为CRT函数,觉得strncpy的行为比strcpy_s更安全些
毕竟假如溢出,strcpy_s可要结束程序的,也就是说写的网络服务的话会导致服务不再可用。而且strncpy是标准CRT,只是也能慢一点(会以nul填充剩余的空间)。
2004-04-20 13:10:00 | [匿名:carfield]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0