借助夹板消除代码中的安全漏洞

时间:2018-10-30 13:30:45

标签: 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));

    stringcopy(buffer, argv[1]);

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

Splint output

2 个答案:

答案 0 :(得分:1)

  1. 您缺少包含项。
  2. 您的stringcopy()不会终止目的地。
  3. 该源实际上应该是const char*,以实现const正确性并允许编译器帮助捕获错误。
  4. stringcopy()期望目的地足够大。 16个字节是否符合main()中的要求?
    考虑将分配和复制字符串打包到一个函数中,该函数称为strdup()
  5. 由于某种原因,标准strcpy()返回一个指向目标的指针。是的,最好将指针返回到终止符,但是在命名该函数时consider following existing practice可以避免令人不愉快的意外。
  6. Do not cast the result of malloc().
  7. 另外,使用sizeof *pointer代替sizeof(TYPE),这样可以减少未经检查的重复并避免错误。
  8. 不要以为成功。 malloc()总是会失败。
  9. 通常,您应该free() malloc()。但是,由于该程序立即终止,因此这是毫无用处的工作。
  10. Implicit int is deprecated in C90, and removed in C99.
  11. return 0;的隐式main()出现在C99中,早于Undefined Behavior (UB)。但是您已经使用了隐式int,该隐式在那时已被删除。应该是什么?
  12. 即使这不是代码审查,我仍恳切建议您在正确命名参数方面做更多工作。任何出于任何原因(目前主要是您自己)阅读代码的人都会感激不尽。但这并不意味着名称应该更长。

答案 1 :(得分:0)

您的stringcopy不会终止复制的字符串。此外,返回源字符串的 end 并没有太多用处。以下是建议:

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

    *s2= '\0';
    return str2;
}