为什么strcpy_s比strcpy更安全?

问题描述 投票:-2回答:2

[当我尝试使用strcpy功能时,Visual Studio给我一个错误

error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

[在线搜索并从StackOverflow获得许多答案之后,总结为,将大字符串复制到较短的字符串时,strcpy_sstrcpy安全。因此,我尝试了以下代码来处理较短的字符串:

char a[50] = "void";
char b[3];
strcpy_s(b, sizeof(a), a);
printf("String = %s", b);

代码成功编译。但是,仍然存在运行时错误:enter image description here

那么scrcpy_s的安全性如何?我是否理解安全性概念错误?

c string strcpy
2个回答
0
投票

C的头定义是:

    errno_t strcpy_s(char *dest,rsize_t dest_size,const char *src)

您的示例的调用应为:

    #include <stdlib.h>

    char a[50] = "void";
    char b[3];
    strcpy_s(a, _countof(a), (const char*)b);
    printf("String = %s", b);

0
投票

strcpy_s需要目标的大小,小于示例中的源。

strcpy_s(b, sizeof(b), a);

将是要走的路。

关于安全概念,现在已经进行了许多检查,并且有更好的错误处理方法。

在您的示例中,如果您使用strcpy,将触发缓冲区溢出。其他功能,例如strncpy或strlcpy,将复制前3个字符而没有任何空字节终止符,这又将触发缓冲区溢出(这次是读取)。

© www.soinside.com 2019 - 2024. All rights reserved.