gpt4 book ai didi

c - 在夹板的帮助下消除代码中的安全缺陷

转载 作者:行者123 更新时间:2023-11-30 20:58:19 26 4
gpt4 key购买 nike

有人可以帮我修复这个代码吗?我不太了解,因为我是 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

最佳答案

  1. 您缺少包含内容。
  2. 您的stringcopy()不会终止目的地。
  3. 来源确实应该是 const char*允许常量正确性并让编译器帮助捕获错误。
  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() 。但由于程序立即终止,因此 make-work 毫无用处。
  10. Implicit int is deprecated in C90, and removed in C99.
  11. 隐式return 0;对于 main()出现在C99中,早些时候是Undefined Behavior (UB) 。但你已经使用了隐式 int ,当时就被删除了。会是什么?
  12. 尽管这不是代码审查,但我真诚地建议您花更多的精力来正确命名参数。任何出于任何原因阅读你的代码的人(目前主要是你自己)都会感激不已。但这并不意味着名称应该更长。

关于c - 在夹板的帮助下消除代码中的安全缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53065454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com