开源的另一面:在glibc中有望加入strlcpy()函数
| 2014-09-27 21:44 评论: 14 分享: 4
源自BSD世界的strlcpy()函数家族是为了解决strcpy()及相关函数的安全问题而创造出来的,在GNU C Library (glibc)中引入Strlcpy()函数是glibc历史上持续时间最长的请求之一,但维护者一直拒绝加入。
strcpy()函数由于不执行字符长度检查而会导致缓存区溢出和安全问题,strlcpy() 创造出来就是为了确保所有字符串都是以null结尾。2000年,Christoph Hellwig递交了在 glibc中加入strlcpy()和strlcat() 的补丁,维护者Ulrich Drepper断然拒绝,称它是一个无效率的BSD垃圾,会带来其它问题,使用strcat 或strlcpy的人应该受到惩罚。Christoph在象征性的抗议后放弃了,但其他人没有,他们反复递交请求反复被拒绝。
14年后,glibc仍然没有strlcpy()。
然而,glibc项目的管理自2012年以来发生了很大的改变,对新功能的引入更加开放,开发者已经表示会合理的考虑strlcpy()实现。
[点击展开更多楼层]
[5]soli 发表于 2014-09-29 12:46 的评论:自从我知道 strncpy 之后就再也没用过 strcpy 了。[6]linux 发表于 2014-09-29 13:58 的评论:strncpy也有问题,这个简译里面没说,原文说到了,strncpy 会导致没有 \000 结尾的字符串,也会有问题。所以才有 strlcpy 的产生。[7]soli 发表于 2014-09-30 09:04 的评论:是哈,所以我都是 strncpy 之后再把最后字符赋值为 \0 ,或者提前 memset 成 \0,然后 strncpy 的时候预留出最后一个字节不用。
但我的意思是说,strncpy 比 strcpy 还是安全了一些,所以我会用;等 strlcpy 出来之后,我也会跟进。
而不是“就算现在加入了,大部分人还是继续用strcpy”。- linux 2014-09-30 09:18 2 赞 回复
- 嗯,这是对的!从这件事,可以看出开源界里面有些人也是顽冥不化,固步自封。