1 / 52
文档名称:

低级错误案例集.docx

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

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

分享

预览

低级错误案例集.docx

上传人:爱的奉献 2022/6/22 文件大小:95 KB

下载得到文件列表

低级错误案例集.docx

相关文档

文档介绍

文档介绍:低级错误 案例集 内部公开
TOP1 资源泄漏
源泄漏 (包括内存泄漏) 是代 Review 中最常 的 之一, 申 的每个 源必 明
确由 放,何 放,在何 放;在异常 /写到宏调用后。
案例
【问题描述】
异常出口没有释放应该释放的内存案例一。
【问题分析】
错误代码:
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 )
{
return FAILURE ;
}
VOS_MemSet( pTmp , '\0' , pMacroEdit->ulMacroLen + 1 );
......
/* 又申请新的内存 */
pTmp = VOS_Malloc(sizeof(TTTT_RPC_MSG_S));
if( NULL = = pTmp )
{
2020-5-26 华为机密,未经许可不得扩散 第4 页, 共62 页
低级错误 案例集 内部公开
return FAILURE ;
}
.
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 );
return ulResult;
}
intr_unlock();
⋯⋯
2)分析:
2020-5-26 华为机密,未经许可不得扩散 第5 页, 共62 页
低级错误 案例集 内部公开
return 前没有调用 intr_unlock() 释放中断信号量。
【纠正方法】
return 前释放中断信号量。
案例
【问题描述】
分支考虑不全,导致