- Ein 20 Jahre alter Bug in GTA San Andreas tritt unter Windows 11 24H2 zutage
- Es wurde ein Bug gemeldet, bei dem das Skimmer-Flugzeug in GTA San Andreas unter Windows 11 24H2 verschwindet
- Auch mit SilentPatch lässt sich das Problem nicht beheben
- Unter Windows 11 23H2 tritt das Problem nicht auf
- Alle Nutzer, die auf Windows 11 24H2 aktualisiert haben, erleben diesen Bug
Untersuchung des Bugs
Was ist schiefgelaufen?
- Bei installierter SilentPatch friert das Spiel ein
- Es wurde festgestellt, dass
CPlane::PreRender in einer kleinen Schleife hängen bleibt
- Die Rotorgeschwindigkeit des Flugzeugs wird auf einen ungewöhnlich hohen Wert gesetzt
- Die Rotorgeschwindigkeit wird proportional zur Flughöhe des Flugzeugs berechnet
Warum und wie?
- In der
vehicles.ide-Definition des Skimmer fehlt ein erforderlicher Parameter
- In Vice City war der Skimmer als Boot definiert
- In San Andreas wurde er zu einem Flugzeug geändert, aber der benötigte Parameter wurde nicht ergänzt
Die wahre Grundursache
- Das Problem tritt auf, weil sich die Art der Stack-Nutzung in Windows 11 24H2 geändert hat
LeaveCriticalSection verwendet mehr Stack-Speicher als zuvor
- Früher haben
fgets und LeaveCriticalSection den Stack-Bereich nicht überschrieben, jetzt tun sie es
Warum tritt das erst jetzt auf?
- Durch Änderungen in Windows 11 24H2 hat sich die Stack-Belegung verändert
- Das Spiel verwendet eine nicht initialisierte lokale Variable, wodurch das Problem entsteht
- Auf anderen Plattformen war das Problem bereits behoben
Wie kann man das Problem im Spiel beheben?
- Der nächste SilentPatch-Hotfix soll eine Codekorrektur enthalten
- Das Problem lässt sich auch durch manuelles Bearbeiten der Datei
vehicles.ide beheben
Schlusswort
- Dieser Bug ist interessant, weil er direkt mit einer bestimmten OS-Version verknüpft ist
- Er zeigt, dass Änderungen am Stack-Layout die Kompatibilität beeinflussen können
- Eingabedaten sollten validiert und Compiler-Warnungen nicht ignoriert werden
1 Kommentare
Hacker-News-Kommentare
scanfnicht geprüft wird, um sicherzustellen, dass er zur Anzahl der Parameter passt. Andernfalls sieht es eher nach einem Fehler in einer Datendatei aus, den der Compiler nicht kennen kann-fsanitize=undefined,addressverwenden, um undefiniertes Verhalten zur Laufzeit zu erkennen