NetBSD のソースコードを読んで「コードを読む」ことを勉強しています。
(興味のある方は < Code Reading: The Open Source Perspective > を読んでいます)
そして、私はこの機能を見つけました:
/* convert IP address to a string, but not into a single buffer
*/
char *
naddr_ntoa(naddr a)
{
#define NUM_BUFS 4
static int bufno;
static struct {
char str[16]; /* xxx.xxx.xxx.xxx\0 */
} bufs[NUM_BUFS];
char *s;
struct in_addr addr;
addr.s_addr = a;
strlcpy(bufs[bufno].str, inet_ntoa(addr), sizeof(bufs[bufno].str));
s = bufs[bufno].str;
bufno = (bufno+1) % NUM_BUFS;
return s;
#undef NUM_BUFS
}
inet_ntoa は再入可能ではないため、inet_ntoa 関数をラップするために 4 つの異なる一時バッファーが導入されています。
しかし、私には、この naddr_ntoa 関数も再入
可能ではないように思えます。静的な bufno 変数は他のユーザーによって操作される可能性があるため、ここでは一時バッファーが期待どおりに機能しないようです。
それで、それは潜在的なバグですか?