2

C で IRC デーモンを実装するプロジェクトに取り組んでいます。これはまだ非常に初期の開発段階にあり、現在のところ、メイン プロセスで新しい接続を受け入れ、新しい接続ごとにスレッドを作成するだけです。 . クライアントからのすべてのメッセージは、接続されている他のすべてのクライアントにブロードキャストされます。

ソケットの読み取り時にスレッドがブロックされないように、libev のコールバック メカニズムを使用しています。各スレッドは、独自の個別のイベント ループを使用します。ここに私のmain()機能の一部があります:

int main(int argc, char *argv[]) {

    int portno = 6667;

    /* Libev stuff */
    struct ev_loop *loop = EV_DEFAULT;
    struct ev_io socket_watcher;

    /* Here, I create a socket called mainsock_fd, and then call bind() and listen() 
        ...
    */

    /* At this point, we're ready to accept new clients. Set the callback function for new connections */
    ev_io_init(&socket_watcher, connection_cb, mainsock_fd, EV_READ);
    ev_io_start(loop, &socket_watcher);

    /* This is where the problem lies */
    ev_loop(loop, 0);

    /* ... */

    return 0;
}

私は libev の専門家ではありません。libev のドキュメントとサンプル プログラムを読んでいます。このコードは期待どおりに機能しますが、valgrind で実行すると、次のエラーが発生します。

==20984== Command: ./yaircd
==20984== 
==20984== Invalid read of size 1
==20984==    at 0x40638D1: ev_run (in /usr/lib/libev.so.4.0.0)
==20984==    by 0x804923F: ev_loop (ev.h:820)
==20984==    by 0x8049410: main (yaircd.c:71)
==20984==  Address 0xbedf52df is just below the stack ptr.  To suppress, use: --workaround-gcc296-bugs=yes

71 行目は次の命令です。

ev_loop(loop, 0);

クライアントが接続されていない状態で、プログラムを起動するとすぐにエラーが表示されます。私が電話したという事実だけで、ev_loopこのエラーが発生します。

修正方法がわかりません。これまでにコーディングしたものが IRC サーバーのコアとなるものであり、バグが存在しないことを絶対に確認したいと考えています。きれいな valgrind 出力が欲しいです。

助言がありますか?

更新: サンプル プログラム ( http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#EXAMPLE_PROGRAM ) をコンパイルして実行したところ、valgrind が同じエラーを報告しました。これは のバグでlibevあるか、例が適切にコーディングされていないと推測しています。valgrind に関するセクションも読みました - http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#VALGRIND - しかし、それについて特別なことは何も見つかりませんでした。彼らのメーリングリストを試してみようと思います。

4

1 に答える 1