Redis7.0代码分析总结之:用野指针来判断函数执行成功与否

在分析dict.cdict.h的代码时候,发现利用指针是否为空来判断函数是否执行成功。而且该指针可能还是一个 野指针

废话不多说,下面结合代码来描述说明!Let’s go!

出现野指针的函数是dictGenericDelete,位于src/dict.c源文件。
而该函数分别被两个函数调用:

  • dictUnlink
    在这里插入图片描述

  • dictDelete

其中dictUnlink是摘除该key对应的entry,不会释放内存空间。函数执行成功后返回的是该entry的内存地址,空间有效。不会产生野指针。
dictDelete是会直接释放key所在entry的内存地址空间,这个调用是会产生野指针的。具体请继续看dictGenericDelete对应的代码摘录:
在这里插入图片描述
第一个红框的内容,如果if条件为真,即nofree=0,就会调用dictFreeUnlinkedEntry释放he指向的节点,函数代码如下:
在这里插入图片描述
先是释放key,然后释放val。最后把he指向的entry也释放掉。
而最后调用的函数zfree则定义在src/zmalloc.c。代码如下:
在这里插入图片描偶述
这代码是带条件编译的。从整个代码逻辑来看,参数ptr指针,即he指针指向的内存地址虽然删除了,但he指针变量中的地址值依然是有效的,即ptr保存的值和he的值是相等的。在函数执行完以后,he就变成了野指针!!!

我们都知道野指针访问内存会存在不可预估的后果。一般都尽量小心!
纵观Redis的源代码,虽然逻辑上都是很清晰明了,会产生野指针的地方也只有删除节点的函数调用,而该函数出现的地方,都仅仅是用该野指针的值来判断函数是否执行成功而已。

可为什么要这样设计呢?为什么不直接类似其他函数,通过参数返回指针地址,函数直接返回值C_OKC_ERR

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值