有遇到过这种错误吗?VS中报错C4996
其实这就是一些警告,但是如果你用了很多第三方的开源代码,你很难保证这些开源代码中使用的函数以及编码规范都遵循了VS最新的要求,所以很可能就会报错,注意时报错不是警告,怎么办?
看官方解决方法:
在 Visual Studio 开发环境中设置此编译器选项
-
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
-
选择“配置属性”>“C/C++”>“常规”属性页 。
-
使用属性下拉列表控件设置“SDL 检查”属性。 选择“确定”或“应用”以保存更改。
总之,就是个坑爹的,VS自作多情地默认设置成开启了,其实应该关闭的。
再看看官方完整解释:
启用建议的安全开发生命周期 (SDL) 检查。 这些检查将安全相关警告更改为错误并设置附加安全代码生成功能。
语法
/sdl
[-
]
注解
/sdl 启用 /GS 提供的基线安全检查的超集并重写 /GS-
。 默认情况下,/sdl
处于关闭状态。 /sdl-
禁用附加安全检查。
编译时检查
/sdl
启用以下被视为错误的警告:
/sdl 启用的警告 | 等效的命令行开关 | 说明 |
---|---|---|
C4146 | /we4146 | 将一元减号运算符应用于无符号类型,并生成了无符号的结果。 |
C4308 | /we4308 | 将负整型常数转换为无符号类型,并生成了可能无意义的结果。 |
C4532 | /we4532 | 在 __finally /finally 块中使用 continue 、break 或 goto 关键字已在异常终止期间取消定义了行为。 |
C4533 | /we4533 | 初始化变量的代码不会执行。 |
C4700 | /we4700 | 使用未初始化的局部变量。 |
C4703 | /we4703 | 使用可能未初始化的局部指针变量。 |
C4789 | /we4789 | 使用特定 C 运行时 (CRT) 函数时缓冲区溢出。 |
C4995 | /we4995 | 使用标记有 pragma deprecated 的函数。 |
C4996 | /we4996 | 使用标记有 deprecated 的函数。 |
运行时检查
启用 /sdl
后,编译器将生成在运行时执行这些检查的代码:
-
启用
/GS
运行时缓冲区溢出检测的严格模式,等同于使用#pragma strict_gs_check(push, on)
进行编译。 -
执行有限的指针清理。 在不涉及取消引用的表达式中以及没有用户定义的析构函数的类型中,在调用
delete
后,指针引用将设置为无效的地址。 此清理有助于防止重复使用已过时的指针引用。 -
初始化类成员指针。 在对象实例化时自动将指针类型的类成员初始化为
nullptr
(在构造函数运行前)。 它有助于防止使用构造函数未显式初始化的未初始化指针。 在以下情况下,将调用编译器生成的成员指针初始化:-
对象不是使用自定义(用户定义)的
operator new
分配的 -
对象不是作为数组(例如
new A[x]
)的一部分分配的 -
类不是托管或导入的
-
类具有用户定义的默认构造函数。
若要由编译器生成的类初始化函数初始化,成员必须是指针,而不是属性或常量。
-
有关详细信息,请参阅警告、/sdl 和改进未初始化的变量检测。
在 Visual Studio 开发环境中设置此编译器选项
-
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
-
选择“配置属性”>“C/C++”>“常规”属性页 。
-
使用属性下拉列表控件设置“SDL 检查”属性。 选择“确定”或“应用”以保存更改。