/Qspectre-load-cf

針對包含負載的每個控制流程指令,指定序列化指令的編譯器產生。 此選項會執行 /Qspectre-load 選項所 完成之風險降低的子集。

語法

/Qspectre-load-cf

備註

/ Qspectre-load-cf 會讓編譯器偵測 JMPRET 、 和控制 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 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [ 組態屬性 > C/C++ > 程式碼產生 ] 屬性頁。

  3. 選取 Spectre 風險降低 屬性的新值 。 選擇 [確定] 以套用變更。

若要以程式方式設定這個編譯器選項

另請參閱

/Qspectre
/Qspectre-jmp
/Qspectre-load
/Q 選項 (低階作業)
MSVC 編譯器選項
MSVC 編譯器命令列語法