当前位置: 首页 > 实用文档 > 励志 > 低级错误的经典语录

低级错误的经典语录

2016-06-02 09:21:04 成考报名 来源:http://www.chinazhaokao.com 浏览:

导读: 低级错误的经典语录(共5篇)Java十大低级错误Java十大低级错误为了规范大家的编程行为,借鉴前人的编程经验,避免低级错误的不断发生,特发布MDSP产品Java十大低级错误,供所有Java开发人员学习:1、方法和变量命名随意而不规范,没有类注释、方法注释或注释不规范,代码修改后,不同步修改注释,导致注释与代码不符。2、数据类...

欢迎来到中国招生考试网http://www.chinazhaokao.com/成考报名栏目,本文为大家带来《低级错误的经典语录》,希望能帮助到你。

Java十大低级错误
低级错误的经典语录(一)

Java十大低级错误

为了规范大家的编程行为,借鉴前人的编程经验,避免低级错误的不断发生,特发布MDSP产品Java十大低级错误,供所有Java开发人员学习:

1、方法和变量命名随意而不规范,没有类注释、方法注释或注释不规范,代码修改后,不同步修改注释,导致注释与代码不符。

2、数据类不重载toString()方法(说明:编程规范要求“所有的数据类必须重载toString() 方法,返回该类有意义的内容”)。

3、对方法的调用不进行空指针判断而造成空指针异常。

4、数据库操作、IO操作的资源没有及时释放,数据库结果集和连接释放顺序不正确,或者使用没有必要的预处理。

5、循环体内包含了大量没有必要在循环中处理的语句,循环体内循环获取数据库连接,循环体内进行不必要的try-catch操作。(说明:编程规范中建议“不要在循环体内调用同步方法和使用 try-catch 块”)

6、嵌套使用try-catch,或者try-catch后面没有必要的finally操作(说明:数据库操作、IO操作等需要使用结束close()的对象必须在try -catch-finally 的finally中close())。

7、不对数组下标作范围校验。

8、equals操作时没有将常量放在equals操作符的左边(说明:字符串变量与常量比较时,先写常量,这样可以避免空指针异常)。

9、字符串转化为数字时没有做异常处理。

10、没有在异常分支记录日志导致问题定位困难。

代码案例(说明:所有样例都是错误的代码):

1. 方法和变量命名随意而不规范,没有类注释、方法注释或注释不

规范,代码修改后,不同步修改注释,导致注释与代码不符。

public class MethodName

{

//错误:没有类的注释

//错误:方法的注释不规范、方法名不规范

public void a( int i )

{

//错误:变量名称太短

String b = "";

//错误:变量名称太长,超过40个字符

String longVariableLongVariableLongVariableLongVariable = ""; }

/**

* <一句话功能简述>方法命名约定:应以小写字母开头、同时命名不应含有下划线字符。 * <功能详细描述>

* @param i

* @see [类、类#方法、类#成员]

*/

public void Check_Method( int i )

{

// 错误:方法名称不规范

//错误:变量名称不规范

String b = "";

}

/**

* <一句话功能简述>变量、方法名、类名、接口名避免出现美元字符$。

* <功能详细描述>

* @param i

* @see [类、类#方法、类#成员]

*/

public void Fo$o ()

{

// 错误:方法名称不规范

}

/**

* <一句话功能简述>注意hashCode方法大小写。此规则用于推测作者可能是要实现hashCode方法,但大小写错了。

* <功能详细描述>

* @return

* @see [类、类#方法、类#成员]

*/

public int hashcode()

{

// 错误:方法名称不规范

int temp = 0;

// oops, this probably was supposed to be hashCode

return temp;

}

/**

*

* @param o 只有参数类型和返回值类型不一致,方法名equals完全相同(包括大小写也相同),推测可能是想实现equals方法。

* @return

*/

public int equals(Object o)

{

// 错误:方法名称不规范

// oops, this probably was supposed to be boolean equals

int temp = 0;

return temp;

}

/**

* <一句话功能简述>只有参数类型和返回值类型不一致,方法名equals完全相同(包括大小写也相同),推测可能是想实现equals方法。

* <功能详细描述>

* @param s

* @return

* @see [类、类#方法、类#成员]

*/

public boolean equals(String s)

{

// 错误:方法名称不规范

// oops, this probably was supposed to be equals(Object)

return true;

}

/**

* <一句话功能简述>'getX()'方法同时返回值又是 'boolean' ,则建议用'isX()'命名。checkParameterizedMethods属性用于决定是否对带参数的方法检测。 * <功能详细描述>

* @return

* @see [类、类#方法、类#成员]

*/

public boolean getFoo()

{

// 错误:方法名称不规范

// bad

return true;

}

}

2. 数据类不重载toString()方法(说明:编程规范要求“所有的

数据类必须重载toString() 方法,返回该类有意义的内容”)。 public class Content extends BaseMetaData

{

private String oldCID;

private String cId;

private String spId;

private int type;

private int serviceType;

.........................

/**

* 设置修改标识

* @param update_flag 修改标识

*/

public void setUpdate_flag(String update_flag)

{

this.updateFlg = update_flag;

}

public void setVersion(String version)

{

this.version = version;

}

public String toString()

{

//没有重载toString方法或者重载无意义的toString方法

return null;

}

}

3. 对方法的调用不进行空指针判断而造成空指针异常。 /**

* <一句话功能简述>演示不进行空指针判断造成空指针异常 * <功能详细描述>

*

* @see [相关类/方法]

* @since [产品/模块版本]

*/

public class NullPoint

{

/**

* <一句话功能简述>

* <功能详细描述>

* @return

* @see [类、类#方法、类#成员]

*/

public String returnNull ()

{

String temp = null;

return temp;

}

public void checkNull()

低级错误案例集
低级错误的经典语录(二)

低级错误案例集 内部公开 TOP1 资源泄漏 资源泄漏(包括内存泄漏)是代码Review中最常见的错误之一,申请的每个资源必须明 确由谁负责释放,何时释放,在何处释放;在异常/错误/返回处理中,保持清醒的头脑,清 理战场。此处的资源还包括信号量、定时器、文件句柄等系统资源。 案例 1.1 【问题描述】 宏里面有return语句导致内存泄漏案例一。 【问题分析】 1) 错误代码: /*定义宏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申请到的消息包资源泄漏。 2012-12-10 华为机密,未经许可不得扩散 第 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元,对于内存使用,要确保释放闭环,所有异常退出点都需要释放内 存。 案例 1.2 【问题描述】 宏里面有return语句导致内存泄漏案例二。 【问题分析】 1) 错误代码: 头文件中的宏定义如下: #define NODE_RETURN_ERROR (p) \ {\ if (NULL == p) \ {\ VOS_RECORD_ERROR(p);\ return NULL;\ }\ } 文件中有个函数有如下代码段: 2012-12-10 华为机密,未经许可不得扩散 第 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来判断是否申请成功,如 果申请失败,则在宏NODE_RETURN_ERROR里面就直接返回了,这样导致通过指针pNode申请 的

内存泄漏了。 【纠正方法】 不使用宏,或将宏中的return语句写到宏调用后。 案例 1.3 【问题描述】 异常出口没有释放应该释放的内存案例一。 【问题分析】 1) 错误代码: // 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 ) { 2012-12-10 华为机密,未经许可不得扩散 第 3 页, 共 62 页 低级错误案例集 内部公开 return; } 2)分析: 在第2个return处,pMsgDB_DEV指向的内存丢失。 【纠正方法】 在第2个return处增加释放内存的操作。 【经验教训】 函数中有动态申请内存, 要在函数范围内检查所有return语句是否释放该return语句前 所有动态申请的内存。 案例 1.4 【问题描述】 申请过的内存的指针没有释放,又申请新的内存给它。 【问题分析】 1) 错误代码: /* 申请新的内存大小 */ 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 ) { 2012-12-10 华为机密,未经许可不得扩散 第 4 页, 共 62 页 低级错误案例集 内部公开 return FAILURE ; } „„. VOS_Free(pTmp); 2)分析: 第一次申请的内存没有释放就使用同一个指针又申请了内存。 这样第一次申请的内存就 永远没办法释放了,造成了内存泄漏。 【纠正方法】 第2次申请内存前, 先释放掉第1次申请的内存。 同时我们应该注意到这个案例中对于申 请的内存使用的指针变量是个临时变量,其命名没有十分明确的承载其所指向内存的含义, 这样命名是不规范的,也许恰恰就是因为这点,才引发了后面继续直接使用. 案例 1.5 【问题描述】 异常出口没有释放应该释放的资源。 【问题分析】 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)分析: 2012-12-10 华为机密,未经许可不得扩散 第 5 页, 共 62 页 低级错误案例集 内部公开 return前没有调用intr_unlock()释放中断信号量。 【纠正方法】 return前释放中断信号量。 案例 1.6 【问题描述】 分支考虑不全,导致某些分支中内存泄漏。 【问题分析】 1) 错误代码: /*创建消息,并放入消息队列中,假设处理成功*/ pMsg = CreateQueueMsg (j); mu = SortOperation(pMsg); if (mu <= 0) { ret = 0; } else if (mu <= 5){ ret = SendMsgToMu(pMsg, mu-1); } if (ret <= 0) { /*从队列中删除消息,并

释放*/ RemoveQueueMsg(j); } 2)分析: mu>5的分支,根本没有考虑,内存泄漏。 【纠正方法】 增加mu>5时对内存的释放处理。 2012-12-10 华为机密,未经许可不得扩散【低级错误的经典语录】第 6 页, 共 62 页 低级错误案例集 内部公开 案例 1.7 【问题描述】 多个判断放在一起进行导致内存泄漏。 【问题分析】 1) 错误代码: char* pszInfoBuf1 = VOS_NULLPTR; char* pszInfoBuf2 = VOS_NULLPTR; pszInfoBuf1 = (char*)VOS_Malloc(MID_BVLAN, ulBuffLen); pszInfoBuf2 = (char*)VOS_Malloc(MID_BVLAN, ulBuffLen); if ( (pszInfoBuf1 = = NULL) || (pszInfoBuf2 = = NULL ) ) { return VOS_ERR; } 2)分析: 当pszInfoBuf1申请成功,但pszInfoBuf2申请失败时,if语句被执行,pszInfoBuf1指 向的内存泄漏了。 【纠正方法】 将两处申请内存后的有效性判断分开进行。 案例 1.8 【问题描述】 内存重复释放可能产生不可预知的后果。 【问题分析】 1) 错误代码: void NbvmConfirmBrdVer(NBOM_TRANS *pstTrans) { „„„„ 2012-12-10 华为机密,未经许可不得扩散 第 7 页, 共 62 页 低级错误案例集 内部公开 if (NULL != pstTrans->pbDynMem) { pstSelfBoardBootRomInfo = (NBVM_SELF_BOARD_BOOTROM_INFO*)(void*)pstTrans->pbDynMem; } NBVM_MEM_FREE(pstSelfBoardBootRomInfo); NBVM_MEM_FREE(pstBrdAllSwInfo); NBVM_MEM_FREE(pstTrans->pbDynMem); NBVM_MEM_FREE(pstTrans->pPrivatePtr); } 2)分析: 上述红色代码造成了pstTrans->pbDynMem所指向的内存重复释放。 【纠正方法】 内存重复释放可能产生不可预知的后果:假如任务A申请了内存块M,使用后释放M;系 统可能把空闲的M分配给了任务B,当任务A重复释放M后,把本来属于任务B的该内存块误释 放;此时系统认为空闲的内存块M又可能分配给任务C,C随后对这个内存块的写操作对于任 务B来说就是非法操作,可能导致任务B运行异常。 案例 1.9 【问题描述】 系统运行过程中,出现堆内存不足。 【问题分析】 1) 错误代码 typedef struct tagWordStat{ char * pszWord; ULONG float 2012-12-10 ulSum; frate; 华为机密,未经许可不得扩散 第 8 页, 共 62 页 低级错误案例集 内部公开 struct tagWordStat * psnext; }WORDSTAT_S, *PWORDSTAT_S; … psWordName = (char *)malloc(ulCurWordLen + 1); if(NULL == psWordName) { return VOS_ERR; } /*获取字符串*/ VOS_strncpy(psWordName, strName, ulCurWordLen); ... /*建立新节点*/ pstWordStat = (PWORDSTAT_S)VOS_Malloc(sizeof(WORDSTAT_S)); if ( NULL == pstWordStat ) { VOS_Free(psWordName); return STAT_ERR; } memset(pstWordStat, 0, sizeof(WORDSTAT_S)); pstWordStat->pszWord = psWordName; psWordName = NULL; pstWordStat->ulSum = 1; pstWordStat->psnext = NULL; ulTotalWordNum ++; ... /*释放节点*/ VOS_Free(pstWordStat); ... 2)分析 在释放节点时,只释放申请的部分内存。在这段代码中,字符串存放申请了一段内存, 建立链表的节点又申请了内存,【低级错误的经典语录】

最后只释放了链表节点内存, 没有释放字符串存放时申请的 内存。 【纠正方法】 先释放结构体内指针成员申请的内存, 再释放结构体指针指向的内存。 释放结构体节点 内存时, 一定要搞清楚节点内部是否还有需要释放的内存, 否则会导致这段内存永远得不到 释放。 2012-12-10 华为机密,未经许可不得扩散 第 9 页, 共 62 页 低级错误案例集 内部公开 TOP2 内存越界 所谓内存越界就是申请了内存,使用时超出了申请的范围。发生内存越界的情况,往往 出错的地方不是真正内存越界的地方,带来的影响滞后,而且难以定位,需要程序员养成良 好编程习惯, 对指针, 内存拷贝, 字符串操作等注意前后空间的变化, 可以做一些必要保护。 案例 2.1 【问题描述】 数组下标访问越界。 【问题分析】 1) 错误代码: /* 初始化Q922的I帧链路索引地址表 */ ulSize = sizeof(INDEX_Q922IFRAME_MAPPING_STRU **) * DCOM_MAXSERVICEQ922LINK; // g_ppstQ922IFrameIndex[]申请的长度是DCOM_MAXSERVICEQ922LINK g_ppstQ922IFrameIndex = (INDEX_Q922IFRAME_MAPPING_STRU **)VOS_MemAlloc(VOS_PID_COMM, STATIC_DOPRA_MEM_PT, ulSize); ... VOS_UINT32 Q922_AddLink(......) { ... if (usLinkNo > DCOM_MAXSERVICEQ922LINK) { ulRet = VOS_ERRNO_Q922CFG_ADDLINK_LINKNO_INVALID; return ulRet; } /* 初始化Q922的I帧映射表的信息 */ ulSize = sizeof(INDEX_Q922IFRAME_MAPPING_STRU); g_ppstQ922IFrameIndex[usLinkNo] = (INDEX_Q922IFRAME_MAPPING_STRU *)VOS_MemAlloc(VOS_PID_COMM, DYNAMIC_DOPRA_MEM_PT,ulSize); if (VOS_NULL_PTR == g_ppstQ922IFrameIndex[usLinkNo]) 2012-12-10 华为机密,未经许可不得扩散 第 10 页, 共 62 页 低级错误案例集 内部公开 { ..... ulRet = VOS_ERRNO_Q922CFG_INIT_ALLOC_IFRAMEMAP_FAILED; return ulRet; } ... } 2)分析: 造成内存写越界,单板复位。 【纠正方法】 内存申请最大长度是DCOM_MAXSERVICEQ922LINK,最多访问到 g_ppstQ922IFrameIndex[DCOM_MAXSERVICEQ922LINK-1],判断应改成if (usLinkNo >= DCOM_MAXSERVICEQ922LINK) 案例 2.2 【问题描述】 版本倒换,主控板一起来就出现指令异常,单板复位 【问题分析】 1) 错误代码: CHAR sLogInfo[1024]; UCHAR szTmp[10]; /*只分配了10个字节*/ char* pTemp = sLogInfo; „„. while(*pTemp != '-') { szTmp[i] = *pTemp; /*没有找到-,继续进行,导致堆栈被写坏*/ pTemp++; i++; } szTmp[i] = 0; 2012-12-10 华为机密,未经许可不得扩散 第 11 页, 共 62 页 低级错误案例集 内部公开 2)分析: 当数组下标i大于等于9时,不能再继续循环,否则越界访问。 【纠正方法】 增加判断: i等于8时, 跳出循环, 对于while或者for循环里操作数组下标要做下标的保 护,“小心驶得万年船” 案例 2.3 【问题描述】 入参检测失败后不退出函数,仍继续执行后面逻辑处理,导致后面使用数组下标越界【低级错误的经典语录】

, 在异常引用情况下导致死机。 【问题分析】 1) 错误代码: void FAR Check_ImsDataTab_by_timer (CR ims_data_tab_cr) { „„ if ((ims_data_tab_cr) >= MAX_IMS_DATA_CR) { CCB_stop_timer_by_ftr(ims_data_tab_cr, EN_CCB_FTR_ID_RF, EN_RF_CHECK_SINGLE_IMSDATA_TIMER); } if ((MAX_SIPSL_CR == g_ims_data_table[ims_data_tab_cr].sip_cr) ——B && (MAX_CCB(LOCAL_MODULE) == g_ims_data_table[ims_data_tab_cr].ccb_cr)) { „„ return; } „„ 2012-12-10 华为机密,未经许可不得扩散 第 12 页, 共 62 页 ——A —>后面需要return,退出函数 低级错误案例集 内部公开 } 2)分析: 当A处的ims_data_tab_cr 入参检查失败后不退出而继续进行下面的逻辑处理,导致B 处引用ims_data_tab_cr作为数组下标越界 【纠正方法】 在入参检测中失败应做退出函数处理,A处逻辑判断中增加return 案例 2.4 【问题描述】 系统运行过程中突然复位。 【问题分析】 1) 错误代码: while ( _isspace( *szString ) ) { /* 跳过所有空格字符 */ szString ++; //szString为函数的输入参数 } if ('\0' == *szString ) { return FAILURE ; } /*'='的左边变量赋值*/ szStr = VOS_Malloc( 20 ) ;//申请内存大小为给20 if( NULL == szStr ) { return MACRO_MEM_SHORTAGE ; } VOS_MemSet(szStr, '\0', 20) ; VOS_StrCpy( szStr, szString ) ; 2)分析: 这种内存写越界问题的表面现象是不确定的。 该问题的原因就是没有检查szString字符 串的长度,最后一代码中,字符串拷贝时发生写越界。 2012-12-10 华为机密,未经许可不得扩散 第 13 页, 共 62 页 低级错误案例集 内部公开 【纠正方法】 规避这种问题的办法是拷贝字符串是采用DOPRA平台提供的安全拷贝函数 CHAR * VOS_strncpy( CHAR *dst, const CHAR *src, ULONG n )。 案例 2.5 【问题描述】 Sprintf使用不当导致内存访问越界 【问题分析】 1) 错误代码: char pszInfoBuf[250]; sprintf(pszInfoBuf,”*** File:%s Line:%d ****”,__FILE__,__LINE__); 2)分析: “__FILE__”在预编译时, 被编译时的目录名和源文件名代替, 但目录和文件名的长度 可变,很可能超出250个字节,导致内存越界 【纠正方法】 将sprintf替换成安全函数snprintf,指定缓冲区大小INFOBUF_SIZE,确保内存不会越 界 snprintf(pszInfoBuf,INFOBUF_SIZE -1,”*** File:%s Line:%d ****”,__FILE__,__LINE__); pszInfoBuf[INFOBUF_SIZE -1]=‘\0’; 【经验教训】 C语言提供的字符串库函数sprintf /vsprintf/strcpy/strcat/gets等非常危险,很容 易导致内存越界, 应该使用安全的字符串库函数snprintf/strncpy/strncat/fgets, 指定操 作的内存大小。 对C++语言,应该使用相应的类库如std::string,std::stringstream, boost::lexical_cast操作字符串,而不要直接调用C语言的字符串函数。 2012-12-10 华为机密,未经许可不得扩散 第 14 页, 共 62 页 低级错误案例集 内

低级错误案例集
低级错误的经典语录(三)

TOP1 资源泄漏

资源泄漏(包括内存泄漏)是代码Review中最常见的错误之一,申请的每个资源必须明

确由谁负责释放,何时释放,在何处释放;在异常/错误/返回处理中,保持清醒的头脑,清

理战场。此处的资源还包括信号量、定时器、文件句柄等系统资源。

案例1.1

【问题描述】

宏里面有return语句导致内存泄漏案例一。

【问题分析】

1) 错误代码:

/*定义宏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申请到的消息包资源泄漏。

【纠正方法】

在宏MODEL_ASSERT_RETFAIL分支判断return前加上VOS_FreeMsg(PID_MD, pMsg ):该方

法代码不够清晰,当用户看宏定义时,对VOS_FreeMsg(PID_MD, pMsg )不清楚还要跳回来看前

面的代码。

设定该宏有返回值(指针不为空返回VOS_True,否则为VOS_False),将宏的return语句写

在宏使用后(判断指针pDataListener合法性),若宏返回VOS_False释放pMsg并返回主调函

数:该方法在遇到只判断一个指针的合法性时,浪费代码行、降低代码飞检效率且可能存在

宏描述歧义等问题,简单的判断建议不使用宏。

【经验教训】

在XX版本的一个新模块的开发中,在TR5之前进行大话务量测试验证时,发现系统内存

资源不足,当时TR5在即,这个问题影响到TR5过点,经过协调多个技术专家封闭攻关,花了

三天时间终于发现问题所在,人力成本高达3000,对于内存使用,要确保释放闭环,所有异

常退出点都需要释放内存。

案例1.2

【问题描述】

宏里面有return语句导致内存泄漏案例二。

【问题分析】

1) 错误代码:

头文件中的宏定义如下:

/#define NODE_RETURN_ERROR (p) { if (NULL == p) \

VOS_RECORD_ERROR(p);\

return NULL;\

}

文件中有个函数有如下代码段:

...//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来判断是否申请成功,如

果申请失败,则在宏NODE_RETURN_ERROR里面就直接返回了,这样导致通过指针pNode申请

的内存泄漏了。

【纠正方法】

案例1.3

【问题描述】

异常出口没有释放应该释放的内存案例一。 不使用宏,或将宏中的return语句写到宏调用后。

【问题分析】

1) 错误代码:

// 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 )

{

return;

}

2)分析:

在第2个return处,pMsgDB_DEV指向的内存丢失。

【纠正方法】

在第2个return处增加释放内存的操作。

【经验教训】

函数中有动态申请内存,要在函数范围内检查所有return语句是否释放该return语句前

所有动态申请的内存。

案例1.4

【问题描述】

异常出口没有释放应该释放的内存案例二。

【问题分析】

1) 错误代码:

/*申请内存空间,存放解压缩后的逻辑文件 */

pucExpandBuf = (UCHAR*)VOS_MemAlloc( (ULONG)PID_PHY, BLOCK_MEM_PT, VOIPFPGA_FILE_LENGTH);

if ( PTR_NULL == pucExpandBuf )

{

return FPGA_ERR;

}

/* 初始化为申请的BUFF大小 */

ulFpgaDataLength = VOIPFPGA_FILE_LENGTH;

从FLASH中把逻辑文件解压缩数据到主机内存,并记录解压缩后的总长度

ulFpgaDataLength;

if (解压失败)

{

return FPGA_ERR;

}

2)分析:

解压失败,异常退出时没有释放申请的内存。

【纠正方法】

案例1.5

【问题描述】

申请过的内存的指针没有释放,又申请新的内存给它。 异常分支增加释放内存的操作。

【问题分析】

1) 错误代码:

/* 申请新的内存大小 */

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 )

{

return FAILURE ;

}

„„.

VOS_Free(pTmp);

2)分析:

第一次申请的内存没有释放就使用同一个指针又申请了内存。这样第一次申请的内存就

关于改正错误的经典名人语录
低级错误的经典语录(四)

1、每个人都有错,但只有愚者才会执迷不悟。--西塞罗

2、犯错误乃是取得进步所必须交付的学费。--卢那察尔斯基

3、错误是不可避免的,但是不要重复错误。--周恩来

4、正确的结果,是从大量错误中得出来的;没有大量错误作台阶,也就登不上最后正确结果的高座。关于改正错误的经典名人语录。--钱学森

5、永远不要因承认错误而感到羞耻,因为承认错误也可以解释作你今天更聪敏。--马罗

6、一次小小的失误也许会防止重重的跌落。--托・富勒

7、所有的科学都是错误先真理而生,错误在先比错误在后好。--沃尔波斯

8、人要学会走路,也得学会摔跤,而且只有经过摔跤才能不会走路。--德国

9、人人须日日改过,一旦无过可改,即一日无步可过矣。--陶觉

10、人不犯错误,啥也不会做。--英国

11、窃譬之琴瑟不调,甚者必解而更张之,乃可鼓也。关于改正错误的经典名人语录。--董仲舒

12、过则勿惮改。--孔子

13、犯错误是无可非议的,只要能及时觉察并纠正就好。谨小慎微的科学家既犯不了错误,14、当一个孩子意识到他不仅有坚持真理的权利,而且有犯错误的时候,他就已长成了大人。--托马斯・萨斯

15、错误同真理的关系,就象睡梦同清醒的关系一样。一个人从错误中醒来,就会以新的力量走向真理。--歌德

16、从错误中学到的东西,比从美德中学到的东西往往还要多。--美国

17、朝有过,夕改,则与之;夕有过,朝改,则与之。--曾参

18、不贵于无过,而贵于能改过。--王守仁

19、最好的好人,都是犯过错误的过来人;一个人往往因为有一点小小的缺点,将来会变得更好。--莎士比亚

20、允许改革犯错误,但不允许不改革。--胡耀邦

21、有过必悛,有不善必惧。--<国语>

22、一个人知道了自己的短处,能够改过自新,就是有福的。--莎士比亚

23、一个人在科学探索的道路上,走过弯路,犯过错误,并不是坏事,更不是什么耻辱,要在实践中勇于承认和改正错误。--爱因斯坦

24、夜觉晓非,今悔昨失。--颜之推<颜氏家训>

25、心中醒,口中说,纸上作,不从身上习过,皆无用也。--颜元

26、善之端而止之也。--王安石<礼乐论>

27、任何人都要犯错误,人从降生的那一天起,便不断的犯错误,只有在不断的错误,不断的碰钉子的过程中,才能逐渐懂得事情。--刘少奇

面对错误的名人经典语录
低级错误的经典语录(五)

1、一个人知道了自己的短处,能够改过自新,就是有福的。--莎士比亚<无事生非>

2、终身不病的人不能成个名医。--阿拉伯

3、错误经不起失败,但是真理却不怕失败。--泰戈尔

4、每个人都有错,但只有愚者才会执迷不悟。面对错误的名人经典语录。--意大利

5、失败之前无所谓高手,在失败的面前,谁都是凡人。--普希金

6、为伟大的事业捐躯,从来就不能算做失败。--乔。拜伦

7、我们从失败中学到的东西要比在成功中学到的东西多得多。--斯迈尔斯

8、心中醒,口中说,纸上作,不从身上习过,皆无用也。--颜元

9、许多赛跑的人失败,都是失败在最后几步。--苏格拉底

10、夜觉晓非,今悔昨失。面对错误的名人经典语录。--颜之推<颜氏家训>

11、一次失败,只能证明我们成功的决心还不够。--博维

12、一次小小的失误也许会防止重重的跌落。--托・富勒

13、一个人的失败,14、一个人在科学探索的道路上,走过弯路,犯过错误,并不是坏事,更不是什么耻辱,要在实践中勇于承认和改正错误。--爱因斯坦

15、因为害怕失败而不敢放手一搏,永远不会成功。

16、永不做错事的人,往往不能做出任何事情来。--法国

17、永远不要因承认错误而感到羞耻,因为承认错误也可以解释作你今天更聪敏。--马罗

18、这世界除了心理上的失败,实际上并不存在什么失败,只要不是一败涂地,你一定会取得胜利的。--亨・奥斯汀

19、只有永远躺在泥坑里的人,才不会再掉进坑里。--黑格尔

20、从错误中学到的东西,比从美德中学到的东西往往还要多。--美国

21、不论成功或失败,都系于自己。--朗费罗

22、不会从失败中找寻教训的人,他们的成功之路是遥远的。--拿破仑

23、错误并非总是意味着无知,知识并非总是召之即来。--塞・约翰逊

24、错误常常是正确的先导。--毛泽东

25、当失败不可避免时,失败也是伟大的。--惠特曼

26、对不屈不饶的人来说没有失败这回事。--俾斯麦

27、多数人的失败,都始于怀疑他们自己在想做的事情上的能力。--司各特

28、凡百事之成也在敬之,其败也必在慢之。--司马光

29、没有错误的推论我们就无法推论。--利希滕伯格

30、没有多次失败,难得一次成功。--谚语

31、人的聪明和自己的明智及道路的选择,往往在失败以后。--贾曦光

32、人人须日日改过,一旦无过可改,即一日无步可过矣。--陶觉

33、人要学会走路,也得学会摔跤,而且只有经过摔跤才能不会走路。--德国

34、失败的教训,成功获经验。--谚语

35、失败是坚忍的最后考验。--俾斯麦

36、十九次失败,到第二十次获得成功,这叫坚持。--佚名

37、什么叫做失败,失败是到达较佳境地的第一步。--菲里普斯

38、所有的科学都是错误先真理而生,错误在先比错误在后好。--沃尔波斯

39、我的那些最重要的发现是受到失败的启发而获得的。--戴维

以上就是中国招生考试网http://www.chinazhaokao.com/带给大家不一样的精彩成考报名。想要了解更多《低级错误的经典语录》的朋友可以持续关注中国招生考试网,我们将会为你奉上最全最新鲜的成考报名内容哦! 中国招生考试网,因你而精彩。

相关热词搜索:张爱玲经典语录 徐志摩经典语录
  • 1、巩汉林经典语录(2016-05-03)
  • 2、介绍运动品牌衣服经典语录(2016-05-06)
  • 3、早安微语录经典(2016-05-23)
  • 4、艺术美经典语录(2016-05-25)
  • 5、汤唯经典语录(2016-06-02)
  • 6、经典深沉语录(2016-06-04)
  • 7、毛泽东主席经典语录(2016-06-06)
  • 8、如果没有如果类经典语录(2016-06-06)
  • 9、连岳经典语录(2016-06-12)
  • 10、金典语录经典(2016-06-14)
  • 11、关于是非的经典语录(2016-10-11)
  • 12、关于棋子和棋手的经典语录(2016-10-11)
  • 最新推荐成考报名

    更多
    1、“低级错误的经典语录”由中国招生考试网网友提供,版权所有,转载请注明出处。
    2、欢迎参与中国招生考试网投稿,获积分奖励,兑换精美礼品。
    3、"低级错误的经典语录" 地址:http://www.chinazhaokao.com/wendang/lizhi/443259.html,复制分享给你身边的朋友!
    4、文章来源互联网,如有侵权,请及时联系我们,我们将在24小时内处理!