解决CRT(即C Run-Time)中函数的安全警告

解决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 
  );

多了第二个参数,就是目标缓冲区的大小,所以调用时加上就行了。


你可能感兴趣的:(c,Microsoft,Security,include,features,Warnings)