getnameinfo() でハマった・・・
getnameinfo() を使ったアプリケーションが、それを呼んだ後しばらくして落ちるという現象に悩んでいました。
Program received signal EXC_BAD_INSTRUCTION, Illegal instruction/operand.
とか、妙な感じで・・・
gdb で where すると、
(gdb) where
#0 0x94a6593d in __abort ()
#1 0x94a48674 in __stack_chk_fail ()
と、どうやらスタックが壊れている様子。
いろいろと調べてみると・・・
char service[NI_NUMERICSERV];if ( (rc = getnameinfo( (struct sockaddr *) &addr, sizeof(addr), hostname, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV)) == 0) {
さて、どこが変でしょう。
慣れた方ならすぐおわかりかもしれませんが、変数のサイズに NI_NUMERICSERV とフラグを与えてしまっています。
わかれば単純ですが、配列のオーバーフローを起こしていただけでした・・・
なかなか気がつかないものです。