程序常见严重Bug-(程序稳定性)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

程序常见严重Bug(程序稳定性)(技术研发中心整理)1、死循环intpos=RandomInt(qc-qacount);if(MenuItem[pos].size()!=0){pos=(pos+1)%(qc-qacount);while(MenuItem[pos].size()!=0)pos=(pos+1)%(qc-qacount);}原因:while循环在特殊逻辑下无法退出。for(inti=0;in;i++){.....i--;.....}原因:循环控制变量i出现了自减,导致死循环。2、数组越界保护intGetVectorData(intindex){if(index0||index=m_DataVct.size())return0;returnm_DataVct[index];}原因:在没有判断(index0||index=m_DataVct.size())的情况下,数组m_DataVct[index]可能会越界访问。for(inti=0;i(int)collectItemList.size();i++){vectorintnpcIds=collectItemList[i].npcIds;for(size_tj=0;jnpcIds.size();j++){boolres=IsNpcInScene(pKernel,npcIds[i],pKernel-GetScene());}}原因:npcIds[i]应该是npcIds[j]才对。3、map查找越界hash_mapint,S_PROPGROUP_ITEM::const_iteratorit=hashmap_PropGroups.find(groupid);if(it==hashmap_PropGroups.end())returnfalse;constS_PROPGROUP_ITEM&propgroup=(*it).second;原因:在没有判断it==hashmap_PropGroups.end()的情况下it为结束,(*it).second访问出错。4、公共数据号加锁intspace_index=pKernel-GetPubSpaceIndex(competeinfo_spacename.c_str());if(space_index0)//正确,加了判断保护{returnfalse;}//没有积分表,直接返回if(!pKernel-FindPubRec(space_index,point_recname.c_str())){returnfalse;}//加锁BEGIN_LOCK_PUBSPACE(space_index);原因:在通过GetPubSpaceIndex函数调用的情况下space_index必须判断是否存在,否则导致后续操作和加锁失败。5、公共数据加锁解锁//加锁BEGIN_LOCK_PUBSPACE(space_index);//竞技场的出生点if(!pKernel-FindPubData(space_index,WaitSceneBorn)){pKernel-AddPubData(space_index,WaitSceneBorn,VARTYPE_STRING);pKernel-SetPubDataSave(space_index,WaitSceneBorn,false);returnfalse;//错误,没有解锁就返回了}//解锁END_LOCK_PUBSPACE(space_index);原因:在进行了公共数据加锁后必须进行解锁操作,否则导致后续加锁失败。6、除0intm=100/vecItems.size();原因:在进行除法运算时没有判断vecItems.size(),导致除零错误。7、取模0intn=100%vecItems.size()原因:在进行取模运算时没有判断vecItems.size(),导致错误。8、空指针判断voidSetString(char*pStr){stringstr=pStr;}原因:没有判断pStr是否为空,在给string对象赋值时导致当机。voidSetData(constSMyData*pData){intn=pData-iValue;}原因:与上类似。9、变量没有初始化intwidth,height;............CRectrect(width,height);原因:在Debug模式下变量都会被初始化为0,但在Release模式下变量的初始值为随机值,容易导致程序在发布后出现诡异Bug。10、函数递归调用voidFunctionA(){if(....)FunctionB();}voidFunctionB(){if(....)FunctionA();}原因:在一定条件下FunctionA和FunctionB会相互调用,无法退出,导致堆栈被耗尽而当机。voidFunctionA(){if(....)FunctionA();elsereturn;}原因:在递归深度超过一定限制时,导致堆栈被耗尽而当机。11、复杂的STL操作(跨线程STL操作)vectorintg_DataVect;//全局资源数组voidFunctionA(){g_DataVect.reserve(100);}原因:禁止在程序运行时写操作全局数据,禁止程序运行时使用复杂的STL函数。12、内存丢失(内存乱使用)CMyClass*pObject=newCMyClass();......if(......)return;//错误,没有释放就返回了。......deletepObject;原因:给对象pObject分配了内存空间,但是在返回前没有释放,导致内存丢失。不论是客户端还是服务器都禁止在运行过程中随意的使用动态内存。13、内存越界操作charsStr[10];.....sStr[11]='s';或者:strcpy(sStr,“01234567890123”);原因:sStr只有10个字节长度,但是却对11个元素进行操作,导致其他内存数据被改写。14、浮点数等于判断floatfVal=1.0f;......if(fVal==1.0f).......原因:fVal=1.0f后可能精度丢失,变为0.99999f,所以后面判断(fVal==1.0f)不成立,导致诡异错误(随机的)。15、静态变量使用VoidPushTemp(){staticNodeListtmpList;while(1){tmpList.push_front(pNode);........break;}}原因:静态变量与全局变量类似,在多线程下会造成多个线程同时读写变量,造成当机。16、脚本参数过多在舞街区项目发生过一次列表军团脚本导致列表服务器当机的问题,后来查明是程序传给脚本函数的参数过多造成的,大概超过100个参数时脚本就发生堆栈错误。所以切忌在脚本里不要过多的传递函数参数,在程序里也不要使用太多的函数参数。

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功