わりとデスマーチだった

や、そんなに大げさじゃないけど。リリース前にとある入力条件で落ちることが発覚。32bit環境では動くのに64bit環境でだけ落ちる。CPUのbit数に依存するコードなんてC++でそんな器用な真似はあえて作りこまない限り起こらないんだけどなぁ・・・。まあそうは言ってもリリース後に落ちたらシャレにならんしデバッグ作業開始。
幸いにして再現性は非常に高いので原因のクラスはわりと早く特定できた。諸事情によりデバッガが使えないので完全な場所の特定はこの時点では出来なかったが予想はついた。おそらくスタックオーバーフロー。ちょうど再帰関数をつかっていた。なんで32bitで大丈夫で64bitでダメだったのか?予想としては引数がポインタだったので同じ処理でも64bitの方がスタックを倍使うから。というわけでこの処理の部分を再帰関数ナシに作り変えた。・・・大変だったorz
んで再テスト。・・・また落ちた(’’ どうやらスタックオーバーフローが原因ではなかったらしい。まあでも将来的には起こる可能性もあったわけだし作り直し自体は無駄ではない。しかしバグ取りという観点では無駄な作業だった。

まあその後いろいろとごにょごにょあって結論だけ書くと配列外参照が原因だった。あくまで見るだけで書き換えてはいない。どうやら環境依存の原因はそこにあるらしい。32bitではヘンな値を取ってくるだけですんだ(その値は使っていない)のだが64bitでは参照した時点で落ちるらしい。まあこれはbit数は直接関係なくてwindowsのバージョンがあがったことによりメモリまわりのセキュリティがあがったためであり、32bitだと互換性のために落ちないような仕様を残しておいたのだろう・・・という個人的予想。


まあ、そんなこんなで苦労した結果、経験値と残業がとっても溜まった最近でした。