野指针崩溃原因

前言

无论是c语言的开发还是c++的开发,都会遇到野指针崩溃问题,所谓的野指针崩溃问题,其实就是这个指针已经被释放了,但是程序的其他地方还在访问该指针的内容,从而导致崩溃。

专业且全面的解释崩溃

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

野指针是否会导致程序的崩溃(我只能说有可能会崩溃)

情况一、解引用读野指针不崩溃

     可能是因为内存free/delete后虽然被内存管理收回但还没让系统收回(无论是libc的内存管理或谷歌的ptmalloc的内存管理,都会先申请一段内存然后慢慢用,觉的多了就释放点,觉的少了就不释放,留在手里重复使用,会发现top观察物理内存并没有变小),这种情况通常读是不会引起崩溃的,可能读出来一个预期的值(free/delete回收内存的时候如果内存比较大内存管理不会帮你把回收的内存清0,毕竟太浪费效率了),也可能读出来0(回收的内存很小,内存管理会帮你把数据清0,尽可能的让你有迹可循)。

     也可能该内存地址又被别的地方重新malloc/new了出来,这是个有效的内存地址但值已经被别的地方赋值了进去,虽然读是不会引起崩溃的,但是多半会读到一个非预期的值(被别的业务赋值成了别的业务需要的值,如果该地址是个结构体,结构体里还有个堆指针,而别的业务认为此处可能是个int值,而你当成指针去解引用,那结局必然会很悲惨)

情况二、解引用写野指针不崩溃

    可能是因为内存free/delete后虽然被内存管理收回但没让系统收回,该地址的内存仍然在内存管理的手中,所以去该地址写数据虽然也不会立即引起崩溃,但是去写已经被内存管理收回的内存大概率会破坏内存管理的链状结构,当你下一次malloc/new/free/delete申请释放内存的时候极有可能引起崩溃(内存管理会遍历自己手中的内存块给你申请内存或者直接去free这个指针地址的前几个字节找这块内存的长度想要释放),且此种崩溃和写越界(破坏内存管理链状结构)的现象一致,大多是在malloc或free处崩溃,发现的时候已经是第二现场,此问题极难排查(可以尝试用asan工具老化复现,复现后程序会定在第一现场并输出信息)

情况三、解引用读写野指针崩溃

    可能是因为内存free/delete后被内存管理收回,并且此地址内存也被内存管理归还给了系统(内存管理回收后发现自己手中的内存太多了释放了一部分),读和写这块内存时,会通过虚拟内存查找对应的物理内存,发现没有找到,说明这是个非法的地址,操作系统会发送崩溃信号。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值