访问 NULL 指针的过程
C 语言中,NULL 的值是 0,即 NULL == 0
是成立的。我们前面说访问 NULL 指针的行为会产生不可预料的后果。但是在 Linux 系统中后果是确定的:访问空指针会产生 Segmentation fault
的错误。因此这里的"不可预料"指的是在不同系统产生的后果不一样。
让我们假设现在使用的是 C 语言,运行在 Linux 系统上,以此来分析访问 NULL 指针的过程。
- Linux 中,每个进程空间的 0x0 虚拟地址开始的线性区(memory region)都会被映射到一个用户态没有访问权限的页上。通过这样的映射,内核可以保证没有别的页会映射到这个区域。
- 编译器把空指针当做
0
对待,开心地让你去访问空指针。 - 缺页异常处理程序被调用,因为在 0x0 的页没有在物理内存里面。
- 缺页异常处理程序发现你没有访问的权限。
- 内核发送
SIGSEGV
信号给进程,该信号默认是让进程自杀。
Read full article from 访问 NULL 指针错误背后的原理 | ShareHub
No comments:
Post a Comment