访问空指针程序崩溃的底层剖析

在C/C++程序中,我们访问空指针,产生“不可预料”的错误,导致程序崩溃,那为什么程序会崩溃呢?

访问指针的时候虚拟地址就会向物理地址映射,此时页表会去查看这块地址,而这块地址被存放在只读区,当页表发现地址是无效的,就会反映给操作系统,操作系统就会发送11号信号终止此进程,所以进程异常终止程序崩溃

在 Linux 系统中:访问空指针会产生 Segmentation fault 的错误。因此这里的“不可预料”指的是在不同系统产生的后果不一样。

  • Linux 中,每个进程空间的 0x0 虚拟地址开始的线性区(memory region)都会被映射到一个用户态没有访问权限的页上。通过这样的映射,内核可以保证没有别的页会映射到这个区域。
  • 编译器把空指针当做 0 对待,开心地让你去访问空指针。
  • 缺页异常处理程序被调用,因为在 0x0 的页没有在物理内存里面。
  • 缺页异常处理程序发现你没有访问的权限。
  • 内核发送 SIGSEGV 信号给进程,该信号默认是让进程自杀。

可以看到:不需要特定的编译器实现或者内核的支持,只需要让一个页映射到 0x0 的虚拟地址上,就完美的实现了检测空指针的错误。

猜你喜欢

转载自blog.csdn.net/qq_40840459/article/details/81414090