- บั๊กอายุ 20 ปีของ GTA San Andreas ปรากฏขึ้นบน Windows 11 24H2
- มีรายงานบั๊กที่ทำให้เครื่องบิน Skimmer หายไปใน GTA San Andreas บน Windows 11 24H2
- ปัญหานี้ไม่สามารถแก้ได้แม้จะใช้ SilentPatch
- บน Windows 11 23H2 ไม่พบปัญหานี้
- ผู้ใช้ที่อัปเดตเป็น Windows 11 24H2 ทุกคนพบเจอบั๊กนี้
การสืบหาบั๊ก
อะไรที่ผิดพลาด?
- เมื่อติดตั้ง SilentPatch เกมจะเกิดอาการค้าง
- พบว่าเกิดการติดอยู่ในลูปขนาดเล็กภายใน
CPlane::PreRender
- ความเร็วของใบพัดเครื่องบินถูกตั้งไว้สูงผิดปกติ
- ความเร็วของใบพัดถูกคำนวณตามสัดส่วนของระดับความสูงของเครื่องบิน
ทำไมและอย่างไร?
- ในการกำหนดค่า
vehicles.ide ของ Skimmer มีพารามิเตอร์ที่จำเป็นหายไป
- ใน Vice City นั้น Skimmer ถูกกำหนดเป็นเรือ
- ใน San Andreas มันถูกเปลี่ยนเป็นเครื่องบิน แต่ไม่ได้เพิ่มพารามิเตอร์ที่จำเป็นเข้าไป
สาเหตุรากแท้จริง
- ปัญหานี้เกิดขึ้นจากการเปลี่ยนแปลงวิธีใช้สแตกใน Windows 11 24H2
LeaveCriticalSection เริ่มใช้พื้นที่สแตกมากขึ้น
- ก่อนหน้านี้
fgets และ LeaveCriticalSection ไม่ได้เขียนทับพื้นที่สแตก แต่ตอนนี้เขียนทับแล้ว
ทำไมปัญหานี้เพิ่งเกิดขึ้นตอนนี้
- การเปลี่ยนแปลงใน Windows 11 24H2 ทำให้พื้นที่สแตกเปลี่ยนไป
- ปัญหานี้เกิดจากเกมใช้ตัวแปรโลคัลที่ยังไม่ได้ถูกกำหนดค่าเริ่มต้น
- บนแพลตฟอร์มอื่น ปัญหานี้ได้รับการแก้ไขไปก่อนแล้ว
ถ้าอยากแก้ปัญหานี้ในเกมต้องทำอย่างไร?
- จะมีการรวมโค้ดแก้ไขไว้ใน SilentPatch hotfix ตัวถัดไป
- สามารถแก้ปัญหาได้ด้วยการแก้ไฟล์
vehicles.ide ด้วยตนเอง
ทิ้งท้าย
- บั๊กนี้น่าสนใจเพราะเชื่อมโยงโดยตรงกับ OS รุ่นปล่อยเฉพาะ
- มันแสดงให้เห็นว่าการเปลี่ยนแปลง layout ของสแตกสามารถส่งผลต่อความเข้ากันได้
- ควรตรวจสอบความถูกต้องของข้อมูลนำเข้า และไม่ควรเมินเฉยต่อคำเตือนจากคอมไพเลอร์
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
scanfเพื่อดูว่าตรงกับจำนวนพารามิเตอร์หรือไม่ นอกเหนือจากนั้นมันก็ดูเหมือนข้อผิดพลาดของไฟล์ข้อมูลที่คอมไพเลอร์ไม่มีทางรู้-fsanitize=undefined,addressเพื่อจับ undefined behavior ตอนรันไทม์