猿问

为什么strncpy不为null终止?

为什么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()


繁华开满天机
浏览 1036回答 3
3回答

达令说

最初,第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个空值是严重的过度杀伤,并且可以很容易如果您反复向长缓冲区添加材料,则会导致二次行为。)
随时随地看视频慕课网APP
我要回答