1 / 50
文档名称:

低级错误案例集.doc

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

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

分享

预览

低级错误案例集.doc

上传人:玉面小达摩 2021/12/8 文件大小:314 KB

下载得到文件列表

低级错误案例集.doc

文档介绍

文档介绍:低级错误案例集
低级错误案例集
低级错误案例集
低级错误 案例集 内部公开
TOP1 资源泄漏
资源泄漏 (包括内存泄漏) 是代码 Review 中最常见的错误之一, 申请的每个资源必须明
确由谁负责释放,何时释放,在何处释放;在异常 / 错误 / 返回处理中,保持清醒的头脑,清理战场。此处的资源还包括信号量、定时器、文件句柄等系统资源。
案例
【问题描述】
宏里面有 return 语句导致内存泄漏案例一。
【问题分析】
错误代码:
/* 定义宏 MODEL_ASSERT_RETFAIL*/
#define MODEL_ASSERT_RETFAIL (X) \
{ \
if(X 不合法)\
return; \
}
.//do something
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 语句导致内存泄漏案例二。
【问题分析】
错误代码:
头文件中的宏定义如下:
#define NODE_RETURN_ERROR(p)\
{\
if (NULL == p) \
{\
VOS_RECORD_ERROR(p);\
return NULL;\
}\
}
文件中有个函数有如下代码段:
低级错误案例集
低级错误案例集
低级错误案例集
2020-5-26 华为机密,未经许可不得扩散 第2 页, 共62 页
低级错误案例集
低级错误案例集
低级错误案例集
低级错误 案例集 内部公开
...//do something
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); //第二次使用宏
...//do something
2)分析:
当通过指针 pBody申请内存,然后通过宏 NODE_RETURN_ERROR来判断是否申请成