症狀
當你使用 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 實作。