1 / 19
文档名称:

软件编程低级错误野指针.pptx

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

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

分享

预览

软件编程低级错误野指针.pptx

上传人:12344 2020/2/16 文件大小:393 KB

下载得到文件列表

软件编程低级错误野指针.pptx

相关文档

文档介绍

文档介绍:2020/2/7PSST系统工程部C语言软件编程规范工作组公司常见软件编程低级错误:野指针前言这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA(汽车工业软件可靠性联合会)制定的1998版的MISRAC规范指出,一些在C看来可以接受,却存在隐患的地方有127处之多。2004版的MISRAC规范将针对C语言的规则增加到了141条。对于程序员来说,能工作的代码并不等于“好”代码。“好”代码的指标很多,包括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良编程****惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。本胶片收集了常见的野指针案例,给出了相应的纠正措施。对应的编程规范:防止引用已经释放的内存空间野指针:多模块调用的指针删除未赋NULL【问题描述】当D服务执行过程完成后,最后一次修改内存数据库中的数据时发生coredump。【问题定位】D服务coredump处的代码如下:…//hargEvent对象,用于向共享内存中写入数据pobjChargingEvent=hargingEvent;//使用m_pSessionContext将pobjChargingEvent传递给其他模块m_pSessionContext->setDestTLV(pobjChargingEventEx);…deletepobjChargingEvent;//该行代码是读取操作内存数据库事务ID的,每当调用对内存数据库中的数据进行修改时,都会执行该行代码。TransactionKey=pCBSContext->getTransactionKey();//发生coredump处getTransactionKey的代码见下页野指针:多模块调用的指针删除未赋NULL(续)BSSessionContext::hargingEvent*pChargingEvent){m_pDestTLV=pChargingEvent;}ENIP::BSSessionContext::getTransactionKey(){if(NULL==m_pDestTLV){return0;}m_pDestTLV->getInt8Tag();…}【纠正措施】在D服务中语句“deletepobjChargingEvent;”之后加上语句“m_pSessionContext->setDestTLV(NULL);”即可。【举一反三】耦合度较强的模块互相调用时,一定要仔细考虑其调用关系,防止已经删除(析构)的对象被再次使用。野指针:传递参数为局部变量【问题描述】SWM在下载升级包操作中增加了一个版本号参数,在验证中发现,对版本的校验中使用的版本号并非传入的版本号,而是被截断了,只保留了前20位,造成比较结果不一致。【问题定位】根据命令执行流程,在参数传递的每一个环节增加调试打印。发现是在调用VOS_CreateTask创建下载任务的环节,传入的版本号参数被截断。代码如下:VOS_CHARacSoftVer[SWM_VERSION_LEN]={0};...aulArgs[0]=(VOS_UINT32)pTmpFtpInfo;aulArgs[1]=enFileType;aulArgs[2]=(VOS_UINT32)pInMsg;aulArgs[3]=(VOS_UINT32)acSoftVer;/*Createanewtaskforloading*/ulRet=VOS_CreateTask("M",&ulTaskID,SWM_OMUFtpTask,m_aulTaskPrio[VOS_PRIORITY_P1],VOS_NULL,aulArgs);...return;由于acSoftVer是局部变量,在VOS_CreateTask函数执行退出后便被释放,已经变成一个野指针。而SWM_OMUFtpTask函数和SWM_DldVerPkg函数却仍在使用,这就造成了指针所指内容被破坏。【纠正措施】acSoftVer改为动态分配内存,在SWM_OMUFtpTask函数退出前释放。临时对象产生野指针(1)【问题描述】报文结果中总是随机出现乱码,过一会儿又正常了。【问题定位】检视代码发现使用临时对象:constTCHAR*pTempSave=(g_pSmuMEControl->GetErrInfoByID()).c_str();SMU_PARA_COPY(pTemp,pTempSave);GetErrInfoByID返回的是该函数内部定义的临时string变量,当函数