我刚刚通过C库函数来查看我可以用它们做什么。当我遇到strcpy函数时,我写的代码导致了分段错误,我想知道原因。我写的代码应该是打印WorldWorld。如果我理解正确,strcpy(x,y)会将y的内容复制到x。
main() {
char *x = "Hello";
char *y = "World";
printf(strcpy(x,y));
}
答案 0 :(得分:2)
如果有效,您编写的代码将打印“World”,而不是“WorldWorld”。没有附加任何内容,strcpy
仅覆盖数据。
您的程序崩溃是因为"Hello"
和"World"
是字符串常量。尝试写入常量是未定义的行为,在您的情况下,这表现为分段错误。您应该使用char x[] = "Hello";
和char y[] = "World";
来保留堆栈中的内存来保存字符串,它们可以被覆盖。
但您的计划存在更多问题:
首先,您应该从不传递变量字符串作为printf
的第一个参数:使用puts
或使用printf("%s", string)
。将变量作为格式字符串传递可防止支持类型检查printf
参数的编译器执行该验证,如果用户可以控制它,它可能会转变为严重漏洞。
其次,你应该从不使用strcpy
。 Strcpy
很乐意超越缓冲区,这是另一个主要的安全漏洞。例如,如果你写了:
char foo[] = "foo";
strcpy(foo, "this string is waaaaaay too long");
return;
您将导致未定义的行为,您的程序将再次崩溃,并且您打开了通过指定目标缓冲区大小可以避免的其他严重漏洞的大门。
AFAIK,实际上没有可以正确复制字符串的标准C函数,但最不好的是strlcpy
,这还需要一个大小参数。