0

さまざまなサーバーで実行するように設計された、一種のハートビートであるプログラムを開発しています。問題の関数を以下に再掲し、「友人」のリストを取得し、リスト内の「友人」ごとにハンドシェイク操作を実行します (ping_and_report を介して、図示されていません)。

問題は、このルーチンへの最初の呼び出しで、strtok_r がソースに存在するよりも多くの文字列を返すように見えることです。その理由は特定できませんでした。コード:

void pingServerList(int dummy) {
    char *p ;
    char *my_friends ;
    char *nextSvr, *savePtr ; ;
    char  *separators = ",; \t" ;
    server_list_t *ent = NULL ;
    static long round_nbr = 0  ;
    unsigned int len ;
    time_t now ;
    char   message[4096] ;
    char   *hex ;

    round_nbr++ ;
    p = get_server_list() ;
    if (p) {
        len =strlen(p) ;
        my_friends = malloc(len+1) ;
        strncpy(my_friends, p, len) ;
        }
    nextSvr = strtok_r(my_friends, separators, &savePtr) ;
    while (nextSvr) {
        // Ensure that nobody messes with nextSvr. . .
        char *workSvr = malloc(strlen(nextSvr) + 1) ;
        strcpy(workSvr, nextSvr) ;
        if (debug) {
            len = strlen(workSvr) * 2 + 3 ;
            hex = malloc(len) ;
            get_hex_val(workSvr, hex, len) ;
            write_log(fp_debug
                    , "Server: %s (x'%s')"
                    , workSvr, hex) ;
            free(hex) ;
            }
        ping_and_report(workSvr, round_nbr) ;
        free(workSvr) ;
        nextSvr = strtok_r(NULL, separators, &savePtr) ;
        }

... その時点ではそれほど複雑ではないと思います。そして、値をいじる余地はありません。しかし、ログ ファイルはここで問題を明らかにします:

2012-07-09 23:26 Debug activated...
2012-07-09 23:26 get_server_list() returning velmicro, stora-2 (x'76656C6D6963726F2C2073746F72612D32')
2012-07-09 23:26 Server: velmicro (x'76656C6D6963726F')
2012-07-09 23:26 Server: stora-2 (x'73746F72612D32')
2012-07-09 23:26 Server: re (x'726519')

クレイジーなことは、(少なくともコードの複数の実行から) これは最初の呼び出しでのみ失敗することです。コール 2 ~ n (n は百の位) では、この問題は発生しません。

私が明らかに欠けているものを見ている人はいますか?(ところで: これは、Linux のバージョンを持つ 4 つの異なるシステムでまったく同じように失敗します。)

4

1 に答える 1

3

これを書くとき

strncpy(my_friends, p, len) ;

my_friends\0 で終わることを保証していません

試す

strncpy(my_friends, p, len)[len-1] = '\0';

代替。calloc を使用して my_friends を割り当てます

于 2012-07-10T10:26:33.107 に答える