kagamihogeの日記

kagamihogeの日記です。

コンパイルで防げるものは防ぎたい

中々見つからなかったバグがようやく判明したのでそのメモ。

とりあえずソースコード

hoge1.c

extern int func_hoge1(int a, int b, int c) {
//...
}

hoge2.c

int func_main() {
func_hoge1(20, 30);
}

func_hoge1 の引数は 3 つだが、func_main でそれを呼び出す個所では引数は 2 つしか指定してない。C をあんまり知らないというのも敗因だったのだが、これはコンパイル通るし実行するとなんとなく動いてしまう。

意味不明な動作を繰り返してたのだが、c がテキトーな値になることを考えれば納得。

元々 func_hoge1 の引数は 2 つだったらしいが、仕様変更があり引数 3 つになった。しかし担当者が修正しそこねていた、と推測。そしてその亡霊に延々と苦しめられたのが俺、という構図。
外部公開する関数はヘッダーにまとめといてくれればこんなことにはならんかったろうに。

ところで func_hoge1 のようなヘッダーに書かれてない extern な関数が既に山のようにあるんだが。仕様変更来たら、また似たような事態になるんじゃないのか?これ・・・。