さまざまなサーバーで実行するように設計された、一種のハートビートであるプログラムを開発しています。問題の関数を以下に再掲し、「友人」のリストを取得し、リスト内の「友人」ごとにハンドシェイク操作を実行します (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 つの異なるシステムでまったく同じように失敗します。)