分享方式:


/Qspectre-load

針對每個載入指令指定串行化指令的編譯程序產生。 此選項會 擴充 /Qspectre 旗標,根據負載,針對任何可能的 推測性執行端通道攻擊 進行緩和。

語法

/Qspectre-load

備註

/Qspectre-load 會導致編譯程式偵測記憶體中的負載,並在它們之後插入串行化指令。 載入記憶體的控制流程指令,包括 RETCALL,會分割成負載和控制流程傳輸。 負載後面接著 , 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 開發環境中設定這個編譯器選項

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

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

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

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

另請參閱

/Qspectre
/Qspectre-jmp
/Qspectre-load-cf
/Q 選項 (低階作業)
MSVC 編譯程序選項
MSVC 編譯程式命令行語法