/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++>Code 產生] 屬性頁。
選取 Spectre 風險降低屬性的新值。 選擇 [確定] 以套用變更。
若要以程式方式設定這個編譯器選項
- 請參閱 AdditionalOptions。
另請參閱
/Qspectre
/Qspectre-jmp
/Qspectre-load
/Q 選項 (低階作業)
MSVC 編譯器選項
MSVC 編譯器命令列語法