/Qspectre-load

指定编译器为每个加载指令生成序列化指令。 此选项扩展 /Qspectre 标志,根据负载缓解任何可能的投机执行旁道攻击。

语法

/Qspectre-load

备注

/Qspectre-load 使编译器检测内存中的负载,并在负载后插入序列化指令。 将加载内存(包括 RETCALL)的控制流指令拆分为负载和控制流传输。 负载后跟一个 LFENCE 以确保负载受到保护。 在某些情况下,编译器无法拆分控制流指令,例如 jmp 指令,因此它使用了另一种缓解技术。 例如,编译器通过在插入 LFENCE 之前添加指令以非破坏性方式加载目标来缓解 jmp [rax],如下所示:

    xor rbx, [rax]
    xor rbx, [rax]  ; force a load of [rax]
    lfence          ; followed by an LFENCE
    jmp [rax]

由于 /Qspectre-load 停止对所有负载的猜测,因此性能影响很高。 缓解措施并非在所有情况下都适用。 如果有不需要保护的性能关键代码块,可以使用 __declspec(spectre(nomitigation)) 禁用这些缓解措施。 有关详细信息,请参阅 __declspec spectre

/Qspectre-load 选项默认关闭,支持所有优化级别。

/Qspectre-load 选项在 Visual Studio 2019 版本 16.5 及更高版本中可用。 此选项仅适用于面向 x86 和 x64 处理器的编译器。 此选项不适用于面向 ARM 处理器的编译器。

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

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

  2. 选择“配置属性”>“C/C++”>“代码生成”属性页面

  3. 为“Spectre 缓解”属性选择一个新值。 选择“确定”应用更改

以编程方式设置此编译器选项

另请参阅

/Qspectre
/Qspectre-jmp
/Qspectre-load-cf
/Q 选项(低级别操作)
MSVC 编译器选项
MSVC 编译器命令行语法