いいひと連合:問題のプログラム
今回、専門用語がかなり出てくる回ですが、話の本筋には関係ありませんので雰囲気だけ眺めて頂ければ幸いです。
事件が起こったのは金曜の夕方だった。
起こったというか、オレが起こしたとも言う。。。
「えー!なにこれ?!」
作業をしていた星川七海が悲鳴のような声を上げた。
「どうした?」
主任の平沼が反応する。
「見てくださいよ。これ、どうしょうもないです。OSかコンパイラの問題じゃないですか?」
席に来た平沼に七海が説明する。
彼女は今日クライアントから問い合わせの合った事象を調査していた。特定の条件でシステムが異常終了すると。
そして様々な条件を試し、異常終了を再現させることに成功した。
再現さえ出来れば、後はデバッガというツールでプログラムを1行ずつ実行し、中で何が起こっているかを調べればいい。
しかし・・・
「ん?なんだこりゃ?」
画面を見た平沼も腕を組んだ。
プログラムは以下の21129行で異常終了している。
21128 list_init();
21129
21130 if(make_work_eria(code, a56w_alloc(code)) == -1) {
21131 return A56W_OPEN_ERR;
21132 }
21129行、即ち、プログラムが何も書かれてない所でエラーが起きているのだ。
「エラーの種類は?」
「アクセス違反です」
「リビルドしてみても一緒?」
「一緒です」
「何々?」
一人、また一人と寄って来る。
「これ、どこかでメモリ壊してるクサいですね。デバッガ自体が正常に動いて無いですから」
和泉が言った。彼はこのチームでは知識が豊富で通っている。
「えーーー、壊してるって、どこでですか?」
「それは分からないよ。だからCってヤッカイなんだ。Cは何でもできるけど何でも壊せてしまう」
CとはC言語のこと。プログラミング言語としてはかなり古い部類だが、顧客が使っている過去のシステムにはまだまだ多くある。そんなプログラミング言語に関する蘊蓄を和泉が語る。
「もーやだ」
「だから、こんな時代遅れなシステムは早く捨ててパッケージ使えばいいんですよ」
と和泉。
「その通りなんだけど、クライアントにも事情はあるからな」
平沼がなだめるように言う。
「その事情も踏まえてプレゼンし、啓蒙することが結局はwin-winになると思いますけど」
和泉は斜に構えたように言う。
「まぁ、でもそれは今は言えないよな・・・」
と平沼。
そんな話に聞き耳を立ているウチにオレはピンと来た。似たような事象は経験がある。
念の為、生成された機械語を確認して確信した。
「あのーーー、たぶん、分かりました」
と、手を上げる。
「えっ?」
みんなが振り返る。
「結論から言うと、この21130行のif文の中のa56w_allocって関数の中でアクセス違反が起きてます」
「そうなの?」
「試しに修正版のソース送ったので、それでビルドしてみてください」
オレは共有フォルダに置いたソースファイルを七海に指示する。
「ホントだ!エラー起こらない」
「これ、引数codeによってメモリを確保しているんですが、今回の事象のcode時に確保する領域が明らかに足りません。その後の初期化部分で落ちてます。そんなに難しい不良じゃないんで、今日中に修正版出せますよ」
とオレ。
「いや」
和泉が不満げに言う。
「デバッガがこんなおかしな挙動するからには、他にメモリ破壊があるかもしれませんよ。もっと調査した方がいいのでは?」
「それもそうだな・・・」
と平沼。
「それも分かりました。これ、生成された機械語見てみたんですけど、あのエラーはデバッガとしては正常動作です」
「加藤さん、機械語読めるんですか?」
と七海が驚く。
「多少はね。で、これ、関数呼び出しをどう機械語翻訳してるかというと、引数をスタックに積んでから関数のアドレスをコールしている。この引数をスタックに積む所でアクセス違反が起きていたから、この形だとif文に入る前、即ち21129行でエラーになってたんだ」
そこで一旦言葉を切って周りを見る。
みなエンジニアではあるので、付いてきてはいるようだ。
「古いシステムのデバッガはプログラム行との対応雑だからね。これ、よくある現象なんだ。まぁ初見じゃ焦るよね。そもそも論なら、こんなメモリアロケートするような関数をそのまま引数に入れるって酷い作りだけどね。ともかく、分かってしまったら、難しいバグじゃないです」
「凄い!ありがとうございます!」
七海と双葉が拍手する。
しかし、他のメンバーの視線は冷ややかだった。
■裏設定等(詳しい人向け)
このデバッガの挙動、VC++6.0あたりの時代のC言語プログラマには、あるあるネタかと思います。
さすがに今時のデバッガはこんなに雑じゃないかと思いますが、32bitのレガシーシステムという裏設定ですのでご容赦ください。
作中のデバッガも架空の物です。(←言い訳 ^^;)




