症状
通过使用 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() 函数使用而无需考虑操作系统的 vpsrlq AVX 指令 (因此它崩溃在 Vista x64)
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 运行库,则必须通过安装 3174417 修复和重建并重新部署这些受影响的二进制文件更新安装的 Visual Studio 2013年。
注意:此问题不会影响旧版本的 Visual C++ C 运行库 (Visual C++ 2012年及更早版本)。在使用 Visual C++ 到 2015 的通用 crt 的最初发行版本之前修复问题。
Microsoft 下载中心
更新静态链接 Visual C++ 2013 C 运行库,3174417 修补程序发布为仅下载更新,并不通过 Windows Update 分发。它是 Microsoft 下载中心网站︰
立即下载该程序包。
更新动态链接 Visual C++ 2013 C 运行时 Dll,更新可再发行组件才可用。有关详细信息,请参阅下面的 Microsoft 知识库文章︰
解决方法
若要变通解决此问题,请禁用 FMA3 中的数学库如果您这个问题的影响。您可以查询系统是否支持通过调用GetEnabledXStateFeatures并通过调用_set_FMA3_enable(0)来显式禁用 AVX CRT 中的 AVX 指令。
有关详细信息,请参见 MSDN 网站上的XState 上下文使用。
< Math.h > 中声明了函数_set_FMA3_enable(0) ,它现仅在 x64 生成时。(此问题会影响仅 x64 库。)这将导致恢复为使用非 FMA3 实现的数学库。