我正在通过阅读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/

10-09 02:41