我发现了以下一段 C 代码,标记为 BAD(又名缓冲区溢出错误)。 问题是我不太明白为什么?在分配等之前捕获输入字符串长度。
char *my_strdup(const char *s)
{
size_t len = strlen(s) + 1;
char *c = malloc(len);
if (c) {
strcpy(c, s); // BAD
}
return c;
}
评论更新:
+1
在 strlen() 调用之后需要安全地分配堆上的空间,同时保留字符串终止符('\0'
)最佳答案
您的示例函数中没有错误。
但是,为了让 future 的读者(包括人类和机器)显而易见没有错误,您应该将 strcpy
调用替换为 memcpy
:
char *my_strdup(const char *s)
{
size_t len = strlen(s) + 1;
char *c = malloc(len);
if (c) {
memcpy(c, s, len);
}
return c;
}
无论哪种方式,len
字节都被分配并且 len
字节被复制,但是使用 memcpy
这个事实对读者来说更加清楚.
https://stackoverflow.com/questions/69456762/