1 / 43
文档名称:

软件编程低级错误:内存泄漏.ppt

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

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

分享

预览

软件编程低级错误:内存泄漏.ppt

上传人:分享精品 2018/1/6 文件大小:449 KB

下载得到文件列表

软件编程低级错误:内存泄漏.ppt

文档介绍

文档介绍:C语言软件编程规范工作组
公司常见软件编程低级错误:内存泄漏
前言
这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。
C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。
业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA(汽车工业软件可靠性联合会)制定的1998版的MISRAC规范指出,一些在C看来可以接受,却存在隐患的地方有127处之多。2004版的MISRAC规范将针对C语言的规则增加到了141条。
对于程序员来说,能工作的代码并不等于“好”代码。“好”代码的指标很多,包括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良编程****惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。
本胶片收集了常见的内存泄漏案例,给出了相应的纠正措施。对应的编程规范:防止内存泄漏;函数中分配的内存,在函数退出之前要释放
内存泄漏案例问题和纠正措施建议
异常出口处没有释放内存
【问题描述】代码飞检发现如下代码:
pMsgDB_DEV = (PDBDevMsg)GetBuff( sizeof( DBDevMsg ), __LINE__);
if( pMsgDB_DEV == NULL ) {
return;
} 
pMsgDBApp_To_Logic = (LPDBSelfMsg)GetBuff( sizeof(DBSelfMsg), __LINE__ );
if( pMsgDBApp_To_Logic == NULL ) {
return;
}
【问题定位】在第2个return处,pMsgDB_DEV指向的内存丢失
异常出口处没有释放内存(续1)
【问题描述】代码飞检发现如下代码:
/* 在AVL树中添加节点*/
IF_VC_AVL_AddNode( &stAVLNodeKey, pstBasPortIndex, pareNode)
ulRet = IF_BAS_VC_CreateVC((*pstBasPortIndex),ulIfIndex);
if (ulRet != VOS_OK ) /* 创建VC控制块失败*/
{ 
    return;
} 
【问题定位】创建VC控制块失败时,return前没有删除AVL树中的节点
【举一反三】看见return要注意,要去前面找资源,特别要注意链表等数据结构中的资源
异常出口处没有释放信号量资源
【问题描述&定位】代码飞检发现如下代码:
rc = np_ss_semB_create(NP_SEM_EMPTY, NP_SEM_Q_FIFO, ());
if(rc != ESS)/*申请信号量失败*/
{
NP_SS_ASSERT(0, "Create qinq sem failed!");
return rc;
}
#if SOFT_Version
rc = np_ss_semB_create(NP_SEM_EMPTY, NP_SEM_Q_FIFO, &());
if(rc != ESS)/*申请信号量失败*/
{
NP_SS_ASSERT(0, "Create qinq sem failed!");
return rc; //
}
#endif
………………………….
NP_FREE_SEM();
#if SOFT_Version
NP_FREE_SEM();
#endif
return rc;
异常出口处没有释放信号量资源(续)
【纠正措施】第二个信号量申请失败return之前释放第一个申请的信号量
。。。。。。。。。。。。
#if SOFT_Version
rc = np_ss_semB_create(NP_SEM_EMPTY, NP_SEM_Q_FIFO, &());
if(rc != ESS)/*申请信号量失败*/
{
NP_SS_ASSERT(0, "Create qinq sem failed!");
NP_FREE_SEM(g_ims_vport_ba