欢迎来到天天文库
浏览记录
ID:59927293
大小:631.00 KB
页数:19页
时间:2020-11-28
《软件编程低级错误:野指针上课讲义.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、软件编程低级错误:野指针野指针:多模块调用的指针删除未赋NULL【问题描述】当D服务执行过程完成后,最后一次修改内存数据库中的数据时发生coredump。【问题定位】D服务coredump处的代码如下:…//new一个CChargEvent对象,用于向共享内存中写入数据pobjChargingEvent=newCChargingEvent;//使用m_pSessionContext将pobjChargingEvent传递给其他模块m_pSessionContext->setDestTLV(pobj
2、ChargingEventEx);…deletepobjChargingEvent;//该行代码是读取操作内存数据库事务ID的,每当调用对内存数据库中的数据进行修改时,都会执行该行代码。TransactionKey=pCBSContext->getTransactionKey();//发生coredump处getTransactionKey的代码见下页野指针:多模块调用的指针删除未赋NULL(续)voidCCBSSessionContext::setDestTLV(CChargingEvent*p
3、ChargingEvent){m_pDestTLV=pChargingEvent;}ENIP::TInt8CCBSSessionContext::getTransactionKey(){if(NULL==m_pDestTLV){return0;}m_pDestTLV->getInt8Tag();…}【纠正措施】在D服务中语句“deletepobjChargingEvent;”之后加上语句“m_pSessionContext->setDestTLV(NULL);”即可。【举一反三】耦合度较强的模块互
4、相调用时,一定要仔细考虑其调用关系,防止已经删除(析构)的对象被再次使用。野指针:传递参数为局部变量【问题描述】SWM在下载升级包操作中增加了一个版本号参数,在验证中发现,对版本的校验中使用的版本号并非传入的版本号,而是被截断了,只保留了前20位,造成比较结果不一致。【问题定位】根据命令执行流程,在参数传递的每一个环节增加调试打印。发现是在调用VOS_CreateTask创建下载任务的环节,传入的版本号参数被截断。代码如下:VOS_CHARacSoftVer[SWM_VERSION_LEN]={0
5、};...aulArgs[0]=(VOS_UINT32)pTmpFtpInfo;aulArgs[1]=enFileType;aulArgs[2]=(VOS_UINT32)pInMsg;aulArgs[3]=(VOS_UINT32)acSoftVer;/*Createanewtaskforloading*/ulRet=VOS_CreateTask("SWM_COMM",&ulTaskID,SWM_OMUFtpTask,m_aulTaskPrio[VOS_PRIORITY_P1],VOS_NULL,a
6、ulArgs);...return;由于acSoftVer是局部变量,在VOS_CreateTask函数执行退出后便被释放,已经变成一个野指针。而SWM_OMUFtpTask函数和SWM_DldVerPkg函数却仍在使用,这就造成了指针所指内容被破坏。【纠正措施】acSoftVer改为动态分配内存,在SWM_OMUFtpTask函数退出前释放。临时对象产生野指针(1)【问题描述】报文结果中总是随机出现乱码,过一会儿又正常了。【问题定位】检视代码发现使用临时对象:constTCHAR*pTempSa
7、ve=(g_pSmuMEControl->GetErrInfoByID()).c_str();SMU_PARA_COPY(pTemp,pTempSave);GetErrInfoByID返回的是该函数内部定义的临时string变量,当函数调用过程完成后,临时变量的生命期就结束,变量将被删除。所以pTempSave指向内存已释放(野指针),继续使用,有时正常,有时出错。【纠正措施】将临时对象赋值给变量,修改代码如下:conststring&strTemp=g_pSmuMEControl->GetErr
8、InfoByID();constTCHAR*pTempSave=strTemp.c_str();SMU_PARA_COPY(pTemp,pTempSave);临时对象产生野指针(2)【问题描述】代码飞检发现如下代码:std::ostringstreamoStream;……constchar*cValue=oStream.str().c_str();….【问题定位】oStream.str()返回临时对象,他们将在表达式结尾析构。指针cValue指向内存已释放,变成了野指针。【纠正措施
此文档下载收益归作者所有