"Qspectre-load-cf
指定编译器为每个包含负载的控制流指令生成序列化指令。 此选项执行 /Qspectre-load 选项完成的部分缓解措施。
语法
"Qspectre-load-cf
注解
/Qspectre-load-cf 使编译器检测从内存加载的 JMP
、RET
和 CALL
控制流指令,并在加载后插入序列化指令。 如果可能,这些指令将拆分为负载和控制流传输。 负载后跟一个 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 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“代码生成”属性页面。
为“Spectre 缓解”属性选择一个新值。 选择“确定”应用更改。
以编程方式设置此编译器选项
- 请参阅 AdditionalOptions。
另请参阅
/Qspectre
/Qspectre-jmp
/Qspectre-load
/Q 选项(低级别操作)
MSVC 编译器选项
MSVC 编译器命令行语法