c - 在夹板的帮助下删除我的代码中的安全漏洞
问题描述
任何人都可以帮我修复此代码吗?由于我是 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()
不会终止目的地。 - 源代码确实应该是一个
const char*
允许 const 正确性并让编译器帮助捕获错误的源代码。 stringcopy()
期望目的地足够大。16 字节是否符合条件main()
?
考虑将分配和复制字符串打包到一个函数中,即众所周知的strdup()
.- 出于某种原因,标准
strcpy()
返回一个指向目标的指针。是的,返回一个指向 trminator 的指针是个好主意,但在命名函数时考虑遵循现有做法以避免令人不快的意外。 - 不要投射
malloc()
. - 此外,使用
sizeof *pointer
代替sizeof(TYPE)
,它可以减少未经检查的重复并避免错误。 - 不要假设成功。
malloc()
总是会失败。 - 一般来说,你应
free()
该做什么malloc()
。但是,由于程序立即终止,这将是无用的。 - 隐式
int
在 C90 中已弃用,并在 C99 中删除。 - 隐式
return 0;
formain()
出现在 C99 中,早期是Undefined Behavior (UB)。但是您已经使用了implicitint
,当时已将其删除。会是什么? - 尽管这不是代码审查,但我真诚地建议您在正确命名参数方面多做一些工作。任何出于任何原因阅读您的代码的人(目前主要是您自己)都会感激不尽。这并不意味着名称应该更长。
推荐阅读
- android - 使用 Firebase Auth 登录 Facebook:开发人员错误
- angular - 每当我将新数据传递给子组件时,ngx-pagination 就会中断
- android - 带有导航图的导航抽屉不起作用
- shell - 当我用所需的值定义数组时,它会在 shell 脚本中抛出错误
- python - 如何将选择列的行值与另一个数据框中的相同列进行比较?
- hana - 连接到 SAP HANA DB 时未加载 jdbc 驱动程序类
- php - 如何验证仅包含特定字母和数字的字符串?
- sql - 找出丢失的备用号码
- python - 如何序列化 Django View 对象?
- php - Linux Gif 生成问题视频到使用 FFMPEG 生成动画 Gif