一安心

仕事で嵌ってしまった話を。
現在テストしているサーバ及び、サーバプログラムがあるのですが、先週末にプログラムに手を入れました。
修正後、makeを掛けるとリンクのエラーが。それまで使用していたMakefileなのにどうしてかと不思議に思いましたが、多分apt-get upgradで更新し続けたからなのでしょうと納得させていました。
ところが後日、プログラムが意図した通りに動作していないのです。
調べたところ、修正を施した付近の処理を行っていませんでした。
とりあえずfileコマンドでコンパイラのバージョンやlddでリンクしているライブラリ等を調べましたが、元々あった古いバージョンと違いは有りませんでした。
が、ls -lで見てみると、ファイルサイズが明らかにおかしい。小さいのです。
試しにstringsコマンドで、動作しない部分の文字列を確認してみると存在しない。
ソースを確認していくと・・・




ありましたよ。
直接の原因となっていたのはif文の{を省略していたことでした。C言語の使用でif文としての処理が1行だけの場合{}が省略できるのですが、if文の処理を追加していたにも関わらず、{}を追加してませんでした。
これにより、それまでif文の中にあった処理が1行ずれて必ず実行されることになります。
で、笑えるのはその処理がgoto文だったのです。

if(hogehoge)
  goto jump_address;

だったのが

if(hogehoge)
  hugahuga()
  goto jump_address;

という具合に。 これにより、goto以下の行は必ず実行されないことになります。
多分コンパイラの最適化により、それを察知したのでしょう(笑)。要らない処理は全て省かれて、プログラムサイズも小型化されました。
修正としては{}を入れるだけで済んだのですが、すっかり嵌ってしました。
一時は、コンパイラやらライブラリのバージョンアップが原因かと思っていましたが、大恥でした。