早上检测昨天留下的内存泄露的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时,就返回。
由此要注意一点,对于函数的返回值需要慎重对待,能够检查的尽量检查。尤其是返回值涉及指针的,一定要避免空指针时,继续使用指针的清空。