指挥与征服游戏的代码:来自90年代的虫子。第二卷

2020-07-15 21:52:03

V617考虑检查条件。按位运算的';(1L<;<;STRUCT_CHRONSPOPE)';参数包含非零值。HOUSE.CPP 5089 tyecif enum StructType:CHAR{STRUCT_NONE=-1,STRUCT_ADVANCED_TECH,STRUCT_IRE_CREWARD,STRUCT_WEAP,STRUCT_CHRONSPOPE,//3.}#定义STRUCTF_CHRONSPOPE(1L;<;STRUCT_CHRONSPOPE)UrgencyType HouseClass::CHECK_BUILD_POWER(Void)const{.。IF(状态==STATE_AWAREED||STATE==STATE_ATTECTED){IF(BScan|(STRUCTF_CHRONSPOPE)){//<;=紧急=紧急高;}}.}。

要检查变量中是否设置了某些位,请使用&;运算符,而不是|。由于此代码片断中的拼写错误,我们这里有一个始终为真的条件。v768枚举常量WWKEY_RLS_BIT';用作布尔型变量。KEYBOARD.CPP 286类型枚举{WWKEY_SHIFT_BIT=0x100,WWKEY_CTRL_BIT=0x200,WWKEY_ALT_BIT=0x400,WWKEY_RLS_BIT=0x800,WWKEY_VK_BIT=0x1000,WWKEY_DBL_BIT=0x2000,WWKEY_BTN_BIT=0x8000,}WWKEY_。

我认为,在key参数中,意图是检查由WWKEY_RLS_BIT掩码设置的某个位,但是作者犯了一个打字错误。他们应该使用&;按位运算符而不是&;&;来检查密钥代码。V523';THEN';语句等同于';ELSE&39;语句。RADAR.CPP 1827 void RadarClass::Player_Names(Bool On){IsPlayerNames=on;IsToRedraw=true;if(On){Flag_to_Reraw(True);//Flag_to_Reraw(False);}Else{Flag_to_Reraw(True);//强制绘制图板}}。

一位开发人员曾经评论过用于调试的代码。此后,代码中保留了在不同分支中具有相同运算符的条件运算符。找到了完全相同的两个位置:V705可能忘记或注释掉了';Else&39;块,从而改变了程序的操作逻辑。NETDLG.CPP 1506静态INT NET_JOIN_DIALOG(Void){.。/*..。F4/Send/';M';=如果(Messages.Get_..*/_buf()==NULL){.。}Else/*..。如果我们已经在编辑一条消息,而用户单击了“发送”,请将我们的输入转换为返回,以便Messages.Input()可以正常工作。..*/IF(INPUT==(BUTTON_SEND|KN_BUTTON)){INPUT=KN_RETURN;}.}。

由于大量注释,开发人员没有看到上面未完成的条件运算符。其余的Else关键字构成具有以下条件的Else If结构,这很可能会更改原始逻辑。V519连续两次为';ScoresPresent';变量赋值。也许这是个错误。检查热线:539,541。INIT.CPP 541 bool Init_Game(int,char*[]){.。ScoresPresent=False;//If(CCFileClass(";SCORES.MIX";).Is_Available()){ScoresPresent=True;If(!ScoreMix){ScoreMix=new MixFileClass(";SCORES.MIX";);ThemeClass::Scan();}//}。

另一个由不完全重构引起的潜在缺陷。现在还不清楚ScoresPresent变量应该设置为true还是false。V611内存使用';new T[]';运算符分配,但使用';delete';运算符释放。考虑检查此代码。使用DELETE[]POKE_DATA;&可能更好。CCDDE.CPP 410 BOOL SEND_DATA_TO_DDE_Server(char*data,int length,int Packet_type){.。char*poke_data=new char[length+2*sizeof(Int)];//<;=.。IF(DDE_Class->;POKE_Server(.。)==false){CCDebugString(";C&;c95-POKE失败!\n";);DDE_Class->;CLOSE_POKE_CONNECTION();DELETE POKE_DATA;//<;=RETURN(FALSE);}DDE_Class->;CLOSE_POKE_CONNECTION();DELETE POKE_DATA;//<;=RETURN(True);}。

分析器发现一个错误,该错误与可以以不兼容的方式分配和释放内存有关。要释放分配给数组的内存,应该使用DELETE[]运算符,而不是DELETE。有几个这样的地方,它们都逐渐损害正在运行的应用程序(游戏):V611内存是使用';new T[]';操作符分配的,但使用';delete';操作符释放。考虑检查此代码。使用DELETE[]POKE_DATA;&可能更好。CCDDE.CPP 416。

V611内存使用';new T[]';运算符分配,但使用';delete';运算符释放。考虑检查此代码。最好使用';delete[]TEMP_BUFFER;';。INIT.CPP 1302

V611内存使用';new T[]';运算符分配,但使用';delete';运算符释放。考虑检查此代码。使用';delete[]Progress palette;';可能更好。MAPSEL.CPP 795。

V611内存使用';new T[]';运算符分配,但使用';delete';运算符释放。考虑检查此代码。使用删除[]Grey2Palette;';可能更好。MAPSEL.CPP 796。

V611内存使用';new T[]';运算符分配,但使用';delete';运算符释放。考虑检查此代码。使用DELETE[]POKE_DATA;&可能更好。CCDDE.CPP 422。

V611内存使用';new T[]';运算符分配,但使用';delete';运算符释放。考虑检查此代码。最好使用';delete[]TEMP_BUFFER;';。INIT.CPP 1139。

V772调用空指针的删除运算符将导致未定义的行为。ENDING.CPP 254 DELETE和DELETE[]运算符是分开的,这是有原因的。它们执行不同的任务来清除记忆。当使用非类型化指针时,编译器不知道指针指向的是哪种数据类型。在C++标准中,编译器的行为是不确定的。还有许多此类分析器警告:V772调用空指针的删除操作符将导致未定义的行为。HEAP.CPP 284。

V772调用空指针的删除运算符将导致未定义的行为。INIT.CPP 728。

V772调用空指针的删除运算符将导致未定义的行为。MIXFILE.CPP 134。

V772调用空指针的删除运算符将导致未定义的行为。MIXFILE.CPP 391

V772调用空指针的删除运算符将导致未定义的行为。MSGBOX.CPP 423。

V772调用空指针的删除运算符将导致未定义的行为。SOUNDDLG.CPP 407。

V772调用空指针的删除运算符将导致未定义的行为。BUFFER.CPP 126。

V772调用空指针的删除运算符将导致未定义的行为。BUFF.CPP 162。

V772调用空指针的删除运算符将导致未定义的行为。BUFF.CPP 212。

V772调用空指针的删除运算符将导致未定义的行为。BFIOFILE.CPP 330。

V772调用空指针的删除运算符将导致未定义的行为。事件.CPP 934。

V772调用空指针的删除运算符将导致未定义的行为。HEAP.CPP 318

V772调用空指针的删除运算符将导致未定义的行为。INIT.CPP 3851。

V772调用空指针的删除运算符将导致未定义的行为。MIXFILE.CPP 130。

V772调用空指针的删除运算符将导致未定义的行为。MIXFILE.CPP 430。

V772调用空指针的删除运算符将导致未定义的行为。MIXFILE.CPP 447。

V772调用空指针的删除运算符将导致未定义的行为。MIXFILE.CPP 481。

V772调用空指针的删除运算符将导致未定义的行为。MSGBOX.CPP 461。

V772调用空指针的删除运算符将导致未定义的行为。QUEUE.CPP 2982。

V772调用空指针的删除运算符将导致未定义的行为。QUEUE.CPP 3167

V762虚拟函数可能被错误覆盖。请参阅派生类';HelpClass';和基类';DisplayClass';中函数';HELP_TEXT';的第四个参数。HELP.H 55。

V762虚拟函数可能被错误覆盖。请参阅派生类';MapEditClass';和基类';HelpClass';中函数';raw_it';的第一个参数。MAPEDIT.H 187。

V762虚拟函数可能被错误覆盖。请参阅派生类';AnimClass';和基类';ObjectClass';中函数';Occupy_List';的第一个参数。ANIM.H 80。

V762虚拟函数可能被错误覆盖。请参阅派生类';BulletClass';和基类';ObjectClass';中函数';OVERVER_LIST';的第一个参数。BULLET.H 102。

V762虚拟函数可能被错误覆盖。请参阅派生类';BuildingClass';和基类';TechnoClass';中函数';remap_Table';的限定符。BUILDING.H 281。

V762虚拟函数可能被错误覆盖。请参阅派生类';HelpClass';和基类';DisplayClass';中函数';HELP_TEXT';的第四个参数。HELP.H 58。

V762虚拟函数可能被错误覆盖。请参阅派生类';AnimClass';和基类';ObjectClass';中函数';OVERVER_LIST';的第一个参数。ANIM.H 90。

V763参数';coord';在使用之前总是在函数体中重写。DISPLAY.CPP4031void DisplayClass::Set_Tactical_Position(COORDINATE coord){INT xx=0;INT yy=0;CONFINE_RECT(&;xx,&;yy,TacLeptonWidth,TacLeptonHeight,Cell_to_Lepton(MapCellWidth)+GlyphXClientSidebarWidthInLepton,Cell_to_Lepton(MapCellHeight));coord=xy_coord

coord参数立即在函数体中被覆盖。未使用旧值。当函数有参数并且不依赖于它们时,这是非常可疑的。此外,还传递了一些坐标。因此,这段代码值得检查一下:指向本地数组的V507指针存储在此数组的作用域之外。这样的指针将变为无效。MAPSEL.CPP 757游戏代码中有很多全局变量。也许,这在当时是编写代码的常用方法。然而,现在它被认为是糟糕的,甚至是危险的。InterpolationPalette指针存储在本地数组localPalette中,该指针在退出函数后将无效。两个更危险的位置:V507指向局部数组的指针存储在此数组的作用域之外。这样的指针将变为无效。MAPSEL.CPP 769。

V507指向本地数组缓冲区的指针存储在此数组的作用域之外。这样的指针将变为无效。WINDOWS.CPP 458。

正如我在第一份报告中所写的那样,让我们希望新的电子艺术项目有更好的质量。顺便说一下,游戏开发商目前正在积极购买PVS-Studio。现在游戏预算相当大,所以没有人需要额外的费用来修复生产中的错误。说到这里,在代码编写的早期阶段修复错误不会占用太多时间和其他资源。欢迎您访问我们的网站下载并在所有项目中试用PVS-Studio。