C 借助splint消除代码中的安全缺陷
有人能帮我修复这个代码吗?我不太懂,因为我是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));
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正确性,并让编译器帮助捕获bugstringcopy()
希望目标足够大。在main()
中,16个字节符合该条件吗?考虑将一个字符串打包并复制到一个函数中,称为
strcpy()
返回指向目标的指针。是的,返回一个指向trminator的指针是个好主意,但是在命名函数时要避免令人不快的意外sizeof*指针
而不是sizeof(TYPE)
,这样可以减少未检查的重复并避免错误free()
您所需要的malloc()
。但由于程序立即终止,因此无法正常工作返回0前面的C99中出现了main()
的code>。但是您已经使用了implicitint
,这在当时已被删除。那是什么
@我没有告诉OP把它迁移到CR,那是另一个人。如果将其更改为a并将lint日志作为文本发布,则可能更适合这样做。我们不应该让用户在两个站点之间处于犹豫状态。我将收回我的反对票。@PerKristianGravdal很抱歉,您在评论中得到了相互矛盾的建议,我们似乎有点困惑:)请执行以下操作来修复此处的帖子(单击“编辑”):1)编辑此处的代码,包括您用来编译的完整版本,包括
\include
指令。如果编译器给了您任何警告/错误,请也发布这些警告/错误。2) 将Lint消息图片替换为文本。您应该能够从终端复制/粘贴。3) 请提及所使用的编译器,因为它似乎是一个过时的编译器。我发现有趣的是,splint的长时间抱怨似乎没有提到这里的关键安全问题,即stringcopy
对避免缓冲区溢出没有任何作用。当然,这是一个API设计问题,但它也是strcpy
的一个众所周知的问题,我想这个函数是用来替换它的。(缺少NUL终止是另一个问题。splint也没有检测到。)就个人而言,我建议将此工具留到以后,集中精力编写正确的代码。@rici我想说的是,stringcopy()
的任务显然不是检测或防止这种情况,而是调用代码。“这并不是说这会让情况变得更好。@重复数据消除者:我同意,但我不认为这会改变夹板输出的问题。