-3

任何人都可以帮我修复此代码吗?由于我是 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);
}

夹板输出

4

2 回答 2

1
  1. 您缺少包含的内容。
  2. stringcopy()不会终止目的地。
  3. 源代码确实应该是一个const char*允许 const 正确性并让编译器帮助捕获错误的源代码。
  4. stringcopy()期望目的地足够大。16 字节是否符合条件main()
    考虑将分配和复制字符串打包到一个函数中,即众所周知的strdup().
  5. 出于某种原因,标准strcpy()返回一个指向目标的指针。是的,返回一个指向 trminator 的指针是个好主意,但在命名函数时考虑遵循现有做法以避免令人不快的意外。
  6. 不要投射malloc().
  7. 此外,使用sizeof *pointer代替sizeof(TYPE),它可以减少未经检查的重复并避免错误。
  8. 不要假设成功。malloc()总是会失败。
  9. 一般来说,你应free()该做什么malloc()。但是,由于程序立即终止,这将是无用的。
  10. 隐式int在 C90 中已弃用,并在 C99 中删除。
  11. 隐式return 0;formain()出现在 C99 中,早期是Undefined Behavior (UB)。但是您已经使用了implicit int,当时已将其删除。会是什么?
  12. 尽管这不是代码审查,但我真诚地建议您在正确命名参数方面多做一些工作。任何出于任何原因阅读您的代码的人(目前主要是您自己)都会感激不尽。这并不意味着名称应该更长。
于 2018-10-30T15:35:25.000 回答
0

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

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

    *s2= '\0';
    return str2;
}
于 2018-10-30T15:18:08.860 回答