[当我尝试使用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_s
比strcpy
安全。因此,我尝试了以下代码来处理较短的字符串:
char a[50] = "void";
char b[3];
strcpy_s(b, sizeof(a), a);
printf("String = %s", b);
那么scrcpy_s
的安全性如何?我是否理解安全性概念错误?
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);
strcpy_s需要目标的大小,小于示例中的源。
strcpy_s(b, sizeof(b), a);
将是要走的路。
关于安全概念,现在已经进行了许多检查,并且有更好的错误处理方法。
在您的示例中,如果您使用strcpy,将触发缓冲区溢出。其他功能,例如strncpy或strlcpy,将复制前3个字符而没有任何空字节终止符,这又将触发缓冲区溢出(这次是读取)。