מאפייני הבעיה

בעת בניית תוכנית באמצעות 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:

Download הורד כעת את החבילה.

כדי לעדכן את המקושרת באופן דינאמי Visual C++ 2013 C זמן ריצה קבצי Dll, מעודכנים להפצה חוזרת זמין. לקבלת מידע נוסף, עיין במאמר הבא מתוך מאגר הידע Microsoft Knowledge Base:

עדכון 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.

זקוק לעזרה נוספת?

הרחב את הכישורים שלך
סייר בהדרכה
קבל תכונות חדשות לפני כולם
הצטרף למשתתפי Microsoft insider

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלכם?

תודה על המשוב!

×