【问题标题】:SIGABRT in C LinuxC Linux 中的 SIGABRT
【发布时间】:2013-11-30 08:12:30
【问题描述】:

我在我的 C 程序中收到了一个奇怪的 SIGABRT,这是我出现问题的函数:

int get_interface_mac_addr(Interface* iface) {
    char arquivo[10];
    sprintf(arquivo, "/sys/class/net/%s/address", iface->interface_name);
    int fd;
    fd = open(arquivo, O_RDONLY, 0);
    char buf[100];
    read(fd, buf, sizeof (buf));
    buf[strlen(buf) - 1] = '\0';
    strcpy(iface->interface_mac_addr, buf);
    close(fd);
    return GET_MAC_ADDR_SUCCESS;
}

错误发生在“}”,最后一行代码。

我尝试使用 GDB 进行调试,但我是新手,所以我不明白 GDB 告诉我的很多事情。以下是 GDB 的输出:

Core was generated by `./vfirewall-monitor'.
Program terminated with signal 6, Aborted.
#0  0x00007f36c043b425 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007f36c043b425 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1  0x00007f36c043eb8b in __GI_abort () at abort.c:91
#2  0x00007f36c047939e in __libc_message (do_abort=2, fmt=0x7f36c058157f "*** %s ***: %s terminated\n")
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:201
#3  0x00007f36c050ff47 in __GI___fortify_fail (msg=0x7f36c0581567 "stack smashing detected") at fortify_fail.c:32
#4  0x00007f36c050ff10 in __stack_chk_fail () at stack_chk_fail.c:29
#5  0x00000000004029be in get_interface_mac_addr (iface=0x7f36b4004560) at interfaces.c:340
#6  0x00000000004022c9 in get_interfaces_info (iface=0x7f36b4004560) at interfaces.c:87
#7  0x0000000000402d9d in get_all_system_info () at kernel.c:109
#8  0x00007f36c07cce9a in start_thread (arg=0x7f36bb729700) at pthread_create.c:308
#9  0x00007f36c04f93fd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#10 0x0000000000000000 in ?? ()
(gdb)

有人知道在这种情况下发生了什么吗?我做错了什么,可以看看是什么?

非常感谢。

【问题讨论】:

    标签: c linux sigabrt


    【解决方案1】:
    char arquivo[10]; // <-- here
    sprintf(arquivo, "/sys/class/net/%s/address", iface->interface_name);
    

    arquivo 对于那个字符串来说太小了。

    您还应该检查 open() 的返回值:

    fd = open(arquivo, O_RDONLY, 0);
    if(fd < 0) {
        perror("open");
        // do something
    }
    

    这也是错误的:

    read(fd, buf, sizeof (buf));
    buf[strlen(buf) - 1] = '\0';
        ^^^^^^^^^^^
    

    read() 不会终止任何内容。您不能在 buf 上调用 strlen()。而是:

    int n = read(fd, buf, sizeof (buf));
    if(n < 0) {
        perror("read");
        // do something
    }
    buf[n] = '\0';
    

    【讨论】:

    • 你永远不应该使用sprintf。始终使用snprintf
    • 老兄!我怎么这么笨,我以前怎么看出来的?非常感谢,我会更改所有sprintf()
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多