ИСПРАВЛЕНИЕ. Программы, встроенные в Visual C++ 2013, завершаются сбоем с исключением "Неправовая инструкция"

Применяется к
Visual Studio Community 2013

Проблема

При сборке программы с помощью Microsoft Visual C++ 2013 г. программа завершается сбоем, и вы получите исключение "Неправовая инструкция". Это происходит из-за того, что некоторые функции математической библиотеки с плавающей запятой в visual C++ 2013 x64 C Runtime (CRT) неправильно проверка, доступны ли определенные инструкции AVX и FMA3, прежде чем функции попытаются их использовать. Если инструкции недоступны для использования, вызовы этих функций вызывают недопустимое исключение инструкций (0xc000001d). Затронутые функции включают log, log10, pow и другие. 

Эта проблема, скорее всего, возникает в следующих сценариях:

  • В старой версии операционной системы Windows, которая не поддерживает сохранение состояния AVX (например, Windows Vista), если она используется на компьютере, поддерживающем набор инструкций AVX

  • Если сохранение состояния AVX явно отключено в конфигурации загрузки операционной системы

  • В среде предустановки Windows (Windows PE)

    Примечание. Среда предустановки Windows не поддерживает сохранение состояния AVX.

Эта проблема была зарегистрирована в Microsoft Connect:

Функция x64 log() использует инструкцию vpsrlq AVX без учета операционной системы (поэтому она завершает работу в Vista x64)
        
         Visual Studio 2013 RTM: ошибка создания кода C++ x64 для инструкций AVX2

Причина

Эта проблема возникает из-за того, что среда выполнения Visual C++ 2013 x64 не проверка, поддерживает ли операционная система сохранение состояния AVX перед выполнением инструкций AVX или FMA3.

Решение

Если все затронутые двоичные файлы C++, созданные с помощью Visual C++ 2013, используют библиотеку DLL среды выполнения C (msvcr120.dll), установите обновленный распространяемый Microsoft Visual C++ 2013 — 12.0.40660.0 или более поздней версии.

Если затронутые двоичные файлы C++ статически связывают среду выполнения C Visual C++ 2013, необходимо обновить установку Visual Studio 2013, установив исправление 3174417, а также перестроив и повторно развернув затронутые двоичные файлы.

Примечание. Эта проблема не влияет на более старые версии среды выполнения C Visual C++ (Visual C++ 2012 и более ранние версии). Проблема была исправлена до первоначального выпуска универсального CRT, используемого в Visual C++ 2015.

Центр загрузки Майкрософт

Чтобы обновить статическую связанную среду выполнения Visual C++ 2013, исправление 3174417 выпускается только для скачивания и не распространяется через клиентский компонент Центра обновления Windows. Он доступен на веб-сайте Центра загрузки Майкрософт:

Скачайте Скачайте пакет.

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

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

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

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

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

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