vs2008中为啥使用strcpy不安全而用strcpy_s替换(尽量详细点)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs2008中为啥使用strcpy不安全而用strcpy_s替换(尽量详细点)相关的知识,希望对你有一定的参考价值。

这是编译器的警告:
1>c:\users\lenovo\documents\visual studio 2008\projects\继承\继承\继承.cpp(22) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use

strcpy_s 函式是 strcpy 的安全版本,属于 ISO/IEC TR 24731 的标准, 某些 C 函式库支援这个函式,包含 Microsoft C Runtime Library(微软 C 语言执行时期函式库)。它与 strcpy 的不同在于,在它取得额外参数来决定目的缓冲区大小时,会因为发生溢位而出现错误,如此一来,就可以预防缓冲区溢位。由于 strcpy_s 对于 C 语言来说是新的函式,所以没有特别受到广泛支援。

例如, 我们有个数组: unsigned char buf[2];
当我们使用strcpy(buf, "1234567")时, 以buf为起点的*(buf+3)也就是buf[3]被写入值, 但是, 此时也许这个buf+3这个位置被其它的程序或变量使用时, 则会改变其它变量的值.
而strcpy_s(buf,2,"1234567")则告诉程序它只有两个字节, 此时, 程序不会将数据写入到 buf+3的地址中, 所以它更安全.
参考技术A 原型声明:extern char *strcpy(char *dest,const char *src);
实际使用时,要求调用前预先申请dest指针的内存空间,但是可能此空间的长度小于src的长度。此函数在复制字符串时,将会从src开始,一直碰到NULL为止,这样在复制时就可能超出dest的范围,导致内存错误。
strcpy_s多了一个dest空间长度的参数,会控制复制字符串的过程,不会越界,因而这个函数是安全的。

strcpy函数在VS2015无法使用的问题

一:原因:一般认为vs准备弃用strcpy的,安全性较低,所以微软提供了strcpy_s来代替

 然而,strcpy_s并没有strcpy好用,我们要想继续在VS2015中使用strcpy该怎么办 呢?下面是几种解决方法

解决方法:

  1.其实在下面的输出错误信息中有解决方法,“To disable deprecation , use _CRT_SECURE_NO_WARNINGS”,意思是我们可以不进行兼容性检查,我们可以在项目-属性-配置属性-c/c++-预处理器-预处理定义里边加上一句:_CRT_SECURE_NO_WARNINGS ,如下图所示

  2.也是在下面的输出信息中,我们可以看到有一处错误代号“ error C4996:”,所以我们可以在程序开头加上一句“#pragma warning(disable:4996)”就行,意思是忽略这个错误,如下图

  3.第三种方法是:我们可以在:项目-属性-配置属性-c/c++中的常规,里面有个SDL选项,关了。还有在代码生成中有个安全检查选项(/GS),关了。虽然这种方法也可以解决这个问题,但是我本人不太提倡这种解决办法,还是前两种解决方法比较好

 

以上是关于vs2008中为啥使用strcpy不安全而用strcpy_s替换(尽量详细点)的主要内容,如果未能解决你的问题,请参考以下文章

strcpy函数在VS2015无法使用的问题

C语言 显示strcpy出错 求大神解释 编译器是vs2013

VS2008和VS2010 的语法高亮插件 WordLight

为啥 VS 2008 IDE 不记得我的偏好?

VS2013 C++中的strcpy用不了,说换成strcpy_s,还是出现错误了。

strcpy和memcpy的区别