函数返回值检查的必要性

早上检测昨天留下的内存泄露的bug,

程序运行一段时间后总会发生SIGSEGV信号,明显内存访问出错了。由于是多线程,开始时定位出错的原因花费了不少时间。在几个线程中来回查找,开始找到的疑似bug代码的片段,经分析与检测发现并不是真正的原因。

直到注释掉一段代码后,SIGSEGV信号没有再出现,感觉错误出现在这个函数中。
进入函数分析后,发现错误应该存在于strstr()函数的返回值上,
源代码:
    NumAddr = strstr(pData,"+86");

    for(i=0;i<14;i++)
        NumBuf[i]=*(
NumAddr +i);
    NumBuf [14] = '\0';
修改后的代码:
    NumAddr  = strstr( pData ,"+86");

    if(
NumAddr  == NULL)
        return;

    for(i=0;i<14;i++)
       
NumBuf [i]=*( NumAddr  +i);
    NumBuf [14] = '\0';

源代码在调用strstr()函数后,没有判断返回值就直接使用。如果pData中没有“+86”这个字符串,那么strstr()的返回值将为空,NumAddr的值就是NULL,如果下一步直接访问这个,势必要造成内存溢出。修改后避免了这个问题。当为NULL时,就返回。

由此要注意一点,对于函数的返回值需要慎重对待,能够检查的尽量检查。尤其是返回值涉及指针的,一定要避免空指针时,继续使用指针的清空。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值