Sintomi
Quando si crea un programma usando Microsoft Visual C++ 2013, il programma si arresta in modo anomalo e si riceve un'eccezione "Istruzione non valida". Ciò si verifica perché alcune funzioni della libreria matematica a virgola mobile in Visual C++ 2013 x64 C Runtime (CRT) non verificano correttamente se alcune istruzioni AVX e FMA3 sono disponibili prima che le funzioni provino a usarle. Se le istruzioni non sono disponibili per l'uso, le chiamate a queste funzioni causano un'eccezione di istruzione non valida (0xc000001d). Le funzioni interessate includono log, log10, e pow e altri.
Questo problema è più probabile che si verifichi nei seguenti scenari:
In una versione precedente del sistema operativo Windows che non supporta il salvataggio dello stato AVX (ad esempio, Windows Vista) se viene usato in un computer che supporta il set di istruzioni AVX
Se il salvataggio dello stato AVX è disabilitato in modo esplicito nella configurazione di avvio del sistema operativo
In Ambiente preinstallazione di Windows (Windows PE)
Nota Windows PE non supporta il salvataggio dello stato AVX.
Questo problema è stato segnalato in Microsoft Connect:
x64 log() funzione utilizza vpsrlq AVX istruzione senza tenere conto del sistema operativo (in modo che si arresta in modo anomalo su Vista x64)
Visual Studio 2013 RTM: bug di generazione di codice x64 C++ per le istruzioni AVX2
Causa
Questo problema si verifica perché il runtime Visual C++ 2013 x64 C non controlla se il sistema operativo supporta il salvataggio dello stato AVX prima di provare a eseguire le istruzioni AVX o FMA3.
Risoluzione
Se tutti i file binari C++ interessati che vengono compilati con Visual C++ 2013 utilizzano la DLL di runtime C (msvcr120.dll), installare la versione aggiornata Microsoft Visual C++ 2013 Redistributable - 12.0.40660.0 o una versione successiva.
Se i file binari C++ interessati collegano staticamente Visual C++ 2013 C Runtime, è necessario aggiornare l'installazione di Visual Studio 2013 installando l'hotfix 3174417 e ricreando e distribuendo i binari interessati.
Nota Questo problema non riguarda le versioni precedenti del runtime Visual C++ C (Visual C++ 2012 e versioni precedenti). Il problema è stato risolto prima del rilascio iniziale di Universal CRT utilizzato da Visual C++ 2015.
Area download Microsoft
Per aggiornare Visual C++ 2013 C Runtime collegato staticamente, l'hotfix 3174417 viene rilasciato come aggiornamento solo per il download e non viene distribuito tramite Windows Update. È disponibile sul sito Web dell'Area download Microsoft:
Per aggiornare le DLL di runtime Visual C++ 2013 collegate dinamicamente, è disponibile un file ridistribuibile aggiornato. Per altre informazioni, vedere il seguente articolo della Microsoft Knowledge Base:
3179560 Update for Visual C++ 2013 and Visual C++ Redistributable Package
Soluzione alternativa
Per risolvere il problema, disabilitare FMA3 nella raccolta di matematica se si è interessati da questo problema. È possibile verificare se il sistema supporta le istruzioni AVX chiamando GetEnabledXStateFeatures e disabilitando AVX in CRT in modo esplicito chiamando _set_FMA3_enable(0).
Per ulteriori informazioni, vedere Utilizzo di XState Context nel sito Web MSDN.
La funzione _set_FMA3_enable(0) viene dichiarata in <matematica.h> ed è disponibile solo quando si crea per x64. Questo problema interessa solo le librerie x64. In questo modo la libreria matematica viene ripristinata utilizzando le implementazioni non FMA3.