C 借助splint消除代码中的安全缺陷

C 借助splint消除代码中的安全缺陷,c,security,buffer,splint,C,Security,Buffer,Splint,有人能帮我修复这个代码吗?我不太懂,因为我是C语言的新手。我正在使用Splint来发现代码中的安全缺陷 char *stringcopy(char *str1, char *str2) { while (*str2) *str1++ = *str2++; return str2; } main(int argc, char **argv) { char *buffer = (char *)malloc(16 * sizeof(char));

有人能帮我修复这个代码吗?我不太懂,因为我是C语言的新手。我正在使用Splint来发现代码中的安全缺陷

char *stringcopy(char *str1, char *str2)
{
    while (*str2)
        *str1++ = *str2++;

    return str2;
}

main(int argc, char **argv)
{

    char *buffer = (char *)malloc(16 * sizeof(char));

    stringcopy(buffer, argv[1]);

    printf("%s\n", buffer);
}

您的
stringcopy
不会终止复制的字符串。此外,返回源字符串的结尾没有多大用处。以下是一项建议:

char *stringcopy(char *str1, char *str2)
{
    char *s2= str2;
    while (*s2)
        *str1++ = *s2++;

    *s2= '\0';
    return str2;
}
  • 您缺少了包含项
  • 您的
    stringcopy()
    不会终止目标
  • 源代码实际上应该是一个
    const char*
    ,以允许const正确性,并让编译器帮助捕获bug
  • stringcopy()
    希望目标足够大。在
    main()
    中,16个字节符合该条件吗?
    考虑将一个字符串打包并复制到一个函数中,称为
  • 出于某种原因,standard
    strcpy()
    返回指向目标的指针。是的,返回一个指向trminator的指针是个好主意,但是在命名函数时要避免令人不快的意外
  • 此外,使用
    sizeof*指针
    而不是
    sizeof(TYPE)
    ,这样可以减少未检查的重复并避免错误
  • 不要假定成功<代码>malloc()总是会失败
  • 通常,您应该
    free()
    您所需要的
    malloc()
    。但由于程序立即终止,因此无法正常工作
  • 隐式
    返回0main()
    的code>。但是您已经使用了implicit
    int
    ,这在当时已被删除。那是什么
  • 尽管这不是代码审查,但我真诚地建议您在正确命名参数方面多做一些工作。任何出于任何原因阅读您的代码的人(目前主要是您自己)都会心存感激。但这并不意味着名字应该更长

  • @我没有告诉OP把它迁移到CR,那是另一个人。如果将其更改为a并将lint日志作为文本发布,则可能更适合这样做。我们不应该让用户在两个站点之间处于犹豫状态。我将收回我的反对票。@PerKristianGravdal很抱歉,您在评论中得到了相互矛盾的建议,我们似乎有点困惑:)请执行以下操作来修复此处的帖子(单击“编辑”):1)编辑此处的代码,包括您用来编译的完整版本,包括
    \include
    指令。如果编译器给了您任何警告/错误,请也发布这些警告/错误。2) 将Lint消息图片替换为文本。您应该能够从终端复制/粘贴。3) 请提及所使用的编译器,因为它似乎是一个过时的编译器。我发现有趣的是,splint的长时间抱怨似乎没有提到这里的关键安全问题,即
    stringcopy
    对避免缓冲区溢出没有任何作用。当然,这是一个API设计问题,但它也是
    strcpy
    的一个众所周知的问题,我想这个函数是用来替换它的。(缺少NUL终止是另一个问题。splint也没有检测到。)就个人而言,我建议将此工具留到以后,集中精力编写正确的代码。@rici我想说的是,
    stringcopy()
    的任务显然不是检测或防止这种情况,而是调用代码。“这并不是说这会让情况变得更好。@重复数据消除者:我同意,但我不认为这会改变夹板输出的问题。