解决CRT(即C Run-Time)中函数的安全警告
参考MSDN
1、Security Features in the CRT
2、Secure Template Overloads
是不是有时候碰到这样的警告:
warning C4996: 'strcpy': This functionor variable may be unsafe. Consider using strcpy_s instead. To disabledeprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\program files\microsoft visualstudio 10.0\vc\include\string.h(105) :参见“strcpy”的声明
解决方法
一、#define _CRT_SECURE_NO_WARNINGS 来忽略这些警告信息。
把这个宏定义放在源文件的最前面,必须在最前面,就是在包含头文件之前。
这个方法只是忽略了警告信息,并不能消除安全隐患。
二、使用Secure Template Overloads
2.1、#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
把这个宏定义放在源文件最上面来解决。举个MSDN上的例子如下:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #include <stdio.h> #include <string.h> int main() { char szBuf[10]; strcpy(szBuf,"test"); // ==> strcpy_s(szBuf, 10, "test") }
例子中这个模版能把strcpy转变为strcpy_s,从而测定消除安全隐患。默认情况下,
_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES被定义为0,所以想用这种方法必须显示的定义它为1
2.2、#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
把这个把这个宏定义放在源文件最上面来解决,但源文件的改变一下,举个MSDN上的例子:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 #include <stdio.h> #include <string.h> int main() { char szBuf[10]; strcpy_s(szBuf,"test"); // ==> strcpy_s(szBuf, 10, "test") }
例子中把strcpy改为strcpy_s而参数没有变化,就是这个模版把它有原来的strcpy的两个参数转变成了strcpy_s三个参数。从而测定消除安全隐患,注意默认情况下:CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES就定义为1,所以我们其实没必要写上面的宏定义,只要简单的把strcpy改为strcpy_s即可。
上面两种方法需要注意的就是,它们只对一些函数有用,比如这里的strcpy,有些是不能这个做的,这时候你就要老老实实的按照新函数的参数设置来重新调用。也就是下面的方法三,最有效的。
另外方法二只适应与静态数组,不适用于动态数组。
三、按照新函数的参数要求,重新调用新函数,比如上面的例子中:
strcpy_s的函数声明如下:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
多了第二个参数,就是目标缓冲区的大小,所以调用时加上就行了。