`

去掉VC++2005、2008的安全警告提示

 
阅读更多

将过去的工程用VS2005打开的时候。你有可能会遇到一大堆的警告:warning C4996。
比如:warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

原因是Visual C++ 2005使用了更加安全的run-time library routines。
新的Security CRT functions(就是那些带有“_s”后缀的函数):
http://msdn2.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx

那么如何搞定这些警告呢:
方法一:手工将原来的旧函数替换成新的Security CRT functions。
方法二:屏蔽这个警告。
在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
或者#param warning(disable:4996)

方法二没有使用新的更安全的CRT函数,显然不是一个值得推荐的方法,可是你又不想一个一个地改。
那么还有一个更方便的方法:

在预编译头文件stdafx.h里(同样要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
链接的时候便会自动将旧函数替换成
Security CRT functions。
注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二。。。

在网上搜索到的最常用的解决方案,那就是定义 _CRT_SECURE_NO_DEPRECATE _SCL_SECURE_NO_DEPRECATE 来禁止vc2005对此产生警告(依然使用的是非安全库!0显然并不是一个好的解决方案)。而且如果使用了ATL,则还需要定义 _ATL_SECURE_NO_DEPRECATE 使用了MFC则需要定义 _AFX_SECURE_NO_DEPRECATE
然而尽管如此,更好的解决方案只需要定义一个宏 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么vc将会自动替换使用他们的Safe Library来代替C/C++标准库(strcat将被strcat_f来取代)

即使使用了_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,代码将依旧不够安全:(, 对此,ms提出了如下10点建议:
1.
不要认为 strcpy_s strncpy_s( 以及其他的字符串函数)(在空间不够的时候)会自动终止拷贝(truncate截断,不截断则意味着溢出).如果需要自动截断,请使用strncpy_s (同时使用_TRUNCATE作为长度参数)
2.
记住fopen_s缺省是独占模式。如需共享使用文件,应该使用_sopen
3.
别忘了_dupenv_s, 它将比_getenv_s更容易使用,因为它能自动分配一个正确长度的内存(buffer)
4.
scanf_s中小心参数顺序。
5.
确定printf_s中格式字符串的正确。
6.
使用_countof(x)来取代sizeof(x)/sizeof(element). _countof将会正确的计算元素个数,而且如果x是一个指针,编译器将会发出一个警告(来提醒程序员,仅针对C++编译)
7.
记住所有的sizes(大小,非长度)都是使用characters(字符,unicode下一个字符占2byte)作为单位,而不是bytes(字节).
8.
记住所有的sizes(大小,非长度,缘由同上)包含了字符串结束符'/0'(即别忘了很多情况下size需要+1)
9.
调试的时候监视数据0xfd (在调试版本下)0xfd将会被填充在数据(buffer,通常是字符串)的结尾处。如果运行非你所愿,可能会得到一个长度错误。
10.
检查所有的错误。 许多新函数相比旧函数,能返回(表示)错误信息(的数值)

从ANSI改到Unicode主要有如下几点:
1.char --> TCHAR
2.字符串前面增加 _T,如"Hello World" 改为 _T("Hello World);
3.strcpy等字符串操作函数改为 StrCpy;
4.LPSTR改为LPTSTR, LPCSTR改为LPCTSTR
5.对于函数定义中使用char、char*类型参数的,需要进行相应的字符串转换

分享到:
评论

相关推荐

    去掉打开文件时提示安全警告的界面(XP / Windows7)

    去掉打开文件时提示安全警告的界面(XP / Windows7)

    去掉ME里的html警告提示

    去掉ME里的html警告提示

    去除打开文件时的安全警告

    去除每次打开文件时的安全警告!每次打开程序都会弹出安全警告!直接运行BAT即可!

    VC++聊天程序源码

    该程序使用vc++6.0开发,编译源程序: 1. 去掉“只读”属性。 2. 编译不受源文件位置和数据库位置的影响。即,chat的整个工程复制到任何地方都可编译。 运行Realease: 1. 确认已安装VC 6.0。 2. 参考该书第4章的...

    VC++ 图像文字提取

    《VC++ 图像文字提取》项目,是采用vc++和opencv技术对单张的图片进行分析,提取出图片上面的文字信息,去掉杂余的信息(图案等)形成新的只含有文字的图片。

    vc++6.0俄罗斯方块

    基于vc++6.0的游戏代码,有助于初学者学习,提高编程兴趣

    郁金香VC++外挂编程全集中级篇2.1.6part02

    编程语言,VC++6.0 工具主要为(OD1.1,CE5.4) 预计平均3天左右更新一课 大家好,我是郁金香老师:QQ150330575 欢迎大家参加梅州技术 VC++外挂编程VIP培训班。 在接下来的一段时间将由我和大家一起学习游戏外挂的分析...

    Javascript/HTML把文本框中前后的空格去掉,并把去掉后的字符通过警告对话框显示出来.html

    建立一个简单界面,把文本框中前后的空格去掉,并把去掉后的字符通过警告对话框显示出来,人练习捣鼓出来的东西,希望对小白们有所帮助

    VC++编程聊天程序

    编译源程序: 1. 去掉“只读”属性。 2. 编译不受源文件位置和数据库位置的影响。即,chat的整个工程复制到任何地方都可编译。 运行Realease: 1. 确认已安装VC 6.0。 2. 参考该书第4章的内容操作。。

    VC++人脸识别代码

    人脸识别毕业设计代码,图像处理有:光线补偿、皮肤颜色建模、膨胀、腐蚀、去掉假区域、再次膨胀、再次腐蚀、得到人脸区域、Cr匹配、Cb匹配、眼睛的色度匹配、眼睛的亮度匹配、眼睛双重匹配、去掉假眼睛区域、膨胀...

    FreeEIM 飞鸽传书仿QQ即时通讯软件VC++源代码

     本软件的窗口和功能都与QQ有点相似,可发送文件、窗口抖动、发送表情等修改功能,并尽量去除所有不相关内容,坚决不对用户敏感内容作任何操作(例如注册表)。为了让软件100%绿色,FreeEIM飞鸽传书把唯一一处修改...

    VC++ 指纹识别系统源代码

    VC++ 指纹识别系统的源代码,一个学士学位的毕业设计。 内容简介: 由于指纹所具有的唯一性和不变性,以及指纹识别技术具有很高的可行性和实用性,指纹识别成为目前最流行、最可靠的个人身份认证技术之一。 本论文对...

    通过注册表去掉IE8的安全提示信息

    当ie浏览器里的Active都启用以后,IE8会出现一个安全提示的信息,操作ie时极不方便想要取出此提示下载这个压缩包,解压以后直接运行,可以去掉ie8的安全提示。

    《VC++.NET精彩百例》配套代码

    《VC++.NET精彩百例》配套代码 <br/> [涉及平台] VC++.NET [作者] void [文件大小] 2969KB [更新日期] 2005-10-30 <br/>一、资源说明 <br/>第1章 界面编程 实例1 "欢迎"界面 ...

    VC++类型转换详解

    对VC++常用数据类型的解释和数据类型之间的相互转换

    郁金香VC++外挂编程全集中级篇2.1.3part02

    编程语言,VC++6.0 工具主要为(OD1.1,CE5.4) 预计平均3天左右更新一课 大家好,我是郁金香老师:QQ150330575 欢迎大家参加梅州技术 VC++外挂编程VIP培训班。 在接下来的一段时间将由我和大家一起学习游戏外挂的分析...

    图书管理系统 VC++ SQL2000 数据库

    先去除所有文件的只读属性 然后添加database里的数据库到sql2000 最后直接运行可执行程序。(请确认文件stdafx.h中此语句:#import "D:\program files\common files\system\ado\msado15.dll"的msado15.dll在盘若在C...

    cad去除教育版提示

    cad去除教育版提示,双击开启,用CAD打开有教育版的DWG不再提示教育版

    VC++完全自学手册源码

    VC++完全自学手册一书中的源码,已经去除了临时文件。

    vc++ sp6 中文企业版 for win10.1809

    VC++SP6中文企业版 for win10.1809ltsc 说明: win03,win7x64,win08r2,win10.1809 1、至2018.10月所有版本windows操作系统 均有测试,完美通过。 2、不要安装、、不要安装、、不要安装: 某一个选项 即将默认的 ...

Global site tag (gtag.js) - Google Analytics