有的时候写的代码明明没有什么问题就是编译不过,我就觉得奇怪了。我是编译通过的代码,怎么就有问题呢?在VS2015运行,还真是有问题。看错误提示,是VS将这个函数的使用当做错误对待了! 在以前的VS版本中,检测并不严格,对于很多警告,我们程序员通常都是忽略,只要不报错,懒得管。可能是微软发现了这个情况,做了更严格的检测。将这些警告变成了错误,所以,就让你编译通不过了。这样逼着你用一种安全模式的函数版本,就是在后面加上_s,_s表示safe,代表安全版本,编译时会做一定的安全检测。以前曾研究过,实际上这并不能百分之百杜绝安全问题。 安全版函数只是做了有限的检测而已,可以杜绝一些问题而已。现在VS2015竟然做到这个地步,逼得这么紧。这不仅是Windows 10安全性变高了,而且还要逼程序员提高安全性编码呀!开始我还以为降低警告安全级别即可,实际上并不行。警告级别是设置VS检测警告的范围程度,但是这个问题归结为了错误,就不是警告所能设置的。为什么会出现这个问题呢?在创建项目时,或许你会发现,在创建项目向导时多了一个选项,而且是默认选中的,那就是“安全开发生命周期(SDL)检查(C)”。如下图所示: 默认这个检查之后,再也不能好好撸代码了。对代码做了很多安全性检测,也是防止很多错误出现。这样的话,就将这些警告变成了错误来提醒,促使你更加安全的编写代码咯。 如果你想自己代码更加安全些,少些Bug,可以和前面说的那样,使用_s版的安全版函数即可。反正出现过SDL的项目,就会有这样的问题。所以注意一下。我想很多人对于SDL都很陌生吧,这里就了解一下咯。 虽然安全开发生命周期(SDL)检查是可以防止一些错误发生,提高一定的安全性,但是,安全版本的函数并不是百分百安全的,程序员还是需要注意。 ######################################################## Visual Studio开启了SDL检查后,某些警告会成为错误,是程序编译不通过,例如: error C4703: 使用了可能未初始化的本地指针变量 error C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See online help for details. 等。。。 关闭SDL检查后就好了。 当然,最好是修改代码,使用错误提示中的修改。 但是某些情况下代码不允许修改,就需要关闭SDL检查。 什么是SDL检查微软正在积极开发的Visual Studio11,不断寻找方法,以提高安全相关的功能。作为这项工作的一部分,我们正在更新一些增强/ GS编译器开关,这是默认,使基层的代码生成的安全功能,超越了现在熟悉的基于cookie的堆栈溢出保护。这些在以后的文章,我们将提供一些细节。 那么,是什么/ SDL开关吗?
一个开发人员如想以选择大部分的/ SDL的功能,但排除一个给定的警告编号(假设为例C4146)然后这可以通过在/ WD开关以禁用彗星/彗星++下,具体警告实现 - >命令行 - >附加选项在Visual Studio的用户界面: strict_gs_check pragma是适用于所有的C/ C + +代码编译/ SDL。这指示编译器将考虑作为潜在的堆栈缓冲区溢出保护候选人更多的功能。Visual Studio 2010中引入的GS优化得到了提高strict_gs_check一起更好地工作,特别是使许多额外的安全检查从strict_gs_check被证明是不必要的和删除。 转载: https://blog.csdn.net/bytxl/article/details/46706215 ######################################################## |
|