汚いプログラム

社内で遭遇したことのある汚いプログラム(C 言語)の例。

  • 境界値チェックが甘々。正しくない入力値を与えると SEGV で落ちる。
    • 外部からの入力を受け取るルーチンでそれはだめだろう。
  • 何でもかんでもグローバル変数・グローバル関数。しかもその変数や関数の名前が1文字だったり一般名詞だったりする。
    • しかも、それがライブラリとして提供されている。もちろん namespace なんて発想は無い。
  • 実行時コンテキストを関数の中に static 変数で持っている。
    • いまどき MT-safe でないライブラリはクソだ。(I/O やデバイスを扱っているなど、やむをえない理由があれば話は別)
    • コンテキスト用の構造体を定義して、引き数にポインタとして与えるのが筋だろうに。
  • 関数プロトタイプが

int function(int *out_size, int in_size, char *in1, char *in2, char *out1, char *out2, char *out3);

みたいな感じ。

    • 似たような型の引き数が多すぎ。順番覚えるの無理。こういう時は、引き数用の構造体を定義して、それへのポインタを与えるのが筋だろうに。
    • せめて const ポインタを使え。

こういうプログラムを書く人は、他人の書いたプログラムなんて読まないんだろうなあ。
あと、経験に基づく観察によれば、理論系の研究者気質な人が実装するプログラムには上で書いたような傾向が顕著に現れる気がする。アルゴリズム実証用のテストプログラムくらいしか書いたことがないとか、他人とプログラムを共同開発したことがないとか、そこいら辺が原因ではなかろうか。
で、何が腹立たしいかというと、突き返して説明して作り直させる時間も権力も無いというのが最も腹立たしい。