/sdl(启用附加安全检查)

启用建议的安全开发生命周期 (SDL) 检查。 这些检查将安全相关警告更改为错误并设置附加安全代码生成功能。

语法

]$

注解

/sdl 启用 /GS 提供的基线安全检查的超集并重写 /GS-。 默认情况下,/sdl 处于关闭状态。 /sdl- 禁用附加安全检查。

编译时检查

/sdl 使这些警告作为错误:

/sdl 启用的警告 等效的命令行开关 说明
C4146 /we4146 将一元减号运算符应用于无符号类型,并生成了无符号的结果。
C4308 /we4308 将负整型常数转换为无符号类型,并生成了可能无意义的结果。
C4532 /we4532 __finally/finally 块中使用 continuebreakgoto 关键字已在异常终止期间取消定义了行为。
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 开发环境中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“常规”属性页

  3. 使用属性下拉列表控件设置“SDL 检查”属性。 选择“确定”或“应用”以保存更改。

另请参阅

MSVC 编译器选项
MSVC 编译器命令行语法