分享方式:


/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++>Code 產生] 屬性頁。

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

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

另請參閱

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