首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么strcpy在C中是不安全的?

为什么strcpy在C中是不安全的?
EN

Stack Overflow用户
提问于 2014-04-27 07:31:22
回答 3查看 24.1K关注 0票数 6

我是一个初学者,现在我正在学习如何用C语言复制字符串。

这是我刚刚遇到的一个问题:

每次我尝试使用"strcpy“命令从字符串1复制到字符串2时,Visual Studio2013都会给我一个错误/警告消息,告诉我"strcpy”是不安全的,并建议我使用strcpy_s。

你能解释一下为什么使用strcpy是不安全的吗?还有什么是strcpy更安全的替代方案?

下面是我的代码:

代码语言:javascript
运行
复制
#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位旗舰版。谢谢您抽时间见我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-27 07:33:31

strcpy无法知道目标缓冲区有多大(即没有长度参数),因此草率地使用它进行编程可能会导致缓冲区溢出并损坏其他内存。这样的溢出可能导致崩溃,奇怪的行为,并可能被恶意软件作者利用。

顺便说一句,看看接受长度参数的strncpy。需要注意的一个问题是,如果缓冲区太小,strncpy将不会终止字符串,因此它本身就很危险。

对于您的评论/问题的回答-这将取决于上下文。如果您知道缓冲区足够大(例如,您在前一行中以正确的大小分配了它),请使用strcpy。如果有任何溢出的可能性,则使用strncpy,并确保将缓冲区中的最后一个位置设置为null。请注意,“任何可能性”应该解释得非常宽宏大量-除非前面的五六行足以显示安全性,否则请使用strncpy。

最后,如果你真的使用strncpy_s,你可能想要添加一个#杂注来抑制该位置的警告。

票数 11
EN

Stack Overflow用户

发布于 2014-04-27 08:04:51

这是你的原始代码:

代码语言:javascript
运行
复制
int main() {
    char str1[] = "Copy a string.";
    char str2[15];

    strcpy(str2, str1);
}

现在,三天后,你去编辑这段代码。您已经意识到,实际上需要编写消息"This code is copying a string."

代码语言:javascript
运行
复制
int main() {
    char str1[] = "This code is copying a string.";
    char str2[15];

    strcpy(str2, str1);
}

但是,您现在意外地引入了一个缓冲区溢出。

strcpy_s需要str2长度的额外参数。这样,虽然您可能无法将整个字符串放入新的缓冲区中,但您不会导致未定义的行为。

票数 2
EN

Stack Overflow用户

发布于 2014-04-27 08:03:01

与strncpy和strcpy_s不同,strcpy不会对目标缓冲区进行任何长度检查,这可能会导致堆栈溢出,从而允许攻击者在被利用时执行恶意代码或使您的应用程序崩溃

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23317646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档