我正在通过阅读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变量可以由其他变量操纵,因此临时缓冲区似乎无法按预期工作。
那是潜在的错误吗?
最佳答案
是的,这是一个潜在的错误。如果您想要一个最有可能重入的类似功能,则可以使用例如inet_ntop
(也可同时处理IPv6)。
关于c - 是否使用此netbsd代码重新进入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12506875/