1 / 52
文档名称:

低级错误案例集.doc

格式:doc   大小:306KB   页数:52页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

低级错误案例集.doc

上传人:泰山小桥流水 2023/1/31 文件大小:306 KB

下载得到文件列表

低级错误案例集.doc

文档介绍

文档介绍:该【低级错误案例集 】是由【泰山小桥流水】上传分享,文档一共【52】页,该文档可以免费在线阅读,需要了解更多关于【低级错误案例集 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
TOP1资源泄漏
资源泄漏(包含内存泄漏)是代码Review中最常有的错误之一,申请的每个资源一定明
确由谁负责开释,何时开释,在哪处开释;在异常/错误/返回办理中,保持清醒的脑筋,清理战场。此处的资源还包含信号量、准时器、文件句柄等系统资源。

【问题描述】
宏里面有return语句以致内存泄漏事例一。
【问题分析】
错误代码:
/*定义宏MODEL_ASSERT_RETFAIL*/
#defineMODEL_ASSERT_RETFAIL(X)\
{\
if(X不合法)\
return;\
}
.//dosomething
MDSTrafficMsg*pMsg=VOS_AllocMsg(PID_MD,usLength);
if(NULL_PTR==pMsg)
{
return;
}
MDSDataListenerMgr*pDataListener=MDSDataInitalListenerMgr( );
MODEL_ASSERT_RETFAIL(pDataListener);
2)分析:
使用宏MODEL_ASSERT_RETFAIL检查pDataListener能否合法,假如不合法,则直接返回,
一旦返回,将以致前面经过指针pMsg申请到的信息包资源泄漏。
2020-5-26华为机密,未经允许不得扩散第1页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
【纠正方法】
在宏MODEL_ASSERT_RETFAIL分支判断return前加上VOS_FreeMsg(PID_MD,pMsg):该方法代码不够清楚,当用户看宏定义时,对VOS_FreeMsg(PID_MD,pMsg)不清楚还要跳回来看前面的代码。
设定该宏有返回值(指针不为空返回VOS_True,不然为VOS_False),将宏的return语句写在宏使用后(判断指针pDataListener合法性),若宏返回VOS_False开释pMsg并返回主调函
数:该方法在遇到只判断一个指针的合法性时,浪费代码行、降低代码飞检效率且可能存在
宏描述歧义等问题,简单的判断建议不使用宏。
【经验教训】
在XX版本的一个新模块的开发中,在公布从行进行大话务量测试考据时,发现系统内存资源不足,当时公布在即,经过协调多个技术专家封闭攻关,花了三时节间终于发现问题所在,人力成本高达3000元,对于内存使用,要保证开释闭环,全部异常退出点都需要开释内存。

【问题描述】
宏里面有return语句以致内存泄漏事例二。
【问题分析】
错误代码:
头文件中的宏定义以下:
#defineNODE_RETURN_ERROR(p)\
{\
if(NULL==p)\
{\
VOS_RECORD_ERROR(p);\
returnNULL;\
}\
}
文件中有个函数有以下代码段:
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第2页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
...//dosomething
pNode=(Node_Head_S*)malloc(sizeof(Node_Head_S));
NODE_RETURN_ERROR(pNode);//第一次使用宏
pBody=(Node_Body_S*)malloc(sizeof(Node_Body_S));
NODE_RETURN_ERROR(pBody);//第二次使用宏
...//dosomething
2)分析:
当经过指针pBody申请内存,而后经过宏NODE_RETURN_ERROR来判断能否申请成功,如
果申请失败,则在宏NODE_RETURN_ERROR里面就直接返回了,这样以致经过指针pNode申请
的内存泄漏了。
【纠正方法】
不使用宏,或将宏中的return语句写到宏调用后。

【问题描述】
异常出口没有开释应该开释的内备事例一。
【问题分析】
错误代码:
GetBuff函数的作用是申请动向内存
pMsgDB_DEV=(PDBDevMsg)GetBuff(sizeof(DBDevMsg),__LINE__);
if(NULL==pMsgDB_DEV)
{
return;
}
GetBuff函数的作用是申请动向内存
pMsgDBApp_To_Logic=(LPDBSelfMsg)GetBuff(sizeof(DBSelfMsg),__LINE__);
if(NULL==pMsgDBApp_To_Logic)
{
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第3页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
return;
}
2)分析:
在第2个return处,pMsgDB_DEV指向的内存扔掉。
【纠正方法】
在第2个return处增加开释内存的操作。
【经验教训】
函数中有动向申请内存,要在函数范围内检查全部return语句能否开释该return语句前全部动向申请的内存。

【问题描述】
申请过的内存的指针没有开释,又申请新的内存给它。
【问题分析】
错误代码:
/*申请新的内存大小*/
pTmp=VOS_Malloc(pMacroEdit->ulMacroLen+1);
if(NULL==pTmp)
{
returnFAILURE;
}
VOS_MemSet(pTmp,'\0',pMacroEdit->ulMacroLen+1);
......
/*又申请新的内存*/
pTmp=VOS_Malloc(sizeof(TTTT_RPC_MSG_S));
if(NULL==pTmp)
{
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第4页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
returnFAILURE;
}
.
VOS_Free(pTmp);
2)分析:
第一次申请的内存没有开释就使用同一个指针又申请了内存。这样第一次申请的内存就
永久没方法开释了,造成了内存泄漏。
【纠正方法】
第2次申请内存前,先开释掉第1次申请的内存。同时我们应该注意到这个事例中对于申
请的内存使用的指针变量是个暂时变量,其命名没有十分明确的承载其所指向内存的含义,这样命名是不规范的,也许恰巧就是因为这点,才引起了后边连续直接使用.

【问题描述】
异常出口没有开释应该开释的资源。
【问题分析】
错误代码:intr_lock( );
/*填补信息*/
ulResult=DEV_MA_FillMsg(pMsg,ucPrimID,usBIndex,ucSerailID);
if(ulResult!=MSP_RETURN_NO_ERR)
{
VOS_FreeMsg(PID_DEV,pMsg);
returnulResult;
}
intr_unlock( );
2)分析:
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第5页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
return前没有调用intr_unlock( )开释中断信号量。
【纠正方法】
return前开释中断信号量。

【问题描述】
分支考虑不全,以致某些分支中内存泄漏。
【问题分析】
错误代码:
/*创办信息,并放入信息队列中,假设办理成功*/
pMsg=CreateQueueMsg(j);
mu=SortOperation(pMsg);
if(mu<=0){
ret=0;
}
elseif(mu<=5){
ret=SendMsgToMu(pMsg,mu-1);
}
if(ret<=0){
/*从队列中删除信息,并开释*/
RemoveQueueMsg(j);
}
2)分析:
mu>5的分支,根本没有考虑,内存泄漏。
【纠正方法】
增加mu>5时对内存的开释办理。
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第6页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开

【问题描述】
多个判断放在一起进行以致内存泄漏。
【问题分析】
错误代码:
char*pszInfoBuf1=VOS_NULLPTR;
char*pszInfoBuf2=VOS_NULLPTR;
pszInfoBuf1=(char*)VOS_Malloc(MID_BVLAN,ulBuffLen);
pszInfoBuf2=(char*)VOS_Malloc(MID_BVLAN,ulBuffLen);
if((pszInfoBuf1==NULL)||(pszInfoBuf2==NULL))
{
returnVOS_ERR;
}
2)分析:
当pszInfoBuf1申请成功,但pszInfoBuf2申请失败时,if语句被执行,pszInfoBuf1指
向的内存泄漏了。【纠正方法】
将两处申请内存后的有效性判断分开进行。

【问题描述】
内存重复开释可能产生不行预知的结果。
【问题分析】
错误代码:
voidNbvmConfirmBrdVer(NBOM_TRANS*pstTrans)
{
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第7页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
if(NULL!=pstTrans->pbDynMem)
{
pstSelfBoardBootRomInfo=
(NBVM_SELF_BOARD_BOOTROM_INFO*)(void*)pstTrans->pbDynMem;
}
NBVM_MEM_FREE(pstSelfBoardBootRomInfo);
NBVM_MEM_FREE(pstBrdAllSwInfo);
NBVM_MEM_FREE(pstTrans->pbDynMem);
NBVM_MEM_FREE(pstTrans->pPrivatePtr);
}
2)分析:
上述红色代码造成了pstTrans->pbDynMem所指向的内存重复开释。
【纠正方法】
内存重复开释可能产生不行预知的结果:假如任务A申请了内存块M,使用后开释M;系
统可能把悠闲的M分配给了任务B,当任务A重复开释M后,把原来属于任务B的该内存块误释
放;此时系统认为悠闲的内存块M又可能分配给任务C,C随后对这个内存块的写操作对于任
务B来说就是非法操作,可能以致任务B运转异常。

【问题描述】
系统运转过程中,出现堆内存不足。
【问题分析】
错误代码
typedefstructtagWordStat{
char*pszWord;
ULONGulSum;
floatfrate;
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第8页,共62页
初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公开
structtagWordStat*psnext;
}WORDSTAT_S,*PWORDSTAT_S;
psWordName=(char*)malloc(ulCurWordLen+1);
if(NULL==psWordName)
{
returnVOS_ERR;
}
/*获取字符串*/
VOS_strncpy(psWordName,strName,ulCurWordLen);
...
/*建立新节点*/
pstWordStat=(PWORDSTAT_S)VOS_Malloc(sizeof(WORDSTAT_S));
if(NULL==pstWordStat)
{
VOS_Free(psWordName);
returnSTAT_ERR;
}
memset(pstWordStat,0,sizeof(WORDSTAT_S));
pstWordStat->pszWord=psWordName;
psWordName=NULL;
pstWordStat->ulSum=1;
pstWordStat->psnext=NULL;
ulTotalWordNum++;
...
/*开释节点*/
VOS_Free(pstWordStat);
...
2)分析
在开释节点时,只开释申请的部分内存。在这段代码中,字符串存放申请了一段内存,
建立链表的节点又申请了内存,最后只开释了链表节点内存,没有开释字符串存放时申请的内存。
【纠正方法】
先开释结构体内指针成员申请的内存,再开释结构体指针指向的内存。开释结构体节点
内存时,必定要搞清楚节点内部能否还有需要开释的内存,不然会以致这段内存永久得不到开释。
初级错误事例集
初级错误事例集
初级错误事例集
2020-5-26华为机密,未经允许不得扩散第9页,共62页
初级错误事例集
初级错误事例集
初级错误事例集

最近更新