ИСПРАВИТЬ: Программ, имеющихся в Visual C++ 2013 сбой с исключением «Недопустимая инструкция»

Симптомы

При построении программы с помощью 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. Он доступен на веб-узел центра загрузки корпорации Майкрософт:

Download Загрузите пакет.

Для обновления динамически связанные 2013 C во время выполнения библиотеки DLL Visual C++, обновленный распространяемый пакет доступен. Для получения дополнительных сведений обратитесь к следующей статье Microsoft Knowledge Base:

3179560 обновление для распространяемого пакета Visual C++ и Visual C++ 2013

Временное решение

Чтобы обойти эту проблему, отключите FMA3 математические библиотеки, если подвержены этой проблеме. Можно выполнить запрос, поддерживает ли система инструкции AVX путем вызова GetEnabledXStateFeatures и отключение AVX в CRT явным образом путем вызова _set_FMA3_enable(0).

Дополнительные сведения см. на веб-сайте MSDN Работа с контекстом XState.

Функция _set_FMA3_enable(0) объявлен в файла < math.h >, и он доступен только при построении для x64. (Эта проблема затрагивает только x64 библиотеки.) В этом случае математическая библиотека, чтобы возвратиться к использованию реализаций не FMA3.

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Спасибо за ваш отзыв!

×