操作
バグ #476
完了バグ #474: コードベース健全性: メモリリーク・重大バグの一括調査と修正
外部スキンでプレイ中クラッシュ(JudgeManager ゼロ除算 / 配列外)
バグ #476:
外部スキンでプレイ中クラッシュ(JudgeManager ゼロ除算 / 配列外)
説明
現象¶
不正/特殊なサードパーティスキンを使うと、最初の判定ノートで ArithmeticException: / by zero または ArrayIndexOutOfBoundsException が発生しプレイがクラッシュする。
原因と対象¶
src/bms/player/beatoraja/play/JudgeManager.java:667-668
final int judgeindex = state.lane / (lanelength / judgenow.length);
context.setTimerOn(JUDGE_TIMER[judgeindex]); // JUDGE_TIMER は要素数 3
-
judgenow = new int[judgeregion](:131、judgeregion はスキン由来PlaySkin.getJudgeregion())。 -
judgeregion > states.length(レーン数より判定領域数が多い)のときlanelength / judgenow.length == 0となりゼロ除算。 - 逆に
judgeindex >= 3になる構成でJUDGE_TIMER[judgeindex]が配列外(配列長 3、:635)。
修正方針¶
- 除数が 0 になるケースのガード(
lanelength/judgenow.lengthの関係チェック)。 -
judgeindexをJUDGE_TIMER.lengthでクランプ。 - 実装前に最新の
JudgeManagerを再確認(行番号がもとエージェント調査時点)。
検証¶
- judgeregion がレーン数と不一致な検証用スキンでプレイ開始してもクラッシュしない。
操作