首页 > 解决方案 > 以下函数在 strncpy 上给出分段错误,有人可以解释为什么会发生此分段错误

问题描述

IFNAMSIZ = 16

static STATUS_CODE __bind(int sock_fd, const char *interface)
    {

            struct sockaddr sock_addr;
            memset(&sock_addr, '\0', sizeof(sock_addr));
            strncpy(sock_addr.sa_data, interface, IFNAMSIZ);
            sock_addr.sa_family = AF_PACKET;

            if (bind(sock_fd, &sock_addr, sizeof(struct sockaddr)) < 0) {
                    EPRINT("bind failed: %s", strerror(errno));
                    return FAILURE;
            }
        return SUCCESS;
}

标签: csegmentation-fault

解决方案


有人可以解释为什么会发生这种分段错误

在 Linux 上,您的代码可能在此处出现堆栈缓冲区溢出:

strncpy(sock_addr.sa_data, interface, IFNAMSIZ);

假设IFNAMSIZ = 16,因为sizeof(sa_data) == 14。但是,这极不可能导致- 堆栈SIGSEGV strncpy还有很多其他数据。

更可能导致崩溃的原因是interface您传入的是NULL. -g通过使用调试信息(通常是标志)编译程序并在调试器下运行它,这应该是微不足道的。


推荐阅读