我是一个初学者,现在我正在学习如何用C语言复制字符串。
这是我刚刚遇到的一个问题:
每次我尝试使用"strcpy“命令从字符串1复制到字符串2时,Visual Studio2013都会给我一个错误/警告消息,告诉我"strcpy”是不安全的,并建议我使用strcpy_s。
你能解释一下为什么使用strcpy是不安全的吗?还有什么是strcpy更安全的替代方案?
下面是我的代码:
#include<stdio.h>
#include<string.h>
main()
{
char str1[] = "Copy a string.";
char str2[15];
char str3[15];
int i;
/* with strcpy() */
strcpy(str2, str1);
/* Without strcpy() */
for (i = 0; str1[i]; i++)
str3[i] = str1[i];
str3[i] = '\0';
/* Display str2 and str3 */
printf("The content of str2: %s\n", str2);
printf("The content of str3: %s\n", str3);
return 0;
}
附注:我在Windows 7 64位旗舰版上使用Visual Studio 2013 64位旗舰版。谢谢您抽时间见我!
发布于 2014-04-27 07:33:31
strcpy无法知道目标缓冲区有多大(即没有长度参数),因此草率地使用它进行编程可能会导致缓冲区溢出并损坏其他内存。这样的溢出可能导致崩溃,奇怪的行为,并可能被恶意软件作者利用。
顺便说一句,看看接受长度参数的strncpy。需要注意的一个问题是,如果缓冲区太小,strncpy将不会终止字符串,因此它本身就很危险。
对于您的评论/问题的回答-这将取决于上下文。如果您知道缓冲区足够大(例如,您在前一行中以正确的大小分配了它),请使用strcpy。如果有任何溢出的可能性,则使用strncpy,并确保将缓冲区中的最后一个位置设置为null。请注意,“任何可能性”应该解释得非常宽宏大量-除非前面的五六行足以显示安全性,否则请使用strncpy。
最后,如果你真的使用strncpy_s,你可能想要添加一个#杂注来抑制该位置的警告。
发布于 2014-04-27 08:04:51
这是你的原始代码:
int main() {
char str1[] = "Copy a string.";
char str2[15];
strcpy(str2, str1);
}
现在,三天后,你去编辑这段代码。您已经意识到,实际上需要编写消息"This code is copying a string."
。
int main() {
char str1[] = "This code is copying a string.";
char str2[15];
strcpy(str2, str1);
}
但是,您现在意外地引入了一个缓冲区溢出。
strcpy_s
需要str2
长度的额外参数。这样,虽然您可能无法将整个字符串放入新的缓冲区中,但您不会导致未定义的行为。
发布于 2014-04-27 08:03:01
与strncpy和strcpy_s不同,strcpy不会对目标缓冲区进行任何长度检查,这可能会导致堆栈溢出,从而允许攻击者在被利用时执行恶意代码或使您的应用程序崩溃
https://stackoverflow.com/questions/23317646
复制相似问题