VS2010工程迁移到VS2013(或VS2015)遇到的SDL问题
2016-07-21 09:13
253 查看
SDL的全称是“安全开发生命周期检查”(Safe Development Life-period Check),它是VS2012及之后版本新增的一项“C/C++编译选项”。它会启用附加安全检查,这些检查包括额外的被视为错误的安全相关警告以及其他安全代码生成功能。
MSDN的官方说明如下:点击打开链接
它包含“编译时检测”和“运行时检测”,如下:
编译时检查
/sdl 启用以下被视为错误的警告:
运行时检查
启用 /sdl 后,编译器将生成在运行时执行这些检查的代码:
启用 /GS 运行时缓冲区溢出检测的严格模式,等同于使用 #pragma strict_gs_check(push, on) 进行编译。
执行有限的指针清理。在不涉及取消引用的表达式中以及没有用户定义的析构函数的类型中,在调用 delete 后,指针引用将设置为无效的地址。这有助于防止重复使用已过时的指针引用。
执行类成员初始化。在对象实例化时自动将所有类成员初始化为零(在构造函数运行前)。这有助于防止使用与构造函数未显式初始化的类成员关联的未初始化的数据。
打开项目的“属性页”对话框。有关详细信息,请参阅如何:打开项目属性页。
选择 C/C++ 文件夹。
在“常规”页上,从“SDL 检查”下拉列表中选择选项。
该编译选项在VS2013及以后版本,默认为开启状态。故将VS2010的工程迁移到VS2015时,就会触发与它相关的编译错误(不管是通过“双击.sln文件”自动升级,还是新建工程,拷贝代码的方式)。
最常见的编译错误是上表列出的“C4996”——“使用标记有deprecated函数”。
这些被启用的函数包括:“strcpy”等字符串操作函数和”inet_addr“等socket函数。解决的办法有两种:一是使用新的微软推荐的安全函数逐个代替这些被弃用的函数;二是将SDL编译选项关闭。
此外,在VS2015新建console等类型工程的时候,在”应用程序设置对话框“中就有该选项:
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等类型工程的时候,在”应用程序设置对话框“中就有该选项:
相关文章推荐
- js ajax方式拼接参数
- 杭电oj-1321
- [李景山php]thinkphp核心源码注释|Firebird.class.php
- position、float属性
- OSX安装express-generator,并创建Nodejs app
- css的div垂直居中的方法,百分比div垂直居中
- CDN字体引用font-awesome
- android_launcher的源码详细分析
- [李景山php]thinkphp核心源码注释|Driver.class.php
- Linux学习笔记--Linux目录结构
- 富文本常用封装(NSAttributedString浅析)
- C#: Thread.Sleep(0) vs Sleep(1) vs Yeild
- 触发器
- [李景山php]thinkphp核心源码注释|Lite.class.php
- 怎样用java连接mysql
- ffmpeg学习:avformat_alloc_context
- 今年暑假不AC
- plist 文件、slider、stepper的使用
- leetcode371
- 浅谈DOCTYPE对$(window).height()取值的影响