Симптомы
При построении программы с помощью Microsoft Visual C++ 2013 программа завершает работу и появляется исключение «Недопустимая инструкция». Это происходит потому, что некоторые функции библиотеки math с плавающей запятой в среде Visual C++ 2013 x64 C выполнения с (CRT) неправильно проверяет доступны ли определенные инструкции AVX и FMA3, прежде чем пытаться использовать их функции. Если инструкции не доступны для использования, вызовов этих функций вызывает исключение недопустимую инструкцию (0xc000001d). Затронутые функции включают журнал, log10 и pow и другие.
Данная проблема чаще всего возникает в следующих случаях:-
В старой версии операционной системы Windows, не поддерживает AVX состояния сохранение (например, Windows Vista) Если используется на компьютере, который поддерживает набор инструкций AVX
-
Если сохранение состояния AVX явно отключен в конфигурации загрузки операционной системы
-
В среде предварительной установки Windows (Windows PE)
Примечание. Windows PE не поддерживает сохранение состояния AVX.
Эта проблема уже зарегистрирована на Microsoft Connect:
x64 функция log() использует инструкции AVX vpsrlq независимо от операционной системы (таким образом происходит сбой в Vista x64) Visual Studio 2013 RTM: C++ x64 код ошибки создания инструкции AVX2
Причина
Эта проблема возникает, поскольку среда выполнения Visual C++ 2013 x64 C не проверяет, поддерживает ли операционная система AVX сохранение состояния, прежде чем попытается выполнить инструкции AVX или FMA3.
Решение
Если все уязвимые двоичные файлы C++, построенные с помощью Visual C++ 2013 используется Библиотека времени выполнения C (msvcr120.dll), установите обновленные Microsoft 2013 распространяемый пакет Visual C++ — 12.0.40660.0 или более поздней версии.
Если уязвимые двоичных файлов C++ статически связать 2013 C времени выполнения Visual C++, необходимо обновить установленную копию Visual Studio 2013 путем установки исправления 3174417 и перестройки и повторного развертывания уязвимые двоичные файлы. Примечание. Эта проблема не влияет на более старых версий C времени выполнения Visual C++ (Visual C++ 2012 и более ранних версиях). Проблема была устранена до первоначального выпуска универсальной CRT, используемый Visual C++ 2015.Центр загрузки Майкрософт
Чтобы обновить статически скомпонованной 2013 C времени выполнения Visual C++, 3174417 исправление выпущено как доступные только для загрузки обновления и не распространяться через Центр обновления Windows. Он доступен на веб-узел центра загрузки корпорации Майкрософт:Загрузите пакет. Для обновления динамически связанные 2013 C во время выполнения библиотеки DLL Visual C++, обновленный распространяемый пакет доступен. Для получения дополнительных сведений обратитесь к следующей статье Microsoft Knowledge Base:
3179560 обновление для распространяемого пакета Visual C++ и Visual C++ 2013
Временное решение
Чтобы обойти эту проблему, отключите FMA3 математические библиотеки, если подвержены этой проблеме. Можно выполнить запрос, поддерживает ли система инструкции AVX путем вызова GetEnabledXStateFeatures и отключение AVX в CRT явным образом путем вызова _set_FMA3_enable(0).Работа с контекстом XState. Функция _set_FMA3_enable(0) объявлен в файла < math.h >, и он доступен только при построении для x64. (Эта проблема затрагивает только x64 библиотеки.) В этом случае математическая библиотека, чтобы возвратиться к использованию реализаций не FMA3.
Дополнительные сведения см. на веб-сайте MSDN