- Bug de 20 anos em GTA San Andreas aparece no Windows 11 24H2
- Foi relatado um bug em GTA San Andreas no qual o avião Skimmer desaparece no Windows 11 24H2
- O problema não é resolvido nem com o uso do SilentPatch
- No Windows 11 23H2, o problema não ocorre
- Todos os usuários que atualizaram para o Windows 11 24H2 tiveram esse bug
Investigação do bug
O que deu errado?
- Ao instalar o SilentPatch, ocorre um problema em que o jogo trava
- Foi descoberto que o jogo fica preso em um pequeno loop dentro de
CPlane::PreRender
- A velocidade das hélices do avião estava configurada de forma anormalmente alta
- A velocidade das hélices é calculada proporcionalmente à altitude do avião
Por quê e como?
- Faltam parâmetros necessários na definição do Skimmer em
vehicles.ide
- Em Vice City, o Skimmer era definido como barco
- Em San Andreas, ele foi alterado para avião, mas os parâmetros necessários não foram adicionados
A verdadeira causa raiz
- O problema ocorre porque a forma de uso da pilha mudou no Windows 11 24H2
LeaveCriticalSection passou a usar mais espaço de pilha
- Antes,
fgets e LeaveCriticalSection não sobrescreviam o espaço da pilha, mas agora sobrescrevem
Por que isso só aconteceu agora?
- As mudanças do Windows 11 24H2 alteraram o espaço da pilha
- O problema ocorreu porque o jogo usava variáveis locais não inicializadas
- Em outras plataformas, esse problema já havia sido corrigido
Se você quiser corrigir esse problema no jogo
- A próxima correção emergencial do SilentPatch incluirá uma mudança no código
- Também é possível resolver o problema editando manualmente o arquivo
vehicles.ide
Considerações finais
- Esse bug é interessante por estar diretamente ligado a uma versão específica do sistema operacional
- Ele mostra que mudanças no layout da pilha podem afetar a compatibilidade
- É importante validar os dados de entrada e não ignorar avisos do compilador
1 comentários
Opiniões no Hacker News
scanf, para confirmar se corresponde ao número de parâmetros. Fora isso, parece um erro em arquivo de dados que o compilador não teria como conhecer-fsanitize=undefined,addresspara capturar comportamento indefinido em tempo de execução