- Un bug de 20 años en GTA San Andreas sale a la luz en Windows 11 24H2
- Se reportó un bug en GTA San Andreas donde el avión Skimmer desaparece en Windows 11 24H2
- El problema no se resuelve ni siquiera usando SilentPatch
- En Windows 11 23H2 el problema no ocurre
- Todos los usuarios que actualizaron a Windows 11 24H2 experimentan este bug
Investigación del bug
¿Qué salió mal?
- Al instalar SilentPatch, el juego se congela
- Se descubrió que queda atrapado en un pequeño bucle dentro de
CPlane::PreRender
- La velocidad de las hélices del avión está configurada de forma anormalmente alta
- La velocidad de las hélices se calcula en proporción a la altitud del avión
¿Por qué y cómo?
- Falta un parámetro necesario en la definición de Skimmer dentro de
vehicles.ide
- En Vice City, Skimmer estaba definido como un bote
- En San Andreas se cambió a avión, pero no se agregó el parámetro necesario
La verdadera causa raíz
- El problema ocurre porque en Windows 11 24H2 cambió la forma en que se usa la pila
LeaveCriticalSection ahora pasa a usar más espacio de pila
- Antes,
fgets y LeaveCriticalSection no sobrescribían ese espacio de pila, pero ahora sí
Por qué este problema aparece recién ahora
- Los cambios en Windows 11 24H2 alteraron el espacio de pila
- El juego provocaba este problema al usar una variable local sin inicializar
- En otras plataformas este problema ya había sido corregido
¿Quieres arreglar este problema en el juego?
- La próxima corrección urgente de SilentPatch incluirá un arreglo en el código
- También es posible resolver el problema editando manualmente el archivo
vehicles.ide
Comentario final
- Este bug es interesante porque está directamente ligado a una versión específica del sistema operativo
- Muestra que los cambios en el layout de la pila pueden afectar la compatibilidad
- Hay que validar los datos de entrada y no ignorar las advertencias del compilador
1 comentarios
Opiniones de Hacker News
scanfpara comprobar que coincide con la cantidad de parámetros. Fuera de eso, parece un error en un archivo de datos que el compilador no puede conocer-fsanitize=undefined,addresspara detectar comportamiento indefinido en tiempo de ejecución