64ビットLinuxを再インストールして、誰かさんのプログラムをデバッグする

今日は Red Hat Enterprise Linux 6.1 x86_64 を再インストールした。

インストールする時に、基本サーバを選択して開発ツールソフトウェアを追加しておいた。開発ツールに気を取られてネットワークの設定をするのを忘れてしまった。まあこれは network-scripts/ を編集すればいいだけだ。

さて、自前のプログラム、といっても前任者が作ったものだが、をリコンパイルした。するとワーニングが山ほど出てくる。といってもほとんど全部が strcpy とか localtime の宣言がないというワーニングだ。こんなのヘッダファイルをインクルードすれば消える話なのに、なぜに放っておくんだろうか。たいした問題にはならないワーニングだけれども、他の重要なワーニングを見落とす可能性があるのに。なので、とりあえずヘッダファイルのインクルード指令を追加しておいた。

ということで実行してみると、指定されたディレクトリがないというエラーになる。しかしそのディレクトリは確かにある。ソースコードを眺めてみると、ログファイルを出力する仕掛けが埋め込まれていたので、それを有効にして実行してみた。

すると iconv 関数の戻り値が -1 になっているのでエラーで終わっている模様。しかし指定したディレクトリ名は ASCII コードの文字列なのになぜ。と思って iconv を呼び出しているところを見ると、size_t 型の変数へのポインタを引数として渡すところに、int 型の変数のアドレスを size_t * でキャストして渡している。strcpy のワーニングは放っておくのに、ここはちゃんとワーニングをつぶしたのか、偉い偉い。

というか、64ビット Linux では int は 4 バイト、size_t は 8 バイトだから、バッファーオーバーランが起こってるよこれ。よく暴走せずに動いたもんだなとよく見ると、その引数の int 型の変数の次の行で、使われていないchar型の配列が定義されている。ああ、これのおかげか。

しかし、型の違いを対症療法的にキャストで誤摩化そうとするのはどういう心理状況なんだろう。素直に変数を size_t で定義すればいいだけなのに。

というわけで、変数を size_t にしてリコンパイルしたら、無事動くようになりました。