การแก้ไข: โปรแกรมที่มีอยู่แล้วภายใน Visual C++ 2013 หยุดทํางานด้วยข้อยกเว้น "คําสั่งไม่ถูกต้อง"

นำไปใช้กับ
Visual Studio Community 2013

อาการ

เมื่อคุณสร้างโปรแกรมโดยใช้ Microsoft Visual C++ 2013 โปรแกรมหยุดทํางาน และคุณได้รับข้อยกเว้น "คําสั่งที่ไม่ถูกต้อง" ปัญหานี้เกิดขึ้นเนื่องจากบางฟังก์ชันไลบรารีคณิตศาสตร์แบบจุดลอยตัวใน Visual C++ 2013 x64 C Runtime (CRT) ไม่ตรวจสอบอย่างถูกต้องว่าคําแนะนํา AVX และ FMA3 บางอย่างพร้อมใช้งานก่อนที่ฟังก์ชันจะพยายามใช้ ถ้าคําแนะนําไม่สามารถใช้งานได้ การเรียกฟังก์ชันเหล่านี้ทําให้เกิดข้อยกเว้นคําสั่งที่ไม่ถูกต้อง (0xc000001d) ฟังก์ชันที่ได้รับผลกระทบประกอบด้วย log, log10 และ pow และอื่นๆ 

ปัญหานี้มักจะเกิดขึ้นในสถานการณ์ต่อไปนี้:

  • บนระบบปฏิบัติการ Windows รุ่นเก่าที่ไม่สนับสนุนการบันทึกสถานะ AVX (ตัวอย่างเช่น Windows Vista) หากใช้กับคอมพิวเตอร์ที่สนับสนุนชุดคําสั่ง AVX

  • หากการบันทึกสถานะ AVX ถูกปิดใช้งานอย่างชัดเจนในการกําหนดค่าการบูตระบบปฏิบัติการ

  • ใน Windows Preinstall Environment (Windows PE)

    หมายเหตุ Windows PE ไม่สนับสนุนการบันทึกสถานะ AVX

มีการรายงานปัญหานี้ใน Microsoft Connect:

ฟังก์ชัน x64 log() ใช้คําสั่ง 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 Redistributable – 12.0.40660.0 ที่อัปเดตหรือเวอร์ชันที่ใหม่กว่า

ถ้าไบนารี C++ ที่ได้รับผลกระทบของคุณเชื่อมโยง Visual C++ 2013 C Runtime แบบคงที่ คุณต้องอัปเดตการติดตั้ง Visual Studio 2013 ด้วยการติดตั้งโปรแกรมแก้ไขด่วนของ 3174417 และสร้างใหม่ และปรับใช้ไบนารีที่ได้รับผลกระทบใหม่

หมายเหตุ ปัญหานี้ไม่ส่งผลกระทบต่อ Visual C++ C Runtime เวอร์ชันที่เก่ากว่า (Visual C++ 2012 และเวอร์ชันก่อนหน้า) ปัญหาได้รับการแก้ไขก่อนการเผยแพร่ Universal CRT ที่ใช้โดย Visual C++ 2015 ครั้งแรก

ศูนย์ดาวน์โหลด Microsoft

เมื่อต้องการอัปเดต Visual C++ 2013 C Runtime ที่ลิงก์แบบคงที่ โปรแกรมแก้ไขด่วน 3174417 จะถูกเผยแพร่เป็นการอัปเดตการดาวน์โหลดเท่านั้นและไม่ได้กระจายผ่าน Windows Update โดยสามารถดูได้ที่เว็บไซต์ศูนย์ดาวน์โหลด Microsoft:

ดาวน์โหลด แพคเกจทันที

เมื่อต้องการอัปเดต DLL 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