【发布时间】:2021-11-26 02:31:34
【问题描述】:
我发现了以下 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;
}
来自 cmets 的更新:
- “BAD”标记不准确,代码还不错,效率不高是的,有风险(下)是的,
- 为什么要冒险?
+1在 strlen() 调用之后需要安全地分配堆上的空间,这也将保留字符串终止符 ('\0')
【问题讨论】:
-
对我来说看起来不错,假设
s是一个格式良好的 C 字符串 .. ? -
如果没关系,您能否提供将这个 sn-p 标记为不安全的源/文档。从我所见,这是完全安全的代码。
-
@yano 您无法确定字符串是否格式正确。这里唯一缺少的检查是检查
NULL,以确定您收到的指针是否“有效”。 -
@DiegoROJAS 这个函数应该不检查 NULL,它应该在 NULL 时崩溃。 (Explanation.)
-
我想也可以写
malloc(len + sizeof '\0' - (sizeof(int) - 1)),但这似乎不太可读。 ;)