【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

inet

VC++でビルドしたinetがMINIXで動きました。

ソースをインポートしてビルドしただけではパケットが壊れてすぐに落ちました。原因はbuf.hの以下のマクロでした。

#define ptr2acc_data(/* acc_t * */ a) (bf_temporary_acc=(a), \
  (&bf_temporary_acc->acc_buffer->buf_data_p[bf_temporary_acc-> \
    acc_offset]))

memcpy()

このマクロをbuf.cでmemcpy()の引数として同時に2つ使っていました。

memcpy(ptr2acc_data(acc_ptr_new)+offset_new,
	ptr2acc_data(acc_ptr_old)+offset_old, block_size);

最適化で評価順序が壊れてしまったようです。一時変数を使わないようにして対処しました。

#define ptr2acc_data(/* acc_t * */ a) \
  (&(a)->acc_buffer->buf_data_p[(a)->acc_offset])

デバッグ過程

あちこちにprintf()を埋め込みながら、どこで値が壊れているかを追ってデバッグしました。その過程をExcelにまとめました。

このファイルは公開するためにまとめたわけではなく、偶然の産物です。いじった場所と結果をメモするためスクリーンショットExcelに貼り付けていて、横にgit diffの結果を貼れば分かりやすいと気付いたのがきっかけです。結果としてVC++Excelとgitを併用する形になりました。

BUF_TRACK_ALLOC_FREE

ptr2acc_dataを直しただけではDHCPくらいしか動かなくて、ちょっとでも通信するとすぐに止まってしまいました。どこが問題なのか見当が付きませんでしたが、たまたま目に付いたBUF_TRACK_ALLOC_FREEマクロを有効にしたところ動作するようになりました。

このマクロはデバッグ情報として一部の関数に__FILE__と__LINE__を渡すだけで、なぜ動くようになったのかよく分かりません。多分、最適化が関係しているのではないかと思います。