【发布时间】:2010-10-11 05:57:02
【问题描述】:
有些人似乎认为 C 的 strcpy() 函数是坏的或邪恶的。虽然我承认通常最好使用strncpy() 以避免缓冲区溢出,但以下(strdup() 函数的实现对于那些没有足够幸运的人来说)安全地使用strcpy() 并且不应该 溢出:
char *strdup(const char *s1)
{
char *s2 = malloc(strlen(s1)+1);
if(s2 == NULL)
{
return NULL;
}
strcpy(s2, s1);
return s2;
}
*s2 保证有足够的空间来存储*s1,并且使用strcpy() 使我们不必将strlen() 结果存储在另一个函数中,以便稍后用作不必要的(在这种情况下)长度参数到strncpy()。然而有些人用strncpy() 甚至memcpy() 编写这个函数,它们都需要一个长度参数。我想知道人们对此有何看法。如果您认为strcpy() 在某些情况下是安全的,请说出来。如果您有充分的理由在这种情况下不使用strcpy(),请给出 - 我想知道为什么在这种情况下使用strncpy() 或memcpy() 可能会更好。如果您认为strcpy() 可以,但不在这里,请解释一下。
基本上,我只想知道为什么有些人使用memcpy(),而其他人使用strcpy(),而还有一些人使用普通的strncpy()。是否有任何逻辑优先于三个(忽略前两个的缓冲区检查)?
【问题讨论】:
-
在多线程环境中,每个库函数自己处理锁定很少是合理的。
-
由于 strlen 可能会出现段错误,或在不正确终止的 s1 上返回不合理的大值,因此您的 strdup 不安全。
-
如果 'malloc' 改变了 's1',那么当你以后用 'strcpy' 复制到它时,不能保证缓冲区足够大。假设's1'是一个指向内存管理系统内部维护的字符串的指针——可能是最后一次调用'malloc'。