今日も今日とて他人様の書いた素晴らしいコード*1のデバッグ。
本日俺を最高に「ハイ!」ってやつにさせてくれたコードはこちら。
int fd;色々省いてるんで分かり辛いけど、やってることは単純。なんかのデバイスをオープンして、そのあとリードしてる。ただ、ファイルディスクリプタ (fd) が open の返り値ではなくて、参照渡しの引数で返されるインタフェースになってることに注意。hogeDeviceOpen は成功すると 0、失敗すると -1 を返す仕様になっている。
fd = hogeDeviceOpen(&fd, READ_ONLY);hogeDeviceRead(fd, ...);
POSIX の open と似たようなもの、と勘違いしたのが敗因。書いた人間もおそらく同様の勘違いをしでかした上に、参照渡しの引数と返り値に同じ引数を使ったために起きた災害と推測。この後の read に渡すファイルディスクリプタが 0 か -1 しかないんだから、そりゃまともな動作はしないわけです。
hogeDeviceOpen の仕様を見る限りでは、どうやら open が成功したかどうかの数値とファイルディスクリプタを返す場所は別にしたかったらしい。それが裏目に出たというべきか、ファイルディスクリプタと返り値に同じ変数を使おうとした魂胆に感心すべきか・・・本当に悩ましい。
*1:人のことを言えた義理じゃないが