You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu16.04下GCC5.4.0编译Socket代码加-O选项报错求助

问题根源与修复方案

嘿,这个问题其实是个典型的参数传错触发安全检查的问题,我来给你拆解一下:

核心错误原因

你调用poll函数时,第二个参数nfds传成了-1,这完全不符合函数的要求。poll的第二个参数是要告诉内核:你传入了多少个struct pollfd结构体需要监控——你这里只定义了1个fds变量,所以正确的值应该是1。

为什么只有开启-O优化才报错?因为GCC开启优化时,会启用一套更严格的边界检查机制(比如__poll_chk_warn这类安全封装函数)。当你传入-1时,由于nfds_t是无符号整数类型,这个值会被解析成一个极大的正数,远超过你实际提供的1个结构体的大小,所以编译器直接触发了缓冲区溢出警告,运行时也会检测到错误并终止程序。而无优化编译时,这些额外的安全检查没有生效,bug被暂时隐藏了,但你的代码其实一直存在未定义行为,随时可能崩溃。

修复步骤

直接把poll调用改成下面这样就能解决问题:

poll(&fds, 1, -1);

额外的代码完善建议

顺便提一下,你的代码还缺少系统调用的错误检查,虽然这不是当前问题的直接原因,但生产环境中很容易导致崩溃:

  • 比如getaddrinfo可能失败,此时ai会是NULL,后续访问ai->ai_family会直接触发段错误
  • socket、bind、listen这些函数也可能因为权限、端口占用等原因失败

给你补充了错误处理的示例片段:

int main() {
    struct addrinfo *ai, hints;
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC; // 建议明确指定协议族,或按需设置
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE; // 监听socket必备标志

    int ret = getaddrinfo(NULL, "7471", &hints, &ai);
    if (ret != 0) {
        fprintf(stderr, "getaddrinfo failed: %s\n", gai_strerror(ret));
        return EXIT_FAILURE;
    }

    int listen_fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    if (listen_fd == -1) {
        perror("socket failed");
        freeaddrinfo(ai);
        return EXIT_FAILURE;
    }

    if (bind(listen_fd, ai->ai_addr, ai->ai_addrlen) == -1) {
        perror("bind failed");
        close(listen_fd);
        freeaddrinfo(ai);
        return EXIT_FAILURE;
    }

    freeaddrinfo(ai);

    if (listen(listen_fd, 128) == -1) {
        perror("listen failed");
        close(listen_fd);
        return EXIT_FAILURE;
    }

    struct pollfd fds;
    fds.fd = listen_fd;
    fds.events = POLLIN;
    poll(&fds, 1, -1);

    close(listen_fd);
    return EXIT_SUCCESS;
}

修改后,不管是无优化还是开启-O选项编译,程序都能正常运行,不会再出现缓冲区溢出的错误。

内容的提问来源于stack exchange,提问作者JB_User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:26:33