Síntomas
Al compilar un programa utilizando Microsoft Visual C++ 2013, el programa se bloquea y recibe una excepción "Illegal Instruction". Esto ocurre porque algunas funciones de la biblioteca de matemáticas de punto flotante en tiempo de ejecución de Visual C++ 2013 x64 C (CRT) no comprueba correctamente si determinadas instrucciones AVX y FMA3 están disponibles antes de que las funciones intentan utilizarlos. Si las instrucciones no están disponibles para su uso, las llamadas a estas funciones producirá una excepción de instrucción ilegal (0xc000001d). Funciones afectadas incluyen log, log10 y pow y otros.
Este problema es más probable que se produzca en las situaciones siguientes:-
En una versión anterior del sistema operativo Windows que no admite AVX estado guardar (por ejemplo, Windows Vista) si se utiliza en un equipo que admite el conjunto de instrucciones AVX
-
Si guardar estado AVX esté explícitamente deshabilitada en la configuración de arranque del sistema operativo
-
En el entorno de preinstalación de Windows (Windows PE)
Nota: Windows PE no admite guardar estado AVX.
Se ha detectado este problema en Microsoft Connect:
x64 la función log() utiliza instrucciones de AVX vpsrlq independientemente del sistema operativo (por lo que se bloquea en Windows Vista x64) RTM de 2013 de Visual Studio: Error de generación de AVX2 instrucciones de código de C++ x64
Causa
Este problema se produce porque el tiempo de ejecución de Visual C++ 2013 x64 C no comprueba si el sistema operativo admite AVX estado guardando antes de intentar ejecutar las instrucciones AVX o FMA3.
Solución
Si todos los binarios de C++ afectados que se generan utilizando 2013 de Visual C++ utilizan el archivo DLL en tiempo de ejecución de C (msvcr120.dll), instale el actualizado Microsoft Visual C++ 2013 Redistributable – 12.0.40660.0 o una versión posterior.
Si los archivos binarios de C++ afectados vinculan estáticamente el tiempo de ejecución de Visual C++ de 2013 C, debe actualizar la instalación de Visual Studio 2013 de instalar el hotfix 3174417 y reconstruir y volver a implementar los archivos binarios afectados. Nota: Este problema no afecta a las versiones anteriores de Visual C++ C Runtime (2012 de Visual C++ y versiones anteriores). El problema fue solucionado antes del lanzamiento inicial de CRT Universal que se utiliza Visual C++ 2015.Centro de descarga de Microsoft
Para actualizar el vinculado estáticamente C Runtime de Visual C++ de 2013, la revisión 3174417 se publica como una actualización de sólo descarga y no está distribuido a través de Windows Update. Se encuentra disponible en el sitio Web de Microsoft Download Center:Descargue ahora el paquete. Para actualizar el vinculada dinámicamente Visual C++ 2013 C Runtime DLL, un controlador actualizado, versión redistribuible está disponible. Para obtener más información, consulte el siguiente artículo de Microsoft Knowledge Base:
Actualización de 3179560 para 2013 de Visual C++ y Visual C++ Redistributable Package
Solución alternativa
Para evitar este problema, deshabilite FMA3 en la biblioteca math si están afectados por este problema. Puede consultar si el sistema admite las instrucciones AVX llamando a GetEnabledXStateFeatures y deshabilitar AVX en CRT explícitamente mediante una llamada a _set_FMA3_enable(0).trabajar con contexto XStateen el sitio Web MSDN. La función _set_FMA3_enable(0) se declara en < math.h >, y está disponible sólo cuando se genera para x64. (Este problema afecta sólo a la x64 las bibliotecas.) Esto hace que la biblioteca de matemáticas volver a usar las implementaciones no FMA3.
Para obtener más información, vea