为什么strncpy不为null终止?strncpy()据说可以防止缓冲区溢出。但是如果它在没有null终止的情况下防止溢出,那么随后的字符串操作将会溢出。所以为了防止这种情况,我发现自己在做:strncpy( dest, src, LEN );dest[LEN - 1] = '\0';man strncpy 得到:strncpy()函数类似,只是复制了不超过n个字节的src。因此,如果src的前n个字节中没有空字节,则结果将不会以空值终止。没有null终止看似无辜的东西,如: printf( "FOO: %s\n", dest );......可能会崩溃是否有更好,更安全的替代品strncpy()?
3 回答
达令说
TA贡献1821条经验 获得超6个赞
最初,第7版UNIX文件系统(参见DIR(5))具有将文件名限制为14个字节的目录条目; 目录中的每个条目由2个字节组成,用于inode编号加上14个字节用于名称,null填充为14个字符,但不一定是以null结尾。我的信念strncpy()
是设计用于那些目录结构 - 或者至少,它适用于该结构。
考虑:
14个字符的文件名未终止。
如果名称短于14个字节,则将其填充为全长(14个字节)。
这正是通过以下方式实现的目标:
strncpy(inode->d_name, filename, 14);
因此,strncpy()
理想地适合其原始的利基应用。巧合的是,防止以null结尾的字符串溢出。
(注意,长度为14的空填充不是一个严重的开销 - 如果缓冲区的长度是4 KB并且你想要的只是安全地复制20个字符,那么额外的4075个空值是严重的过度杀伤,并且可以很容易如果您反复向长缓冲区添加材料,则会导致二次行为。)
- 3 回答
- 0 关注
- 1035 浏览
添加回答
举报
0/150
提交
取消