如何获得"总线错误"?

Laz*_*zer 15 c++ bus-error

我正在努力解决总线错误.

一种方法是错位访问,我尝试了这里这里给出的例子,但没有错误对我来说 - 程序执行得很好.

是否存在一些肯定会产生总线错误的情况?

eph*_*ent 17

这应该可靠地导致SIGBUS符合POSIX的系统.

#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
int main() {
    FILE *f = tmpfile();
    int *m = mmap(0, 4, PROT_WRITE, MAP_PRIVATE, fileno(f), 0);
    *m = 0;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

从单Unix规范,mmap:

pa开始并且在对象结束之后继续len字节到整个页面的地址范围内的引用将导致SIGBUS信号的传递.

  • 我知道这是一个旧线程,但是.. 谁能解释为什么这会导致“总线错误”?我知道总线错误发生在 `*m = 0;` 行上,但我不明白它与此答案中引用的 SIGBUS 信号的解释有何关系。 (2认同)

Ign*_*ams 12

只能在以下硬件平台上调用总线错误:

  1. 需要对齐访问权限,以及
  2. 不要通过执行两次对齐访问并组合结果来补偿未对齐的访问.

您可能无法访问此类系统.

  • 除了未对齐的内存访问之外,通常还有其他方式可以发生总线错误.关于导致总线错误的原因(甚至是什么构成总线错误),它是非常具体的平台. (4认同)
  • 你有SPARC或MIPS设备吗? (2认同)

Alo*_*hal 7

尝试以下方面的事情:

#include <signal.h>
int main(void)
{
    raise(SIGBUS);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(我知道,可能不是你想要的答案,但几乎可以肯定会给你一个"总线错误"!)