gpt4 book ai didi

c - 为什么 strncpy not null 终止?

转载 作者:太空狗 更新时间:2023-10-29 16:16:04 26 4
gpt4 key购买 nike

strncpy() 据说可以防止缓冲区溢出。但是,如果它在没有空终止的情况下防止溢出,那么后续字符串操作很可能会溢出。所以为了防止这种情况,我发现自己在做:

strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';

man strncpy 给出:

The strncpy() function is similar, except that not more than n bytes of src are copied. Thus, if there is no null byte among the first n bytes of src, the result will not be null-terminated.

没有 null 终止一些看似无辜的东西,比如:

   printf( "FOO: %s\n", dest );

...可能会崩溃。


strncpy() 是否有更好、更安全的替代方案?

最佳答案

strncpy() 并非旨在用作更安全的 strcpy(),它应该用于将一个字符串插入到另一个字符串的中间。

所有那些“安全”的字符串处理函数,例如 snprintf()vsnprintf() 都是在后来的标准中添加的修复程序,以减轻缓冲区溢出攻击等。

Wikipedia提到 strncat() 作为编写您自己的安全 strncpy() 的替代方法:

*dst = '\0';
strncat(dst, src, LEN);

编辑

我错过了 strncat() 超过 LEN 个字符,如果它是长于或等于 LEN 个字符的空终止字符串。

无论如何,使用 strncat() 而不是任何自行开发的解决方案(例如 memcpy(..., strlen(...))/whatever 的意义在于strncat() 的实现可能在库中针对目标/平台进行了优化。

当然,您需要检查 dst 是否至少包含 nullchar,因此正确使用 strncat() 应该是这样的:

if (LEN) {
*dst = '\0'; strncat(dst, src, LEN-1);
}

我也承认 strncpy() 对于将子字符串复制到另一个字符串不是很有用,如果 src 比 n 个字符短,目标字符串将被截断。

关于c - 为什么 strncpy not null 终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1453876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com