Симптоми
Когато създавате програма с помощта на Microsoft Visual C++ 2013, програмата се срива и се появява "Illegal Инструкция" изключение. Това се случва, защото някои плаваща математически функции във Visual C++ 2013 x64 C Runtime (CRT) правилно не проверява дали са налични някои AVX и FMA3 инструкции, преди да ги използвате функциите. Ако инструкциите не са налични за употреба, повиквания към тези функции причини недопустими Инструкция изключение (0xc000001d). Засегнатите функции включват регистър log10 и военнопленници и други.
Този проблем е най-вероятно да възникне в следните ситуации:
-
По-стара версия на операционната система Windows, която поддържа AVX състояние записване (например Windows Vista) ако се използва на компютър, който поддържа AVX набор инструкции
-
Ако AVX състояние записване изрично е забранен в конфигурацията за зареждане на операционната система
-
В средата за предварително инсталиране на Windows (Windows PE)
Забележка: Windows PE не поддържа AVX състояние записване.
Този проблем е съобщено за свързване на Microsoft:
x64 функцията използва vpsrlq AVX инструкции без операционна система (за да блокира на Vista x64)
Visual Studio 2013 RTM: C++ x64 код генериране на грешка за AVX2 инструкции
Причина
Този проблем възниква, тъй като Visual C++ 2013 x64 C Runtime не проверява дали операционната система поддържа AVX състояние записване, преди да се опитва да изпълни AVX или FMA3 инструкции.
Решение
Ако всички засегнати C++ двоични файлове, които са създадени чрез Visual C++ 2013 C Runtime DLL (msvcr120.dll), инсталирайте актуализирания Microsoft Visual C++ 2013 разпространение – 12.0.40660.0 или по-нова версия.
Ако засегнатите C++ двоични файлове статистически връзка на Visual C++ 2013 C Runtime, трябва да актуализирате вашата инсталация на Visual Studio 2013 чрез инсталиране на 3174417 корекция и възстановяване и пренасочване на засегнатите файлове.
Забележка: Този проблем не засяга по-стари версии на Visual C++ C Runtime (Visual C++ 2012 и по-ранни версии). Проблемът е решен преди в първоначалната версия на универсалната CRT, използван от Visual C++ 2015 г.
Център на Microsoft за изтегляния
Да актуализирате статично свързани Visual C++ 2013 C по време на работа, 3174417 корекция е издаден като изцяло актуализация и не се разпространяват чрез Windows Update. Е налична в уеб сайта на центъра за изтегляния на Microsoft:
Изтеглете сега пакета.
Да актуализирате динамично свързани Visual C++ 2013 C Runtime DLL, актуализиран за разпространение е наличен. За повече информация вижте следната статия в базата знания на Microsoft:
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.