有人可以帮助我修复此代码吗?我不太了解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);
}
答案 0 :(得分:1)
stringcopy()
不会终止目的地。const char*
,以实现const正确性并允许编译器帮助捕获错误。stringcopy()
期望目的地足够大。 16个字节是否符合main()
中的要求?strdup()
。strcpy()
返回一个指向目标的指针。是的,最好将指针返回到终止符,但是在命名该函数时consider following existing practice可以避免令人不愉快的意外。malloc()
. sizeof *pointer
代替sizeof(TYPE)
,这样可以减少未经检查的重复并避免错误。malloc()
总是会失败。free()
malloc()
。但是,由于该程序立即终止,因此这是毫无用处的工作。int
is deprecated in C90, and removed in C99. return 0;
的隐式main()
出现在C99中,早于Undefined Behavior (UB)。但是您已经使用了隐式int
,该隐式在那时已被删除。应该是什么?答案 1 :(得分:0)
您的stringcopy
不会终止复制的字符串。此外,返回源字符串的 end 并没有太多用处。以下是建议:
char *stringcopy(char *str1, char *str2)
{
char *s2= str2;
while (*s2)
*str1++ = *s2++;
*s2= '\0';
return str2;
}