Symptômes
Lorsque vous générez un programme à l’aide de Microsoft Visual C++ 2013, le programme se bloque et vous recevez une exception « Instruction illégale ». Cela se produit parce que certaines fonctions de bibliothèque mathématique à virgule flottante dans le runtime Visual C++ 2013 x64 C (CRT) ne case activée pas correctement si certaines instructions AVX et FMA3 sont disponibles avant que les fonctions essaient de les utiliser. Si les instructions ne sont pas disponibles, les appels à ces fonctions entraînent une exception d’instruction non conforme (0xc000001d). Les fonctions affectées incluent journal, log10 et pow, entre autres.
Ce problème est le plus susceptible de se produire dans les scénarios suivants :
Sur une ancienne version du système d’exploitation Windows qui ne prend pas en charge l’enregistrement d’état AVX (par exemple, Windows Vista) si elle est utilisée sur un ordinateur qui prend en charge le jeu d’instructions AVX
Si l’enregistrement de l’état AVX est explicitement désactivé dans la configuration de démarrage du système d’exploitation
Dans l’environnement de préinstallation Windows (Windows PE)
Remarque Windows PE ne prend pas en charge l’enregistrement d’état AVX.
Ce problème a été signalé sur Microsoft Connect :
La fonction x64 log() utilise l’instruction vpsrlq AVX sans tenir compte du système d’exploitation (elle se bloque donc sur Vista x64)
Visual Studio 2013 RTM : Bogue de génération de code C++ x64 pour les instructions AVX2
Cause
Ce problème se produit parce que le runtime Visual C++ 2013 x64 C ne case activée pas si le système d’exploitation prend en charge l’enregistrement de l’état AVX avant de tenter d’exécuter les instructions AVX ou FMA3.
Résolution
Si tous les fichiers binaires C++ affectés générés à l’aide de Visual C++ 2013 utilisent la DLL runtime C (msvcr120.dll), installez la mise à jour Microsoft Visual C++ 2013 Redistributable – 12.0.40660.0 ou une version ultérieure.
Si vos fichiers binaires C++ affectés lient statiquement le runtime Visual C++ 2013 C, vous devez mettre à jour votre installation de Visual Studio 2013 en installant le correctif logiciel 3174417 et en reconstruisant et en redéployant les fichiers binaires concernés.
Remarque Ce problème n’affecte pas les versions antérieures du Runtime C++ Visual C++ (Visual C++ 2012 et versions antérieures). Le problème a été résolu avant la version initiale du CRT universel utilisé par Visual C++ 2015.
Centre de téléchargement Microsoft
Pour mettre à jour le runtime Visual C++ 2013 lié statiquement, le correctif logiciel 3174417 est publié en tant que mise à jour en téléchargement uniquement et n’est pas distribué via Windows Update. Il est disponible sur le site web du Centre de téléchargement Microsoft :
Télécharger télécharger le package maintenant.
Pour mettre à jour les DLL runtime Visual C++ 2013 C liées dynamiquement, un redistribuable mis à jour est disponible. Pour plus d’informations, consultez l’article suivant de la Base de connaissances Microsoft :
mise à jour 3179560 pour Visual C++ 2013 et package Visual C++ Redistributable
Solution de contournement
Pour contourner ce problème, désactivez FMA3 dans la bibliothèque de mathématiques si vous êtes affecté par ce problème. Vous pouvez demander si le système prend en charge les instructions AVX en appelant GetEnabledXStateFeatures et en désactivant EXPLICITEMENT AVX dans le CRT en appelant _set_FMA3_enable(0).
Pour plus d’informations, consultez Utilisation du contexte XState sur le site web MSDN.
La fonction _set_FMA3_enable(0) est déclarée dans <math.h> et n’est disponible que lorsque vous générez pour x64. (Ce problème affecte uniquement les bibliothèques x64.) Cela entraîne le retour de la bibliothèque mathématique à l’utilisation des implémentations non-FMA3.