中々見つからなかったバグがようやく判明したのでそのメモ。
とりあえずソースコード。
hoge1.cextern int func_hoge1(int a, int b, int c) {
//...
}
hoge2.cint func_main() {
func_hoge1(20, 30);
}
func_hoge1 の引数は 3 つだが、func_main でそれを呼び出す個所では引数は 2 つしか指定してない。C をあんまり知らないというのも敗因だったのだが、これはコンパイル通るし実行するとなんとなく動いてしまう。
意味不明な動作を繰り返してたのだが、c がテキトーな値になることを考えれば納得。
元々 func_hoge1 の引数は 2 つだったらしいが、仕様変更があり引数 3 つになった。しかし担当者が修正しそこねていた、と推測。そしてその亡霊に延々と苦しめられたのが俺、という構図。
外部公開する関数はヘッダーにまとめといてくれればこんなことにはならんかったろうに。
ところで func_hoge1 のようなヘッダーに書かれてない extern な関数が既に山のようにあるんだが。仕様変更来たら、また似たような事態になるんじゃないのか?これ・・・。