- GTA San Andreasの20年前のバグがWindows 11 24H2で表面化
- GTA San AndreasでSkimmer飛行機がWindows 11 24H2で消えるバグが報告された
- SilentPatchを使っても問題は解決しない
- Windows 11 23H2では問題は発生しない
- Windows 11 24H2に更新したユーザーは全員このバグを経験している
バグ調査
何が間違っていたのか?
- SilentPatchをインストールするとゲームがフリーズする問題が発生
CPlane::PreRenderで小さなループに閉じ込められる現象を発見
- 飛行機のブレード速度が異常に高く設定されている
- ブレード速度は飛行機の高度に比例して計算される
なぜ、そしてどのように?
- Skimmerの
vehicles.ide定義で必要なパラメータが欠落していた
- Vice CityではSkimmerはボートとして定義されていた
- San Andreasで飛行機に変更されたが、必要なパラメータが追加されなかった
真の根本原因
- Windows 11 24H2でスタック使用方法が変更され、問題が発生した
LeaveCriticalSectionがスタック領域をより多く使うようになった
- 以前は
fgetsとLeaveCriticalSectionがスタック領域を上書きしていなかったが、今では上書きするようになった
この問題が今になって発生した理由
- Windows 11 24H2の変更によりスタック領域が変化した
- ゲームが初期化されていないローカル変数を使用していたことで発生した問題
- 他のプラットフォームではすでに修正されていた問題だった
ゲームでこの問題を解決したいなら?
- 次回のSilentPatchホットフィックスにコード修正が含まれる予定
vehicles.ideファイルを手動で修正して問題を解決することも可能
最後に
- このバグは特定のOSリリースと直接結びついている点が興味深い
- スタックレイアウトの変更が互換性に影響し得ることを示している
- 入力データを検証し、コンパイラ警告を無視しないことが重要だ
1件のコメント
Hacker Newsの意見
scanfの戻り値を確認せず、引数の数と一致しているか検証していないことだろう。それ以外だと、コンパイラには分からないデータファイルのエラーのように見える-fsanitize=undefined,addressのようなツールを使う