神様来たりてバグ報告
説明回ですので、途中は読み飛ばしても大丈夫です。
エイアールの体を借りて、神様が語り掛けてくる。
「バフが重ね掛けされない事象についてのお問い合わせですね。」
神様の丁寧な口調は、余計に強いプレッシャーを感じる。
「はい。僕の体質が一体何なのか知りたいです。」
エイアールが伏し目がちに僕を見る。それは神様の視線。
「本事象は、あなたの体質でも特殊能力でもありません。バグです。申し訳ございません。」
「バグ…?」
僕の知らない言葉。
まさか神様が謝るとは思っていなかったから、神官たちから驚きの呼吸音が聞こえてくる。
それでも神様の声は揺らぎなく、落ち着いていた。
「本事象の詳細を知りたいですね。」
「もちろんです。」
神様は、詳しい説明をしてくれた。
まず、対象に付与されるバフとデバフ(以下、まとめてバフとします。)の効果は、両方とも同じ配列「バフ一覧」に格納されます。
そして、現在対象に付与されているバフの数を「バフ総数」という変数で管理しています。
本来、バフ効果の計算方法は「バフ一覧」を空白の要素が見つかるまで検索し、それまでの要素の効果を合計していくという仕様でしたが、アップデートした際に、「バフ総数」の値まで配列「バフ一覧」の要素の効果を合計していくという計算方法に変更となりました。
対象にバフが追加された時は、まず、配列「バフ一覧」を、空白の要素が見つかるまで検索し、その要素の添字を「バフ総数」に代入します。そして「バフ総数」で示される要素にバフを上書きします。
今回問題となるのは「バフ総数」のオーバーフロー対策です。
「バフ総数」が符号無し整数型の最大値65,535を越える時は、値を1とするように設計していました。
つまり、配列「バフ一覧」が65,535を超える要素を持った場合、「バフ総数」が1となり、効果を発揮するバフは一つだけとなります。
本来のバフ効果の計算方法であれば、「バフ総数」が1となっても、一番古いバフが上書きされるだけで、他の全ての効果が出るはずでした。しかし、アップデートで計算方法を変更したために、バフが重ね掛けないという事象が発生してしまいました。
これはオーバーフローによる異常な挙動を防ぐための処理でしたが、ヴィアール氏の指摘を受けて調査した結果、今回のバグが判明しました。
正直、僕にはちんぷんかんぷんだった。
エイアールや神官なら、分かっているのかも知れない。
でも、次の神様の言葉は僕にも理解できた。
「クラウド。現在あなたには、262,143個の永続バフが掛かっています。」




