“总线错误”消息是什么意思,它与分段错误有什么不同?


当前回答

我相信内核会引发SIGBUS 当应用程序显示数据时 数据总线上的不对中。我认为 那是因为大多数[?现代编译器 对于大多数处理器,垫/对齐 为程序员提供的数据 以前的对准问题(至少) 减轻,因此一个人看不见 这些天SIGBUS太频繁(AFAIK)。

来自:这里

其他回答

段错误是访问不允许访问的内存。它是只读的,你没有权限等等。

总线错误试图访问不可能存在的内存。您使用了一个对系统没有意义的地址,或者该操作的地址类型是错误的。

导致总线错误的典型缓冲区溢出是:

{
    char buf[255];
    sprintf(buf,"%s:%s\n", ifname, message);
}

在这里,如果双引号("")中的字符串的大小大于buf大小,则会给出总线错误。

一个我在OS X上编程时遇到的总线错误的具体例子:

#include <string.h>
#include <stdio.h>

int main(void)
{
    char buffer[120];
    fgets(buffer, sizeof buffer, stdin);
    strcat("foo", buffer);
    return 0;
}

如果你不记得,文档strcat通过改变第一个参数将第二个参数附加到第一个参数(翻转参数,它可以正常工作)。在linux上这给出了一个分割错误(正如预期的那样),但在OS X上它给出了一个总线错误。为什么?我真的不知道。

我相信内核会引发SIGBUS 当应用程序显示数据时 数据总线上的不对中。我认为 那是因为大多数[?现代编译器 对于大多数处理器,垫/对齐 为程序员提供的数据 以前的对准问题(至少) 减轻,因此一个人看不见 这些天SIGBUS太频繁(AFAIK)。

来自:这里

我试图释放一个不小心在堆栈上的字符串:

#include <stdlib.h>

int main(void)
{
    char *str = "foo";
    free(str);
    return (EXIT_SUCCESS);
}

我的修复是strdup()堆栈上的字符串:

#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *str = strdup("foo");
    free(str);
    return (EXIT_SUCCESS);
}