c - 为什么这种 strcpy 的使用被认为是错误的?

我发现了以下一段 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() 调用之后需要安全地分配堆上的空间,同时保留字符串终止符('\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/

相关文章:

python - youtube_dl - 无法阻止发布错误日志

r - 如何按日期对数据框进行排序。但日期列在宿舍

c - C如何计算混合的int和float数据类型

next.js - Next JS 中的 Font Awesome 6(测试版)和动态图标名称

c# - Powershell 到 C# 语法转换

django - 使用 drf-spectacular 为 django API 定义组件模式

ios - 'CC_MD5' is deprecated : first deprecated in

c++ - C++ 中具有不同数据成员的模板结构

java - 为什么 UriComponentsBuilder 忽略空查询参数?

c - 释放函数内部的指针,并在 main 中使用它