1 / 52
文档名称:

低级错误案例集.doc

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

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

分享

预览

低级错误案例集.doc

上传人:泰山小桥流水 2022/9/13 文件大小:306 KB

下载得到文件列表

低级错误案例集.doc

相关文档

文档介绍

文档介绍:初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公然
TOP1资源泄露
资源泄露(包含内存泄露)是代码Review中最常有的错误之一,申请的每个资源一定明
确由谁负责开释,何时开释,在哪处开释;在异样/错误/返初级错误事例集
初级错误事例集
初级错误事例集
初级错误事例集内部公然
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__);