/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 負載 會停止猜測所有負載,因此效能影響很高。 風險降低並非隨處可見。 如果有不需要保護的效能關鍵程式碼區塊,您可以使用 來停用這些風險降低 __declspec(spectre(nomitigation))
功能。 如需詳細資訊,請參閱 __declspec規格。
/Qspectre-load 選項預設為關閉,並支援所有優化層級。
Visual Studio 2019 16.5 版和更新版本提供 /Qspectre-load 選項。 此選項僅適用於以 x86 和 x64 處理器為目標的編譯程式。 目標為 ARM 處理器的編譯程式無法使用。
在 Visual Studio 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性>C/C++>Code 產生] 屬性頁。
選取 Spectre 風險降低屬性的新值。 選擇 [確定] 以套用變更。
若要以程式方式設定這個編譯器選項
- 請參閱 AdditionalOptions。
另請參閱
/Qspectre
/Qspectre-jmp
/Qspectre-load-cf
/Q 選項 (低階作業)
MSVC 編譯器選項
MSVC 編譯器命令列語法