/Qspectre-load-cf

指定编译器为每个包含负载的控制流指令生成序列化指令。 此选项执行 /Qspectre-load 选项完成的部分缓解措施。

语法

/Qspectre-load-cf

注解

/Qspectre-load-cf 使编译器检测从内存加载的 JMPRETCALL 控制流指令,并在加载后插入序列化指令。 如果可能,这些指令将拆分为负载和控制流传输。 负载后跟一个 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-cf 停止对控制流指令中所有负载的猜测,因此性能影响很高。 缓解措施并非在所有情况下都适用。 如果有不需要保护的性能关键代码块,可以使用 __declspec(spectre(nomitigation)) 禁用这些缓解措施。

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

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

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

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

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

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

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

另请参阅

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