狀況
當您使用 Microsoft Visual C++ 2013年建置程式時,程式會損毀,而且收到 「 指令無效 」 例外狀況。這是因為 Visual C++ 2013 x64 C 執行階段 (CRT) 中的某些浮點數的數學程式庫函式不正確地檢查函式會嘗試使用它們之前,是否有某些 AVX 和 FMA3 的指令。如果沒有可供使用的指示,這些函式呼叫會造成不正確的指示例外狀況 (0xc000001d)。受影響的函式包含記錄檔、 log10,和 pow,與其他人。
這個問題是最有可能發生在下列情況︰
-
在舊版 Windows 作業系統不支援 AVX 的狀態儲存 (例如,Windows Vista) 是否它用在支援的 AVX 指令集的電腦上
-
如果 AVX 狀態儲存在作業系統的開機設定已明確停用
-
在 Windows 預先安裝環境 (Windows PE) 中
注意Windows PE 不支援 AVX 狀態儲存。
Microsoft 的連線已報告這個問題︰
x64 log 函式 (因此損毀在 Vista x64 上),請使用 vpsrlq AVX 指令,而不管作業系統
Visual Studio 2013 RTM: C + + x64 的程式碼產生錯誤,如 AVX2 的指示
原因
之所以發生這個問題,因為 Visual C++ 2013 x64 C 的執行階段不會檢查作業系統是否支援 AVX 狀態儲存,然後再嘗試執行 AVX 或 FMA3 的指令。
解決方案
如果所有受影響的 c + + 二進位,由使用 Visual C++ 2013年建置使用 C 執行階段 DLL (msvcr120.dll),安裝更新 Microsoft Visual C++ 2013年可轉散發 – 12.0.40660.0 或更新版本。
如果受影響的 c + + 二進位檔會以靜態方式連結 Visual C++ 2013 C 執行階段,您就必須更新您的安裝的 Visual Studio 2013年藉由安裝 3174417 的 hotfix 和重建並重新部署受影響的二進位碼檔案。
注意這個問題並不影響舊版 Visual C++ C 執行階段 (Visual C++ 2012年和較早版本)。問題已修正之前初始版本的 Visual C++ 的 2015年由通用 CRT。
Microsoft 下載中心
若要更新以靜態方式連結 Visual C++ 2013 C 執行階段,3174417 的 hotfix 會就會釋放為僅限下載的更新,並不透過 Windows Update 發佈。它位於 「 Microsoft 下載中心 」 網站︰
立即下載套件。
若要更新動態連結 Visual C++ 2013 C 執行階段 Dll,更新可用的可轉散發是。如需詳細資訊,請參閱下列微軟知識庫文件︰
因應措施
要解決這個問題,請停用數學程式庫中的 FMA3,如果您已經受到這個問題。您可以查詢系統是否支援透過呼叫GetEnabledXStateFeatures ,並明確停用 AVX,則在 CRT 中的,藉由呼叫_set_FMA3_enable(0)的 AVX 指示。
如需詳細資訊,請參閱使用 XState 內容在 MSDN 網站上。
函式_set_FMA3_enable(0)宣告 < math.h >,且只有當您建立的 x64 時,才使用。(這個問題會影響僅 x64 程式庫。)這會導致若要還原為使用非 FMA3 實作的數學程式庫。