我发现了下面的一段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;
}
评论更新:
- “BAD”标记不精确,代码还不错,效率不高是的,有风险(如下)是的,
- 为什么有风险?
+1
在 strlen() 调用之后required安全地分配堆上的空间,这也将保留字符串终止符('\0'
)
您的示例函数中没有错误。
然而,为了使其obvious向未来的读者(人类和机械)表明没有错误,您应该替换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
这一事实对读者来说更加明显。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)