修正:以 Visual C++ 2013 建置的程式會因「非法指令」例外而當機

套用到
Visual Studio Community 2013

症狀

當你使用 Microsoft Visual C++ 2013 編譯程式時,程式會當機並收到「非法指令」例外。 這是因為 Visual C++ 2013 x64 C 執行時 (CRT) 中的某些浮點數學函式,無法在函式嘗試使用前正確檢查某些 AVX 和 FMA3 指令是否可用。 若指令無法使用,呼叫這些函式會導致非法指令例外 (0xc000001d) 。 受影響的函式包括 log、log10、pow 等。 

此問題最可能發生於以下情境:

  • 例如,在不支援 AVX 狀態儲存 (的舊版 Windows 作業系統上,Windows Vista) 該系統是否在支援 AVX 指令集的電腦上使用 AVX 指令集

  • 若作業系統開機設定中明確禁用 AVX 狀態儲存功能

  • 在 Windows PE (的 Windows 預安裝環境中)

    注意 Windows PE 不支援 AVX 狀態儲存。

這個問題在 Microsoft Connect 上已經被回報:

x64 日誌 () 函式使用 vpsrlq AVX 指令,不考慮作業系統 (,因此在 Vista x64 上會崩潰)
        
         Visual Studio 2013 RTM:C++ x64 AVX2 指令產生程式碼的錯誤

原因

此問題發生於 Visual C++ 2013 x64 C 執行時不會在執行 AVX 或 FMA3 指令前檢查作業系統是否支援 AVX 狀態儲存。

解決方式

若所有使用 Visual C++ 2013 編譯的受影響 C++ 二進位檔皆使用 C 執行時 DLL (msvcr120.dll) ,請安裝更新至 2013 Microsoft Visual C++ 的 Redistributable(12.0.40660.0 或更新版本)。

如果你受影響的 C++ 二進位檔靜態連結 Visual C++ 2013 C 執行環境,你必須透過安裝 3174417 熱修正並重建及重新部署受影響的二進位檔來更新 Visual Studio 2013。

注意:此問題不影響 Visual C++ C執行時 (2012 及更早版本的) 。 此問題在 Visual C++ 2015 所使用的通用 CRT 初版前已被修正。

Microsoft 下載中心

為了更新靜態連結的 Visual C++ 2013 C 執行時,3174417 熱修正以僅下載方式發布,且不透過 Windows Update 發佈。 可於 Microsoft 下載中心網站取得:

立即下載 下載套件。

為了更新動態連結的 Visual C++ 2013 C 執行時 DLL,提供更新的再發行檔。 如需更多資訊,請參閱以下 Microsoft 知識庫文章:

3179560 Visual C++ 2013 及 C++ 可轉散發套件 套件更新

因應措施

為了解決這個問題,如果你受到這個問題影響,請在數學函式庫中關閉 FMA3。 你可以透過呼叫 GetEnabledXStateFeatures 查詢系統是否支援 AVX 指令,並在 CRT 中明確停用 AVX,方法是呼叫 _set_FMA3_enable (0) 。

欲了解更多資訊,請參閱 MSDN 網站上的 「使用 XState Context 」。

0) _set_FMA3_enable (函數在 math.h> 中宣告<,只有在你為 x64 建置時才會使用。 (此問題僅影響 x64 函式庫。) 這會導致數學函式庫回復使用非 FMA3 實作。