/Qspectre
指定產生指示的編譯器,以減少特定 Spectre 變體 1 的安全性弱點。
語法
/Qspectre
備註
選項 /Qspectre
會導致編譯程式插入指示,以減輕某些 Spectre 安全性弱點。 這些弱點稱為 推測性執行端通道攻擊。 它們會影響許多操作系統和新式處理器,包括來自 Intel、AMD 和 ARM 的處理器。
此選項 /Qspectre
可從 Visual Studio 2017 15.5.5 版和所有更新版本開始提供。 其可在Visual Studio 2015 Update 3到 KB 4338871中使用。
選項 /Qspectre
預設為關閉。
在其初始版本中, /Qspectre
此選項只適用於優化的程序代碼。 從 Visual Studio 2017 15.7 版開始, /Qspectre
所有優化層級都支援此選項。
有數個Microsoft C++連結庫也可在具有Spectre風險降低的版本中取得。 您可以在 Visual Studio 安裝程式 下載適用於 Visual Studio 的 Spectre 緩和連結庫。 它們位於 [編譯程式]、[建置工具] 和 [運行時間] 下的 [個別元件] 索引標籤中,並在名稱中具有 “Libs for Spectre”。 已啟用風險降低的 DLL 和靜態運行時間連結庫都適用於 Visual C++ 執行時間子集:VC++ 啟動程式代碼、vcruntime140、msvcp140、concrt140 和 vcamp140。 只有應用程式本機部署才支援 DLL。 Visual C++ Runtime Library 可轉散發套件的內容未經修改。
您也可以安裝適用於 MFC 和 ATL 的 Spectre 緩和連結庫。 它們位於 SDK、連結庫和架構下的 [個別元件] 索引標籤中。
注意
通用 Windows (UWP) 應用程式或元件沒有 Spectre 緩和連結庫的版本。 無法部署這類連結庫的應用程式本機。
適用性
如果您的程式代碼在跨越信任界限的數據上運作,建議您使用 /Qspectre
選項來重建和重新部署程式代碼,以儘快減輕此問題。 這類程式代碼的範例是載入可能影響執行之不受信任的輸入的程序代碼。 例如,進行遠端過程調用的程式代碼、剖析不受信任的輸入或檔案,或使用其他本機進程間通訊 (IPC) 介面。 標準沙箱技術可能不足。 在您決定程式代碼不會跨越信任界限之前,請先仔細調查沙箱。
可用性
此選項 /Qspectre
可從 Visual Studio 2017 15.5.5 版開始使用,並在 2018 年 1 月 23 日或之後對 Microsoft C/C++ 編譯程式 (MSVC) 的所有更新中提供。 您可以使用 Visual Studio 安裝程式來更新編譯器,並將 Spectre 風險降低程式庫當作個別元件來安裝。 您也可以 /Qspectre
透過修補程式在 Visual Studio 2015 Update 3 中使用此選項。 如需詳細資訊,請參閱 KB 4338871。
Visual Studio 2017 15.5 版和 Visual Studio 2017 15.6 版的所有預覽版。 包含未記載的選項, /d2guardspecload
。 它相當於的初始行為 /Qspectre
。 您可以在這些版本的編譯程式中,使用 /d2guardspecload
將相同的風險降低套用至程序代碼。 建議您更新組建,以在支援 選項的編譯程式中使用 /Qspectre
。 此選項 /Qspectre
也可以在更新版本的編譯程式中支援新的風險降低功能。
效果
選項 /Qspectre
會輸出程序代碼,以減輕Specter Variant 1、界限檢查略過、 CVE-2017-5753。 其運作方式是插入作為推測式程式碼執行屏障的指示。 這些用來降低處理器推測風險的特定指示會依賴處理器和其微架構,而且可能會在未來的編譯器版本中有所變更。
當您啟用 /Qspectre
選項時,編譯程式會嘗試識別推測執行可能會略過界限檢查的實例。 這就是它插入屏障指令的位置。 請務必注意編譯程式可以執行的分析限制,以識別 Variant 1 的實例。 因此,不保證所有可能的 Variant 1 實例都會在 下 /Qspectre
檢測。
效能影響
在數個可調整的程式代碼基底中,效能的影響 /Qspectre
似乎微不足道。 不過,不保證您程式代碼的 /Qspectre
效能不會受到影響。 您應該先制定程式碼的基準,以判斷效能選項的影響。 如果您知道效能關鍵區塊或迴圈中不需要風險降低功能,您可以使用 指示詞選擇性地停用風險降低 __declspec(spectre(nomitigation))
功能。 這個指示詞不適用於只支援 選項的 /d2guardspecload
編譯程式。
必要的程式庫
編譯 /Qspectre
程式選項可減輕您自己的程式代碼問題。 為了獲得更大的保護,強烈建議您也使用建置的連結庫來提供Spectre風險降低功能。 有數個Microsoft運行時間連結庫可供使用Spectre風險降低功能。
這些程式庫都是必須使用 Visual Studio 安裝程式來安裝的選用元件:
- MSVC 版本 version_numbers Spectre 的 Libs [(x86 和 x64) |(ARM) |(ARM64)]
- Visual C++ ATL for [(x86/x64) |ARM |ARM64] 具有Spectre風險降低功能
- 適用於 [x86/x64 的 Visual C++ MFC |ARM |ARM64] 具有Spectre風險降低功能
Visual Studio IDE 中的預設 MSBuild 項目系統可讓您指定 專案的 Spectre 風險降低 屬性。 此屬性會 /Qspectre
設定編譯程式選項,並變更連結庫路徑,以連結 Spectre 緩和運行時間連結庫。 如果您在建置程式代碼時未安裝這些連結庫,則建置系統會回報警告 MSB8040。 如果您的 MFC 或 ATL 程式代碼無法建置,且連結器回報錯誤,例如「嚴重錯誤LNK1104:無法開啟檔案 『oldnames.lib』」,這些遺漏的連結庫可能是原因。
Visual Studio IDE 中的預設 MSBuild 項目系統可讓您指定 專案的 Spectre 風險降低 屬性。 此屬性會 /Qspectre
設定編譯程式選項,並變更連結庫路徑,以連結 Spectre 緩和運行時間連結庫。 如果您在建置程式代碼時未安裝這些連結庫,則建置系統會回報警告MSB8038:「已啟用Spectre風險降低功能,但找不到Spectre緩和的連結庫。」如果您的 MFC 或 ATL 程式代碼無法建置,且連結器回報錯誤,例如「嚴重錯誤LNK1104:無法開啟檔案 『oldnames.lib』」,這些遺漏的連結庫可能是原因。
有數種方式可以指定組建命令行的Spectre緩和連結庫。 您可以使用連結器選項來指定 Spectre 緩和連結庫 /LIBPATH
的路徑,使其成為預設連結庫。 您可以使用 /NODEFAULTLIB
連結器選項,並明確連結 Spectre 緩和的連結庫。 或者,您可以設定 LIBPATH
環境變數,以包含目標平臺的Spectre緩和連結庫路徑。 在環境中設定此路徑的其中一種方式是使用 spectre_mode
選項所設定的開發人員命令提示字元。 如需詳細資訊,請參閱 在現有的命令視窗中使用開發人員工具。
x86、x64 和 ARM 平臺的 Spectre 緩和運行時間連結庫可做為透過 KB 4338871 提供的修補程式的一部分。 根據預設,這些連結庫會安裝在下列目錄中:
- x86:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre
- x64:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\amd64
- ARM:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm
有數種方式可以指定組建命令行的Spectre緩和連結庫。 您可以使用連結器選項來指定 Spectre 緩和連結庫 /LIBPATH
的路徑,使其成為預設連結庫。 您可以使用 /NODEFAULTLIB
連結器選項,並明確連結 Spectre 緩和的連結庫。 或者,您可以設定 LIBPATH
環境變數,以包含目標架構的Spectre緩和連結庫路徑。 如需詳細資訊,請參閱 從命令行使用Microsoft C++工具組。
其他資訊
如需詳細資訊,請參閱官方 Microsoft安全性諮詢ADV180002,以減輕推測性執行端通道弱點的指引。 您可以從 Intel 的推測性執行旁路攻擊風險降低 (Speculative Execution Side Channel Mitigations) 和 ARM 的快取推測性旁路攻擊 (Cache Speculation Side-channels) 中取得指導方針。
如需Spectre和Meltdown風險降低功能的Windows 特定概觀,請參閱 瞭解 Windows 系統上Spectre和 Meltdown 風險降低的效能影響。
如需 MSVC 風險降低所解決的 Spectre 弱點概觀,請參閱 C++ 小組部落格上的 MSVC 中的 Spectre 風險降低措施。
在 Visual Studio 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性>C/C++>Code 產生] 屬性頁。
選取 Spectre 風險降低屬性的新值。 選擇 [確定] 以套用變更。
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
在 [
/Qspectre
其他選項] 方塊中輸入編譯程序選項。 選擇 [ 套用 ] 以套用變更。選取 [組態屬性>] 連結器>[一般] 屬性頁。
針對項目屬性中的每個平台,編輯 [其他連結庫目錄 ] 屬性。 設定目標平臺的Spectre緩和運行時間連結庫目錄路徑,然後選擇 [ 套用 ] 以套用變更。 完成後,請選擇 [ 確定]。
若要以程式方式設定這個編譯器選項
- 請參閱 AdditionalOptions。
另請參閱
/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q
選項 (低階作業)
MSVC 編譯器選項
MSVC 編譯器命令列語法