מאפייני הבעיה
בעת בניית תוכנית באמצעות Microsoft 2013 C++ חזותי, התוכנית קורסת ולקבל חריג "הוראה לא חוקית". מצב זה מתרחש מכיוון מספר פונקציות ספריית מתמטיקה של נקודה צפה בזמן הריצה Visual C++ 2013 x64 C (CRT) אין כראוי לבדוק אם קיימות הוראות מסוימות AVX ו- FMA3 לפני הפונקציות מנסים להשתמש בהם. אם ההוראות לא יהיו זמינות לשימוש, קריאות לפונקציות אלה לגרום לחריגה הוראה לא חוקית (0xc000001d). פונקציות המושפעת כוללות יומן, log10, ו- pow, ואחרים.
בעיה זו מתרחשת בעיקר להתרחש בתרחישים הבאים:-
על גירסה ישנה של מערכת ההפעלה Windows שאינה תומכת AVX מצב שמירת (לדוגמה, Windows Vista) אם נעשה שימוש במחשב התומך ערכת הוראה AVX
-
אם שמירה מצב AVX אינה זמינה במפורש בתצורת אתחול של מערכת ההפעלה
-
בסביבת קדם-התקנה של Windows (Windows PE)
הערה Windows PE אינו תומך AVX מצב שמירה.
בעיה זו דווחה על התחברות של Microsoft:
x64 log() פונקציה משתמשת הוראת AVX vpsrlq ללא קשר למערכת ההפעלה (כך היא קורסת ב- Vista x64) RTM של 2013 visual Studio: קוד C++ x64 באג הדור לקבלת הוראות AVX2
הגורם
בעיה זו מתרחשת כיוון הריצה Visual C++ 2013 x64 C אינו בודק אם מערכת ההפעלה תומכת AVX מצב שמירת לפני שהוא מנסה להפעיל הוראות AVX או FMA3.
פתרון
אם כל המושפעת C++ הקבצים הבינאריים אשר נוצרו באמצעות Visual C++ 2013 משתמש ה-DLL זמן ריצה של C (msvcr120.dll), התקן את מעודכן Microsoft Visual C++ 2013 להפצה חוזרת – 12.0.40660.0 או גירסה מתקדמת יותר.
אם את הקבצים הבינאריים של C++ המושפעת באופן סטטי לקשר את Visual C++ 2013 C בזמן ריצה, עליך לעדכן את ההתקנה של Visual Studio 2013 על-ידי התקנת התיקון החם 3174417, בנייה מחדש ואת פריסה מחדש של הקבצים הבינאריים המושפעת. הערה בעיה זו אינה משפיעה על גירסאות ישנות יותר של Visual C++ C זמן הריצה (Visual C++ 2012 וגירסאות קודמות). הבעיה תוקנה לפני פרסומו הראשוני של CRT אוניברסלי המשמש Visual C++ 2015.מרכז ההורדות של Microsoft
כדי לעדכן באופן סטטי מקושר Visual C++ 2013 C זמן הריצה, התיקון החם 3174417 פורסם כעדכון הורדה בלבד ומופצת אינה באמצעות Windows Update. הוא זמין בכל אתר האינטרנט של מרכז ההורדות של 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.
לקבלת מידע נוסף, ראה