/Qspectre-load
指定编译器为每个加载指令生成序列化指令。 此选项扩展 /Qspectre 标志,根据负载缓解任何可能的投机执行旁道攻击。
语法
/Qspectre-load
备注
/Qspectre-load 使编译器检测内存中的负载,并在负载后插入序列化指令。 将加载内存(包括 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 停止对所有负载的猜测,因此性能影响很高。 缓解措施并非在所有情况下都适用。 如果有不需要保护的性能关键代码块,可以使用 __declspec(spectre(nomitigation))
禁用这些缓解措施。 有关详细信息,请参阅 __declspec spectre。
/Qspectre-load 选项默认关闭,支持所有优化级别。
/Qspectre-load 选项在 Visual Studio 2019 版本 16.5 及更高版本中可用。 此选项仅适用于面向 x86 和 x64 处理器的编译器。 此选项不适用于面向 ARM 处理器的编译器。
在 Visual Studio 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“代码生成”属性页面。
为“Spectre 缓解”属性选择一个新值。 选择“确定”应用更改。
以编程方式设置此编译器选项
- 请参阅 AdditionalOptions。
另请参阅
/Qspectre
/Qspectre-jmp
/Qspectre-load-cf
/Q 选项(低级别操作)
MSVC 编译器选项
MSVC 编译器命令行语法