低级错误案例集

上传人:壹****1 文档编号:560137920 上传时间:2022-12-31 格式:DOC 页数:72 大小:269KB
返回 下载 相关 举报
低级错误案例集_第1页
第1页 / 共72页
低级错误案例集_第2页
第2页 / 共72页
低级错误案例集_第3页
第3页 / 共72页
低级错误案例集_第4页
第4页 / 共72页
低级错误案例集_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《低级错误案例集》由会员分享,可在线阅读,更多相关《低级错误案例集(72页珍藏版)》请在金锄头文库上搜索。

1、TOP1 资源泄漏资源泄漏(包括内存泄漏)是代码Review中最常见的错误之一,申请的每个资源必须明确由谁负责释放,何时释放,在何处释放;在异常/错误/返回处理中,保持清醒的头脑,清理战场。此处的资源还包括信号量、定时器、文件句柄等系统资源。案例11【问题描述】宏里面有reurn语句导致内存泄漏案例一。【问题分析】1) 错误代码:/*定义宏MODEL_ASR_RETFI*#defne MDELASSERT_RETFAIL () if(不合法)retur;。/do somethingMSTraffiMsg* pM = VOS_Allosg( PID_MD,usLength );if (NLPT=

2、 =Msg) reun ;MataLitenerMgr DaaLseer =MDDataInialListenerM();MODEL_SETRTFIL(pDtaLtener);2)分析:使用宏MOEL_ASERT_RETFAI检查ataLtenr是否合法,如果不合法,则直接返回,一旦返回,将导致前面通过指针Msg申请到的消息包资源泄漏。【纠正方法】在宏ODEL_SSERTRTFAL分支判断retn前加上OS_FeMg(P_MD, pMg ):该方法代码不够清晰,当用户看宏定义时,对VOSFreeMsg(ID_MD, Msg )不清楚还要跳回来看前面的代码。设定该宏有返回值(指针不为空返回VO_

3、True,否则为OS_Fals),将宏的retu语句写在宏使用后(判断指针pDaLtener合法性),若宏返回VS_False释放pMsg并返回主调函数:该方法在遇到只判断一个指针的合法性时,浪费代码行、降低代码飞检效率且可能存在宏描述歧义等问题,简单的判断建议不使用宏。【经验教训】在XX版本的一个新模块的开发中,在T之前进行大话务量测试验证时,发现系统内存资源不足,当时TR5在即,这个问题影响到TR过点,经过协调多个技术专家封闭攻关,花了三天时间终于发现问题所在,人力成本高达00,对于内存使用,要确保释放闭环,所有异常退出点都需要释放内存。案例。【问题描述】宏里面有etrn语句导致内存泄漏案

4、例二。【问题分析】) 错误代码:头文件中的宏定义如下:/#dfNDEETURN_ERRR (p) if (ULL = p) OS_RCR_ERROR(p); return ULL; 文件中有个函数有如下代码段:.。/ somthigNode = (o_Head_S )malloc(izef(Noe_Hed_S);NODE_RETURN_RRO (pNode);/第一次使用宏pBdy = (Noe_Bod_S *)mlloc(sizof(Node_Bod_S));NOE_RTRNRROR (pBody); /第二次使用宏.。do smehing2)分析:当通过指针Body申请内存,然后通过宏NO

5、DE_RTUN_RO来判断是否申请成功,如果申请失败,则在宏NODETURERRO里面就直接返回了,这样导致通过指针pNode申请的内存泄漏了。【纠正方法】不使用宏,或将宏中的etrn语句写到宏调用后。案例1.3【问题描述】异常出口没有释放应该释放的内存案例一。【问题分析】1) 错误代码:/ GetBu函数的作用是什么动态内存pMsB_DEV =(DBevMg)GtBuff(szeof( BvMsg ), _LNE_); ( NUL= = pMsgDB_DV ) retrn;/ef函数的作用是什么动态内存pMgDAp_T_ogi = (PDBlfMsg)Getuf( sizf(DSeMg),_

6、LINE_ );if ( NUL= =pMsgDBAp_To_oi ) rr;)分析:在第个retun处,sgDB_D指向的内存丢失。【纠正方法】在第个tu处增加释放内存的操作.【经验教训】函数中有动态申请内存,要在函数范围内检查所有etur语句是否释放该return语句前所有动态申请的内存.案例.4【问题描述】异常出口没有释放应该释放的内存案例二.【问题分析】) 错误代码:/申请内存空间,存放解压缩后的逻辑文件 */ ucxanBf = (CAR)VOSemAllo( (ULG)PID_PHY,BOCK_MEP, FPGA_); i ( T_UL = cExpandBuf) etunFGR;

7、 /初始化为申请的BF大小 */ ulFDataLength =VOIPFPGA_; 从FLAS中把逻辑文件解压缩数据到主机内存,并记录解压缩后的总长度ulpatLength; i (解压失败) rturn FPGA_ERR; 2)分析:解压失败,异常退出时没有释放申请的内存。【纠正方法】异常分支增加释放内存的操作。案例1。5【问题描述】申请过的内存的指针没有释放,又申请新的内存给它。【问题分析】1) 错误代码:/* 申请新的内存大小 / pTmp =OS_Mlloc( pcEditulMacroL+ 1); if( NLL = pTmp) return FAURE; VO_Memet( pT

8、 , 0 , pMacroEdt-ulMacrn + 1); 。. /又申请新的内存 Tmp=OS_Mlloc(zeof(TRPC_SGS)); if( ULL = =pTmp ) reurnFAILU ; 。VOS_Fee(pTmp);)分析:第一次申请的内存没有释放就使用同一个指针又申请了内存。这样第一次申请的内存就永远没办法释放了,造成了内存泄漏。【纠正方法】第次申请内存前,先释放掉第1次申请的内存。案例1。6【问题描述】异常出口没有释放应该释放的资源。【问题分析】1)错误代码:int_lock(); 填充消息/ ulResult = DEV_FlMs(psg ,uPrimID, usB

9、ndx, cSerlID); if( lResult != PETRN_NO_ERR ) OS_Fresg( D_EV, pM ); reurn ulRlt; nt_ulo(); 2)分析:return前没有调用inr_unloc()释放中断信号量。【纠正方法】return前释放中断信号量。案例1。7【问题描述】分支考虑不全,导致某些分支中内存泄漏。【问题分析】1) 错误代码:/*创建消息,并放入消息队列中,假设处理成功 pg = CreaQuueMsg (j); m = rtOpeation(psg);i(mu privatePtr); NBVM_MM_FRE(pstrn-PiatePr);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号