“总线错误”消息是什么意思,它与分段错误有什么不同?
当前回答
在POSIX系统上,当代码页由于某种原因无法换入时,还可以获得SIGBUS信号。
其他回答
mmap最小POSIX 7的例子
“总线错误”发生在内核向进程发送SIGBUS时。
一个因为ftruncate被遗忘而产生它的最小示例:
#include <fcntl.h> /* O_ constants */
#include <unistd.h> /* ftruncate */
#include <sys/mman.h> /* mmap */
int main() {
int fd;
int *map;
int size = sizeof(int);
char *name = "/a";
shm_unlink(name);
fd = shm_open(name, O_RDWR | O_CREAT, (mode_t)0600);
/* THIS is the cause of the problem. */
/*ftruncate(fd, size);*/
map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/* This is what generates the SIGBUS. */
*map = 0;
}
运行:
gcc -std=c99 main.c -lrt
./a.out
在Ubuntu 14.04中测试。
POSIX将SIGBUS描述为:
访问内存对象的未定义部分。
mmap规范说:
在从pa开始的地址范围内引用,并在对象结束后继续为len bytes到整个页面,将导致SIGBUS信号的传递。
shm_open表示它生成大小为0的对象:
共享内存对象的大小为0。
因此,在*map = 0处,我们将触及已分配对象的末端。
ARMv8 aarch64中未对齐的堆栈内存访问
这在:什么是总线错误?对于SPARC,但是在这里我将提供一个更可重复的示例。
你所需要的是一个独立的aarch64程序:
.global _start
_start:
asm_main_after_prologue:
/* misalign the stack out of 16-bit boundary */
add sp, sp, #-4
/* access the stack */
ldr w0, [sp]
/* exit syscall in case SIGBUS does not happen */
mov x0, 0
mov x8, 93
svc 0
然后,该程序在ThunderX2服务器机器上的Ubuntu 18.04 aarch64和Linux内核4.15.0上引发SIGBUS。
不幸的是,我不能在QEMU v4.0.0用户模式上重现它,我不知道为什么。
该错误似乎是可选的,由SCTLR_ELx控制。SA和SCTLR_EL1。SA0字段,我在这里进一步总结了相关文档。
我试图释放一个不小心在堆栈上的字符串:
#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);
}
一个我在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上它给出了一个总线错误。为什么?我真的不知道。
导致总线错误的典型缓冲区溢出是:
{
char buf[255];
sprintf(buf,"%s:%s\n", ifname, message);
}
在这里,如果双引号("")中的字符串的大小大于buf大小,则会给出总线错误。
对于我来说,由于没有声明程序集返回到.text部分,我意外触发了“总线错误”。这似乎是显而易见的,但它让我困惑了一段时间。
Eg.
.globl _myGlobal # Allocate a 64-bit global with the value 2
.data
.align 3
_myGlobal:
.quad 2
.globl _main # Main function code
_main:
push %rbp
从数据返回代码时缺少一个文本指令:
_myGlobal:
.quad 2
.text # <- This
.globl _main
_main:
希望这能对某人有所帮助
推荐文章
- 递归复制文件夹,不包括一些文件夹
- C多行宏:do/while(0) vs作用域块
- 如何使用文件的行作为命令的参数?
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- 运行ssh后立即执行命令
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- main()中的Return语句vs exit()
- 如果不是内存地址,C指针到底是什么?
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 保护可执行文件不受逆向工程的影响?
- 如何让命令行参数传递给unix/linux系统上正在运行的进程?
- 从C语言的函数返回一个struct