【发布时间】:2010-11-30 01:06:15
【问题描述】:
strncpy() 据说可以防止缓冲区溢出。但是,如果它在没有空终止的情况下防止溢出,那么后续的字符串操作很可能会溢出。所以为了防止这种情况,我发现自己在做:
strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';
man strncpy 给出:
strncpy()函数类似,只是复制的src不超过n字节。因此,如果src的前n字节中没有空字节,则结果不会以空值结尾。
没有 null 终止看似无辜的东西,例如:
printf( "FOO: %s\n", dest );
...可能会崩溃。
除了strncpy(),还有更好、更安全的替代方案吗?
【问题讨论】:
-
请注意,在 MacOS X (BSD) 上,手册页说('
extern char *strncpy(char * restrict s1, const char * restrict s2, size_t n);'):strncpy() 函数最多将 n 个字符从 s2 复制到 s1。如果 s2 的长度小于 n 个字符,则 s1 的其余部分用 `\0' 字符填充。否则,s1 不会终止。 -
应该是dest[LEN-1] = '\0'; ?
-
我认为我们会这样复制字符串:int LEN = src.len; str* dest = new char[LEN+1]; strncpy(目标,源,LEN); dest[LEN] = '\0';
-
如果您确定字符串的大小不会超过目标缓冲区长度,则始终在目标字符串上使用 memset 是最安全的方法。
-
编写自己的函数,我认为这应该不是一项艰巨的任务