我正在通过阅读 NetBSD 源代码来研究“阅读代码”。
(有兴趣的可以看<代码阅读:开源视角>我正在阅读)
我发现了这个功能:
/* 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
}
它引入了 4 个不同的临时缓冲区来包装 inet_ntoa 函数,因为 inet_ntoa 不是可重入的。
但在我看来,这个 naddr_ntoa 函数也不是可重入
的:静态 bufno 变量可以由其他变量操作,因此临时缓冲区在这里似乎没有按预期工作。
那么这是一个潜在的错误吗?