当前位置:C++技术网 > 资讯 > 安全开发生命周期SDL检查提高程序安全,但安全版函数并不会百分百安全

安全开发生命周期SDL检查提高程序安全,但安全版函数并不会百分百安全

更新时间:2015-10-19 21:53:24浏览次数:1+次

    在写Windows零基础入门教程的时候,在Win32环境下,我想格式化一下字符串,格式化到一个变量中,所以用到了swprintf函数。
    因为有时候我用的是VS2010,有时候用的是VS2015.因为我觉得这个并不影响我们的基础课程的讲解。然而,在VS2010中用了函数swprintf,结果编译时提示警告。不过呢,对于VS的警告,我们一般都忽略了。不过这次发现,出问题了。
    倒不是内存错误等问题,而是IDE的问题。我在VS2010环境下是通过编译的,只是有警告提示。对于这个函数的使用,我们还不至于出错。所以,也没有管他。然后有一个学习我们windows零基础入门课程的朋友就在自己的电脑运行了代码,用的是VS2015,结果呢,发现编译错误,提示swprintf函数有问题。
    我就觉得奇怪了。我是编译通过的代码,怎么就有问题呢?然后我就把代码放在VS2015运行,还真是有问题。这坑爹的货!看了错误提示,是VS将这个函数的使用当做错误对待了!错误提示如下:
error C4996: 'swprintf': function has been changed to conform with the ISO C standard, adding an extra character count parameter. To use the traditional Microsoft version, set _CRT_NON_CONFORMING_SWPRINTFS.
1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\corecrt_wstdio.h(1820): note: 参见“swprintf”的声明

     在以前的VS版本中,检测并不严格,对于很多警告,我们程序员通常都是忽略,只要不报错,懒得管。可能是微软发现了这个情况,做了更严格的检测。将这些警告变成了错误,所以,就让你编译通不过了。这样逼着你用一种安全模式的函数版本,就是在后面加上_s,比如:

swprintf_s(szTip, _T("刷新次数:%d"), i++);
     _s表示safe,代表安全版本,编译时会做一定的安全检测。以前曾研究过,实际上这并不能百分之百杜绝安全问题。可以参考之前的总结《安全版函数、字符编码和预编译错误提示问题总结》。
    安全版函数只是做了有限的检测而已,可以杜绝一些问题而已。现在VS2015竟然做到这个地步,逼得这么紧。这不仅是Windows 10安全性变高了,而且还要逼程序员提高安全性编码呀!
    开始我还以为降低警告安全级别即可,实际上并不行。警告级别是设置VS检测警告的范围程度,但是这个问题归结为了错误,就不是警告所能设置的。为什么会出现这个问题呢?
    在创建项目时,或许你会发现,在创建项目向导时多了一个选项,而且是默认选中的,那就是“安全开发生命周期(SDL)检查(C)”。如下图所示:


    安全开发生命周期SDL检查
    默认这个检查之后,再也不能好好撸代码了。对代码做了很多安全性检测,也是防止很多错误出现。这样的话,就将这些警告变成了错误来提醒,促使你更加安全的编写代码咯。
    如果开始你不知道,然后就默认勾上了,没关系,你可以在项目属性中去掉这个设置。第一步就是点开项目的属性对话框,如下图所示:
    VS项目属性
    然后找到“安全开发生命周期(SDL)检查(C)”,然后设置为“否”,然后确定,OK搞定!如下图所示:
    取消安全开发生命周期SDL检查
    这样就可以和以前一样放心撸代码了。这样是让限制更少,但是你自己一定要注意不要用错了,出错的责任就是你自己了。
    如果你想自己代码更加安全些,少些Bug,可以和前面说的那样,使用_s版的安全版函数即可。反正出现过SDL的项目,就会有这样的问题。所以注意一下。我想很多人对于SDL都很陌生吧,这里就了解一下咯。
    虽然安全开发生命周期(SDL)检查是可以防止一些错误发生,提高一定的安全性,但是,安全版本的函数并不是百分百安全的,程序员还是需要注意。