您的位置:首页 > 其它

VS2010工程迁移到VS2013(或VS2015)遇到的SDL问题

2016-07-21 09:13 253 查看
        SDL的全称是“安全开发生命周期检查”(Safe Development Life-period Check),它是VS2012及之后版本新增的一项“C/C++编译选项”。它会启用附加安全检查,这些检查包括额外的被视为错误的安全相关警告以及其他安全代码生成功能。

        MSDN的官方说明如下:点击打开链接

        它包含“编译时检测”和“运行时检测”,如下:


编译时检查



/sdl 启用以下被视为错误的警告:

/sdl 启用的警告
等效的命令行开关
说明
C4146
/we4146
将一元减号运算符应用于无符号类型,并生成了无符号的结果。
C4308
/we4308
将负整型常数转换为无符号类型,并生成了可能无意义的结果。
C4532
/we4532
在 continue/break 块中使用 goto__finally 或 finally 已在异常终止期间取消定义了行为。
C4533
/we4533
初始化变量的代码不会执行。
C4700
/we4700
使用未初始化的局部变量。
C4703
/we4703
使用可能未初始化的局部指针变量。
C4789
/we4789
使用特定 C 运行时 (CRT) 函数时缓冲区溢出。
C4995
/we4995
使用标记有杂注 deprecated 的函数。
C4996
/we4996
使用标记有 deprecated 的函数。


运行时检查



启用 /sdl 后,编译器将生成在运行时执行这些检查的代码:

启用 /GS 运行时缓冲区溢出检测的严格模式,等同于使用 #pragma strict_gs_check(push, on) 进行编译。

执行有限的指针清理。在不涉及取消引用的表达式中以及没有用户定义的析构函数的类型中,在调用 delete 后,指针引用将设置为无效的地址。这有助于防止重复使用已过时的指针引用。

执行类成员初始化。在对象实例化时自动将所有类成员初始化为零(在构造函数运行前)。这有助于防止使用与构造函数未显式初始化的类成员关联的未初始化的数据。


在 Visual Studio 开发环境中设置此编译器选项

打开项目的“属性页”对话框。有关详细信息,请参阅如何:打开项目属性页

选择 C/C++ 文件夹。

“常规”页上,从“SDL 检查”下拉列表中选择选项。

        该编译选项在VS2013及以后版本,默认为开启状态。故将VS2010的工程迁移到VS2015时,就会触发与它相关的编译错误(不管是通过“双击.sln文件”自动升级,还是新建工程,拷贝代码的方式)。

        最常见的编译错误是上表列出的“C4996”——“使用标记有deprecated函数”。

        这些被启用的函数包括:“strcpy”等字符串操作函数和”inet_addr“等socket函数。解决的办法有两种:一是使用新的微软推荐的安全函数逐个代替这些被弃用的函数;二是将SDL编译选项关闭。

        此外,在VS2015新建console等类型工程的时候,在”应用程序设置对话框“中就有该选项:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: