X-Ray Engineã¯ã2014幎9æ16æ¥ã«STALKERã·ãªãŒãºã®ã²ãŒã ã§äœ¿çšãããã²ãŒã ãšã³ãžã³ã§ãããã®ãœãŒã¹ã³ãŒãã¯ãããªãã¯ãã¡ã€ã³ã§å
¬éããããã以æ¥ãã¡ã³ãéçºãç¶ããŠããŸãã ãããžã§ã¯ãã®å€§èŠæš¡ããã²ãŒã ã®èšå€§ãªæ°ã®ãã°-ãããã¯ãã¹ãŠãPVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã®æ©èœã®åªãããã¢ãæäŸããŸãã

ãšã³ããªãŒ
X-Rayã¯ããŠã¯ã©ã€ãã®GSC GameWorldã«ãã£ãŠã²ãŒã STALKERïŒShadow of Chernobylçšã«äœæãããŸããã ãã®ãšã³ãžã³ã«ã¯ãDirectX 8.1 / 9.0c / 10 / 10.1 / 11ãç©çãšã³ãžã³ãšãµãŠã³ããšã³ãžã³ããã«ããã¬ã€ã€ãŒãA-Life人工ç¥èœã·ã¹ãã ããµããŒãããã¬ã³ããªã³ã°ãå«ãŸããŠããŸãã ãã®åŸãåç€Ÿã¯æ°ããã²ãŒã çšã«ããŒãžã§ã³2.0ãšã³ãžã³ãäœæããŸããããéçºã¯äžæ¢ããããœãŒã¹ã³ãŒãã¯ãããã¯ãŒã¯ã«æµã蟌ã¿ãŸããã
ãããžã§ã¯ããšãã®ãã¹ãŠã®äŸåé¢ä¿ã¯ãVisual Studio 2015ã§ç°¡åã«çµã¿ç«ãŠãããŸãã確èªã®ããã
GitHubã®
ãªããžããªããã®1.6ãšã³ãžã³ã®ãœãŒã¹ã³ãŒããšã
åç
§ã«ããããŠã³ããŒãã§ããPVS-Studio 6.04éçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŸããã
ã³ããŒããŒã¹ã
ãŸããã³ãŒãã®ã³ããŒã«é¢é£ãããšã©ãŒãæ€èšããŠãã ããã ããŸããŸãªã±ãŒã¹ã§ã®ãããã®çºçã®ã·ããªãªã¯éåžžé¡äŒŒããŠããŸãïŒåœŒãã¯ã³ãŒããã³ããŒããããã€ãã®å€æ°ã倿Žããããã€ããå¿ããŸããã ãã®ãããªãšã©ãŒã¯ã³ãŒãããŒã¹å
šäœã«æ¥éã«åºãããéçã¢ãã©ã€ã¶ãŒããªããšèŠéãããããªããŸãã

MxMatrix& MxQuadric::homogeneous(MxMatrix& H) const { .... unsigned int i, j; for(i=0; i<A.dim(); i++) for(j=0; j<A.dim(); i++) H(i,j) = A(i,j); .... }
PVS-StudioèŠå ïŒ
V533 ãforãæŒç®åå
ã§èª€ã£ã倿°ãã€ã³ã¯ãªã¡ã³ããããŠããå¯èœæ§ããããŸãã ãiãã®æ€èšãæ€èšããŠãã ããã mxqmetric.cpp 76
ã¢ãã©ã€ã¶ãŒã¯ããã¹ãããã
forã«ãŒãå
ã§å€æ°
iãã€ã³ã¯ãªã¡ã³ãããã倿°
jããã§ãã¯ãããç¡éã«ãŒããçºçããããšãæ€åºããŸããã ããããããããã³ããŒãããšãã圌ãã¯åã«ããã倿Žããã®ãå¿ããŠããŸããã
void CBaseMonster::settings_read(CInifile const * ini, LPCSTR section, SMonsterSettings &data) { .... if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_base"), "%f,%f,%f", &data.m_attack_effector.ppi.color_base.r, &data.m_attack_effector.ppi.color_base.g, &data.m_attack_effector.ppi.color_base.b); if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_gray"), "%f,%f,%f", &data.m_attack_effector.ppi.color_gray.r, &data.m_attack_effector.ppi.color_gray.g, &data.m_attack_effector.ppi.color_gray.b); if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_add"), "%f,%f,%f", &data.m_attack_effector.ppi.color_add.r, &data.m_attack_effector.ppi.color_add.g, &data.m_attack_effector.ppi.color_add.b); .... }
PVS-Studioã®èŠå ïŒ
- V581äºãã«äžŠãã§ãããifãæŒç®åã®æ¡ä»¶åŒã¯åäžã§ãã è¡ã確èªããŠãã ããïŒ445ã447ãbase_monster_startup.cpp 447
- V581äºãã«äžŠãã§ãããifãæŒç®åã®æ¡ä»¶åŒã¯åäžã§ãã è¡ã確èªããŠãã ããïŒ447ã449ãbase_monster_startup.cpp 449
ãã®ãã©ã°ã¡ã³ãã§ã¯ãããã€ãã®åäžã®æ¡ä»¶åŒãé£ç¶ããŠäœ¿çšãããŠããŸãã æããã«ã
ifãã©ã³ãã®æ¬äœã®ã³ãŒãã«åŸã£ãŠã
color_baseã
color_grayãš
color_addã«çœ®ãæããå¿
èŠããããŸã
ã static void ProcessStatement(char *buff, int len) { .... if (strncmp(buff,"\\pauthr\\",8) == 0) { ProcessPlayerAuth(buff, len); } else if (strncmp(buff,"\\getpidr\\",9) == 0) { ProcessGetPid(buff, len); } else if (strncmp(buff,"\\getpidr\\",9) == 0) { ProcessGetPid(buff, len); } else if (strncmp(buff,"\\getpdr\\",8) == 0) { ProcessGetData(buff, len); } else if (strncmp(buff,"\\setpdr\\",8) == 0) { ProcessSetData(buff, len); } }
PVS-Studio èŠå ïŒ
V517 ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªããŠãã ããïŒ1502ã1505ãgstats.c 1502
åã®äŸãšåæ§ã«ã2ã€ã®åäžã®æ¡ä»¶ãããã§äœ¿çšãããŸãïŒ
strncmpïŒbuffã "\\ getpidr \\"ã9ïŒ== 0 ïŒã ãããééãã§ããããåã«å°éäžèœãªã³ãŒãã§ãããã確å®ã«èšãã®ã¯å°é£ã§ãããæ³šæãæã䟡å€ãããããšã¯ééããããŸããã
getpdr /
setpdrãšåæ§ã«ã
getpidr /
setpidrãæã€ãããã¯ãååšããå¯èœæ§ããããŸãã
class RGBAMipMappedCubeMap { .... size_t height() const { return cubeFaces[0].height(); } size_t width() const { return cubeFaces[0].height(); } .... };
PVS-StudioèŠå ïŒ
V524 ãå¹
ãæ©èœã®æ¬äœããé«ããæ©èœã®æ¬äœãšå®å
šã«åçã§ããããšã¯å¥åŠã§ãã tpixel.h 1090
ã¡ãœãã
heightïŒïŒãš
widthïŒïŒã¯åãæ¬äœãæã¡ãŸãã ç«æ¹äœã®é¢ã®å¯žæ³ãèšç®ãããŠããå Žåãããã§ãšã©ãŒã¯çºçããªãå¯èœæ§ããããŸãã ãã ããæ¬¡ã®ããã«
widthïŒïŒã¡ãœãããæžãæããæ¹ãé©åã§ãã
size_t width() const { return cubeFaces[0].width(); }
C ++ã®èª€çš
C ++ã¯ãããã°ã©ãã«å€ãã®æ©äŒãäžããçŽ æŽãããèšèªã§ã...ç¹ã«æ®é
·ãªæ¹æ³ã§èªåèªèº«ãæã€ã æªå®çŸ©ã®åäœãã¡ã¢ãªãªãŒã¯ããããŠãã¡ããã¿ã€ããã¹-ãã®ã¿ã€ãã®ãšã©ãŒã«ã€ããŠã¯ãçŸåšã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãã

template <class T> struct _matrix33 { public: typedef _matrix33<T>Self; typedef Self& SelfRef; .... IC SelfRef sMTxV(Tvector& R, float s1, const Tvector& V1) const { Rx = s1*(m[0][0] * V1.x + m[1][0] * V1.y + m[2][0] * V1.z); Ry = s1*(m[0][1] * V1.x + m[1][1] * V1.y + m[2][1] * V1.z); Rz = s1*(m[0][2] * V1.x + m[1][2] * V1.y + m[2][2] * V1.z); } .... }
PVS-StudioèŠå ïŒ
V591évoid颿°ã¯å€ãè¿ãå¿
èŠããããŸãã _matrix33.h 435
ã¡ãœããã®æåŸã§
return *ããã¯ã¹ããããããŸãã æšæºã§ã¯ããã®ãããªã³ãŒãã¯æªå®çŸ©ã®åäœã«ã€ãªãããŸãã æ»ãå€ã¯åç
§ã§ãããããæ»ãå€ã«ã¢ã¯ã»ã¹ããããšãããšãããã°ã©ã ãã¯ã©ãã·ã¥ããå¯èœæ§ããããŸãã
ETOOLS_API int __stdcall ogg_enc(....) { .... FILE *in, *out = NULL; .... input_format *format; .... in = fopen(in_fn, "rb"); if(in == NULL) return 0; format = open_audio_file(in, &enc_opts); if(!format){ fclose(in); return 0; }; out = fopen(out_fn, "wb"); if(out == NULL){ fclose(out); return 0; } .... }
PVS-StudioèŠå ïŒ
V575 nullãã€ã³ã¿ãŒããfcloseã颿°ã«æž¡ãããŸãã æåã®åŒæ°ã調ã¹ãŸãã ogg_enc.cpp 47
ããªãè峿·±ãäŸã§ãã ã¢ãã©ã€ã¶ãŒã¯ã
fcloseåŒã³åºãã®åŒæ°ã
nullptrã§ããããšãããããŸãããããã«ããã颿°åŒã³åºããç¡æå³ã«ãªããŸãã 圌ãã¯ã€ã³ã¹ããªãŒã ãéããã¯ãã ãšä»®å®ã§ããŸã
ã void NVI_Image::ABGR8_To_ARGB8() {
PVS-Studioã®èŠåïŒ- V560æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒ0x000000FFã nvi_image.cpp 170
- V560æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒ0x000000FFã nvi_image.cpp 171
- V560æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒ0x000000FFã nvi_image.cpp 172
- V560æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒ0x000000FFã nvi_image.cpp 173
ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã§ã¯ãè«çæŒç®ãšãããæŒç®ãæ··åãããŠããŸãã çµæã¯ããã°ã©ããæåŸ
ãããã®ã§ã¯ãããŸãããcolã¯å
¥åã«é¢ä¿ãªãåžžã«0x01010101ã§ãã
æ£ãããªãã·ã§ã³ïŒ
DWORD a = (col >> 24) & 0x000000FF; DWORD b = (col >> 16) & 0x000000FF; DWORD g = (col >> 8) & 0x000000FF; DWORD r = (col >> 0) & 0x000000FF;
å¥ã®å¥åŠãªã³ãŒãäŸïŒ
VertexCache::VertexCache() { VertexCache(16); }
PVS-StudioèŠå ïŒ
V603ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã ã³ã³ã¹ãã©ã¯ã¿ãåŒã³åºãå Žåã¯ããthis-> VertexCache :: VertexCacheïŒ....ïŒãã䜿çšããå¿
èŠããããŸãã vertexcache.cpp 6
ã€ã³ã¹ã¿ã³ã¹ãåæåããããã«å¥ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºã代ããã«ã
VertexCacheåã®æ°ãããªããžã§ã¯ããäœæãããããã«ç Žæ£ãããŸãã ãã®çµæãäœæããããªããžã§ã¯ãã®ã¡ã³ããŒã¯åæåãããªããŸãŸã«ãªããŸãã
BOOL CActor::net_Spawn(CSE_Abstract* DC) { .... m_States.empty(); .... }
PVS-StudioèŠå ïŒ
V530颿° 'empty'ã®æ»ãå€ã䜿çšããå¿
èŠããããŸãã actor_network.cpp 657
ã¢ãã©ã€ã¶ãŒã¯ã颿°ã«ãã£ãŠè¿ãããå€ã䜿çšãããŠããªãããšãèŠåããŸãã ããã°ã©ããŒã¯
emptyïŒïŒã¡ãœãããš
clearïŒïŒã¡ãœãããæ··åããŠããããã§ãïŒ
emptyïŒïŒã¯é
åãã¯ãªã¢ããŸãããã空ãã©ããã確èªããŸãã
ãã®ãããªãšã©ãŒã¯ããŸããŸãªãããžã§ã¯ãã§
ããèŠãããŸãã åé¡ã¯ã
空ã®åå
ïŒïŒãæããã§
ã¯ãªãããšã§ããäžéšã®äººã¯ããããã¢ã¯ã·ã§ã³-åé€ãšããŠèªèããŠããŸãã ãã®ãããªãããŸãããé¿ããããã«ãhasãisåè©ãã¡ãœããã®å
é ã«è¿œå ããããšãã
å§ãããŸããå®éã
isEmptyïŒïŒãš
clearïŒïŒã¯æ··åãã«ããã§ãã
åæ§ã®èŠåïŒ
V530颿° 'unique'ã®æ»ãå€ã䜿çšããå¿
èŠããããŸãã uidragdroplistex.cpp 780
size_t xrDebug::BuildStackTrace(EXCEPTION_POINTERS* exPtrs, char *buffer, size_t capacity, size_t lineCapacity) { memset(buffer, capacity*lineCapacity, 0); .... }
PVS-StudioèŠå ïŒ
V575 ãmemsetã颿°ã¯ã0ãèŠçŽ ãåŠçããŸãã 3çªç®ã®åŒæ°ã調ã¹ãŸãã xrdebug.cpp 104
memsetãåŒã³åºããããšããåŒæ°ã¯æ··åããããã®çµæããããã¡ã¯å
ã
æå³ãããŠããããã«ãªã»ãããããŸããã åæ§ã®ãšã©ãŒã¯ãæ€åºããã®ãéåžžã«é£ããããããããžã§ã¯ãå
ã§éåžžã«é·ãéçºçããå¯èœæ§ããããŸãã ãã®ãããªå Žæã§ã¯ãéçã¢ãã©ã€ã¶ãŒãããã°ã©ããŒã®å©ãã«ãªããŸãã
memsetã®æ£ãã䜿çšïŒ
memset(buffer, 0, capacity*lineCapacity);
次ã®ãšã©ãŒã¯ãäžæ£ãªåœ¢åŒã®è«çåŒã«é¢é£ããŠããŸãã
void configs_dumper::dumper_thread(void* my_ptr) { .... DWORD wait_result = WaitForSingleObject( this_ptr->m_make_start_event, INFINITE); while ( wait_result != WAIT_ABANDONED) || (wait_result != WAIT_FAILED)) .... }
PVS-StudioèŠå ïŒ
V547åŒã¯åžžã«çã§ãã ããã§ã¯ãããããã&&ãæŒç®åã䜿çšããå¿
èŠããããŸãã configs_dumper.cpp 262
'xïŒ= A ||ãšãã圢åŒã®åŒ xïŒ= b 'ã¯åžžã«çã§ãã ããããæŒç®åã®ä»£ããã«|| æŒç®å&&ãæé»æå®ãããŸããã
è«çåŒã®ãšã©ãŒã®è©³çްã«ã€ããŠã¯ãã
C / C ++ã®è«çåŒãå°éå®¶ã®èª€è§£ ããã芧ãã ããã
void SBoneProtections::reload(const shared_str& bone_sect, IKinematics* kinematics) { .... CInifile::Sect &protections = pSettings->r_section(bone_sect); for (CInifile::SectCIt i=protections.Data.begin(); protections.Data.end() != i; ++i) { string256 buffer; BoneProtection BP; .... BP.BonePassBullet = (BOOL) ( atoi( _GetItem(i->second.c_str(), 2, buffer) )>0.5f); .... } }
PVS-StudioèŠå ïŒ
V674 ãfloatãåã®ã0.5fããªãã©ã«ã¯ããintãåã®å€ãšæ¯èŒãããŸãã boneprotections.cpp 54
ã¢ãã©ã€ã¶ãŒã¯ãæŽæ°å€ãšå®å®æ°ã®æ¯èŒãèŠã€ããŸããã ããã§ã¯ã顿šã«ããã
atoiã§ã¯ãªã
atof颿°ã䜿çšããå¿
èŠããããŸããããããªããšãçãããèŠããªãããã«ãã®æ¯èŒãæžãæãã䟡å€ããããŸãã ãã ãããã®äŸãééãã§ãããã©ããã¯ééããªããæžããéçºè
ã®ã¿ãã§ããŸãã
class IGameObject : public virtual IFactoryObject, public virtual ISpatial, public virtual ISheduled, public virtual IRenderable, public virtual ICollidable { public: .... virtual u16 ID() const = 0; .... } BOOL CBulletManager::test_callback( const collide::ray_defs& rd, IGameObject* object, LPVOID params) { bullet_test_callback_data* pData = (bullet_test_callback_data*)params; SBullet* bullet = pData->pBullet; if( (object->ID() == bullet->parent_id) && (bullet->fly_dist<parent_ignore_distance) && (!bullet->flags.ricochet_was)) return FALSE; BOOL bRes = TRUE; if (object){ .... } return bRes; }
PVS-StudioèŠå ïŒ
V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ãããªããžã§ã¯ãããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ããã§ãã¯ããŠãã ããïŒ42ã47ãlevel_bullet_manager_firetrace.cpp 42
ãªããžã§ã¯ã-> IDïŒïŒãéåç
§ãããåŸã«
ã nullptrã®ç䟡æ§ã«ã€ããŠ
ãªããžã§ã¯ããã€ã³ã¿ãŒããã§ãã¯ã
ãŸã ã
ãªããžã§ã¯ããnullptrã®å Žåãããã¯ããã°ã©ã ã®ã¯ã©ãã·ã¥ã«ã€ãªãããŸãã
#ifdef _EDITOR BOOL WINAPI DllEntryPoint(....) #else BOOL WINAPI DllMain(....) #endif { switch (ul_reason_for_call) { .... case DLL_THREAD_ATTACH: if (!strstr(GetCommandLine(), "-editor")) CoInitializeEx(NULL, COINIT_MULTITHREADED); timeBeginPeriod(1); break; .... } return TRUE; }
PVS-StudioèŠå ïŒ
V718 ãCoInitializeExã颿°ããDllMainã颿°ããåŒã³åºããªãã§ãã ããã xrcore.cpp 205
CoInitializeExãå«ãWinAPI颿°ã®äžéšã¯ã
DllMainã®æ¬äœã§ã¯äœ¿çšã§ããŸãã
ã ããã¯ã
MSDNã®
ããã¥ã¡ã³ããèªãããšã§ç¢ºèªã§ããŸãã ãã®é¢æ°ãæžãæããæ¹æ³ã«ã€ããŠæç¢ºãªã¢ããã€ã¹ãããããšã¯ã§ããŸãããããããŒã®çžäºãããã¯ãã¯ã©ãã·ã¥ã«ã€ãªããå¯èœæ§ãããããããã®ãããªç¶æ³ã¯å±éºã§ããããšãçè§£ããå¿
èŠããããŸãã
åªå
çãªééã
int sgetI1( unsigned char **bp ) { int i; if ( flen == FLEN_ERROR ) return 0; i = **bp; if ( i > 127 ) i -= 256; flen += 1; *bp++; return i; }
PVS-StudioèŠå ïŒ
V532 ã*ãã€ã³ã¿ãŒ++ããã¿ãŒã³ã®ã¹ããŒãã¡ã³ãã®æ€æ»ãæ€èšããŠãã ããã ããããæå³ïŒãïŒ*ãã€ã³ã¿ãŒïŒ++ãã lwio.c 316
ãã®ãšã©ãŒã¯ãã€ã³ã¯ãªã¡ã³ãã®äœ¿çšãåå ã§ãã ããããããããããã«ããã®åŒãè§ãã£ãã§æžãçŽããŸãã
*(bp++);
ã€ãŸããã³ã³ãã³ãã¯ã¢ãã¬ã¹
bpã«ã·ãããããã®ã§ã¯ãªãããã®ã³ã³ããã¹ãã§ã¯ç¡æå³ãªãã€ã³ã¿ãŒèªäœã«ã·ãããããŸãã ã³ãŒãã®äžã«
* bp + = Nãšãã圢åŒã®ãã©ã°ã¡ã³ãããããŸããããããšã©ãŒã ãšçµè«ä»ããçç±ã§ãã
æ¬åŒ§ãé
眮ãããšããã®ãããªãšã©ãŒãåé¿ã§ããèšç®ã®é åºãããæç¢ºã«ãªããŸãã ãŸãã倿Žãã¹ãã§ãªãåŒæ°ã«
constã䜿çšããããšãè¯ãæ¹æ³ã§ãã
åæ§ã®èŠåïŒ
- V532ã*ãã€ã³ã¿ãŒ++ããã¿ãŒã³ã®ã¹ããŒãã¡ã³ãã®æ€æ»ãæ€èšããŠãã ããã ããããæå³ïŒãïŒ*ãã€ã³ã¿ãŒïŒ++ãã lwio.c 354
- V532ã*ãã€ã³ã¿ãŒ++ããã¿ãŒã³ã®ã¹ããŒãã¡ã³ãã®æ€æ»ãæ€èšããŠãã ããã ããããæå³ïŒãïŒ*ãã€ã³ã¿ãŒïŒ++ãã lwob.c 80
void CHitMemoryManager::load (IReader &packet) { .... if (!spawn_callback || !spawn_callback->m_object_callback) if(!g_dedicated_server) Level().client_spawn_manager().add( delayed_object.m_object_id,m_object->ID(),callback); #ifdef DEBUG else { if (spawn_callback && spawn_callback->m_object_callback) { VERIFY(spawn_callback->m_object_callback == callback); } } #endif
PVS-StudioèŠå ïŒ
V563ãã®ãelseããã©ã³ãã¯ãåã®ãifãã¹ããŒãã¡ã³ãã«é©çšããå¿
èŠãããå¯èœæ§ããããŸãã hit_memory_manager.cpp 368
ãã®ãã©ã°ã¡ã³ãã§ã¯ã
elseãã©ã³ãã¯ãã®å³çµåæ§ã®ããã«2çªç®ã®
ifãåç
§ã
ãŸãã ãããã¯ã³ãŒãã®ãã©ãŒããããšäžèŽããŸããã 幞ããªããšã«ããã®ã±ãŒã¹ã¯ããã°ã©ã ã®åäœã«åœ±é¿ãäžããŸãããããããã°ãšãã¹ãã®ããã»ã¹ãè€éã«ããå¯èœæ§ããããŸãã
æšå¥šäºé
ã¯ç°¡åã§ã-å€å°è€éãªãã©ã³ãã«ãã¬ãŒã¹ãé
眮ããŸãã
void HUD_SOUND_ITEM::PlaySound(HUD_SOUND_ITEM& hud_snd, const Fvector& position, const IGameObject* parent, bool b_hud_mode, bool looped, u8 index) { .... hud_snd.m_activeSnd->snd.set_volume( hud_snd.m_activeSnd->volume * b_hud_mode?psHUDSoundVolume:1.0f); }
èŠåPVS-Studio ïŒ
V502 ãïŒïŒãæŒç®åã¯ãäºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããå¯èœæ§ããããŸãã ãïŒïŒãæŒç®åã¯ãã*ãæŒç®åãããåªå
é äœãäœããªããŸãã hudsound.cpp 108
äžé
æ¡ä»¶æŒç®åã¯ä¹ç®ãããåªå
é äœãäœããããæŒç®ã®é åºã¯æ¬¡ã®ããã«ãªããŸãã
(hud_snd.m_activeSnd->volume * b_hud_mode)?psHUDSoundVolume:1.0f
æããã«ãæ£ããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
hud_snd.m_activeSnd->volume * (b_hud_mode?psHUDSoundVolume:1.0f)
äžé
æŒç®åãè€æ°ã®
if-elseãã©ã³ãããŸãã¯AND / ORæŒç®ãå«ãåŒã¯ãäœåãªãã©ã±ãããé
眮ããæ¹ãé©åãªå Žåã§ãã
åæ§ã®èŠåïŒ
- V502ãããããã?:ãæŒç®åã¯äºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããŸãã ãïŒïŒãæŒç®åã¯ãã+ãæŒç®åãããåªå
床ãäœããªããŸãã uihudstateswnd.cpp 487
- V502ãããããã?:ãæŒç®åã¯äºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããŸãã ãïŒïŒãæŒç®åã¯ãã+ãæŒç®åãããåªå
床ãäœããªããŸãã uicellcustomitems.cpp 106
远å ã®æ¯èŒ
void CDestroyablePhysicsObject::OnChangeVisual() { if (m_pPhysicsShell){ if(m_pPhysicsShell)m_pPhysicsShell->Deactivate(); .... } .... }
PVS-StudioèŠå ïŒ
V571ç¹°ãè¿ããã§ãã¯ã ãifïŒm_pPhysicsShellïŒãæ¡ä»¶ã¯ã32è¡ç®ã§ãã§ã«æ€èšŒãããŠããŸããdestroyablephysicsobject.cpp 33
ãã®äŸã§ã¯ã
m_pPhysicsShellãããã«ãã§ãã¯ã
ãŸã ã ã»ãšãã©ã®å Žåã2çªç®ã®ãã§ãã¯ã¯äžèŠã§ãã
void CSE_ALifeItemPDA::STATE_Read(NET_Packet &tNetPacket, u16 size) { .... if (m_wVersion > 89) if ( (m_wVersion > 89)&&(m_wVersion < 98) ) { .... }else{ .... } }
PVS-StudioèŠå ïŒ
V571ç¹°ãè¿ããã§ãã¯ã 'm_wVersion> 89'æ¡ä»¶ã¯ã987è¡ç®ã§æ¢ã«æ€èšŒãããŠããŸããxrserver_objects_alife_items.cpp 989
éåžžã«å¥åŠãªã³ãŒãã
ifïŒm_wVersion> 89ïŒã®åŸã®åŒãããã§å¿ããããããäžé£ã®
else-ifã®ãããããå¿ããããŸããã ãã®æ¹æ³ã§ã¯ããããžã§ã¯ãéçºè
ã«ããããè©³çŽ°ãªæ€èšãå¿
èŠã§ãã
void ELogCallback(void *context, LPCSTR txt) { .... bool bDlg = ('#'==txt[0])||((0!=txt[1])&&('#'==txt[1])); if (bDlg){ int mt = ('!'==txt[0])||((0!=txt[1])&&('!'==txt[1]))?1:0; .... } }
PVS-Studioã®èŠå ïŒ
- V590 'ïŒ0ïŒ= Txt [1]ïŒ&&ïŒ'ïŒ '== txt [1]ïŒ'åŒã®æ€æ»ãæ€èšããŠãã ããã 衚çŸãéå°ã§ãããã誀æ€ãå«ãŸããŠããŸãã elog.cpp 29
- V590 'ïŒ0ïŒ= Txt [1]ïŒ&&ïŒ'ïŒ '== txt [1]ïŒ'åŒã®æ€æ»ãæ€èšããŠãã ããã 衚çŸãéå°ã§ãããã誀æ€ãå«ãŸããŠããŸãã elog.cpp 31
倿°
bDlgããã³
mtã®åæååŒã§ã¯
ããã§ãã¯
ïŒ0ïŒ= Txt [1]ïŒã¯åé·ã§ãã çç¥ãããšãåŒãèªã¿ããããªããŸãã
bool bDlg = ('#'==txt[0])||('#'==txt[1]); int mt = ('!'==txt[0])||('!'==txt[1])?1:0;
ããŒã¿åã®ãšã©ãŒ

float CRenderTarget::im_noise_time; CRenderTarget::CRenderTarget() { .... param_blur = 0.f; param_gray = 0.f; param_noise = 0.f; param_duality_h = 0.f; param_duality_v = 0.f; param_noise_fps = 25.f; param_noise_scale = 1.f; im_noise_time = 1/100; im_noise_shift_w = 0; im_noise_shift_h = 0; .... }
PVS-StudioèŠå ïŒ
V636 '
1/100 'åŒã¯ãæé»çã« 'int'åãã 'float'åã«ãã£ã¹ããããŸããã åæ°éšåã®æå€±ãé¿ããããã«ãæç€ºçãªåãã£ã¹ãã®äœ¿çšãæ€èšããŠãã ããã äŸïŒdouble A =ïŒdoubleïŒïŒXïŒ/ Y;ã gl_rendertarget.cpp 245
æŽæ°é€ç®æŒç®ãå®è¡ãããããã1/100åŒã®å€ã¯0ã§ãã 0.01fã®å€ãååŸããã«ã¯ãå®éã®ãªãã©ã«ã䜿çšããŠåŒãæžãæããå¿
èŠããããŸãïŒ1 / 100.0fã ãã®åäœã¯äœæè
ã«ãã£ãŠæäŸãããå¯èœæ§ããããŸããããšã©ãŒã¯ãããŸããã
CSpaceRestriction::merge(....) const { .... LPSTR S = xr_alloc<char>(acc_length); for ( ; I != E; ++I) temp = strconcat(sizeof(S),S,*temp,",",*(*I)->name()); .... }
PVS-StudioèŠå ïŒ
V579 strconcat颿°ã¯ããã€ã³ã¿ãŒãšãã®ãµã€ãºãåŒæ°ãšããŠåãåããŸãã ééããããããŸããã æåã®åŒæ°ã調ã¹ãŸãã space_restriction.cpp 201
strconcat颿°ã¯ãæåã®ãã©ã¡ãŒã¿ãŒãšããŠããããã¡ãŒã®é·ãã
ååŸããŸãã ãããã¡ãŒ
S㯠LPSTRãšããŠãã€ãŸãæååãžã®ãã€ã³ã¿ãŒãšããŠå®£èšãããŸãã
sizeofïŒSïŒã¯ããã€ãåäœã®ãã€ã³ã¿ãŒã®ãµã€ãºãã€ãŸã
sizeofïŒchar *ïŒã«çãããªããæååã®æåæ°ã§ã¯ãããŸããã é·ããèšç®ããã«ã¯ã
strlenïŒSïŒã䜿çšããŸãã
class XRCDB_API MODEL { .... u32 status;
PVS-StudioèŠå ïŒ
V712ã³ã³ãã€ã©ãŒã¯ãã®ãµã€ã¯ã«ãåé€ããããç¡éã«ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ãããåé¿ããã«ã¯ãæ®çºæ§å€æ°ãŸãã¯åæããªããã£ãã䜿çšããŸãã xrcdb.cpp 100
ã¹ããŒã¿ã¹å€æ°ã¯ã«ãŒãå
ã§å€æŽãããªããããã³ã³ãã€ã©ãŒã¯æé©åãšããŠ
S_INIT ==ã¹ããŒã¿ã¹ãã§ãã¯ãåé€ã§ããŸãã ãã®åäœãåé¿ããã«ã¯ã
æ®çºæ§å€æ°ãŸãã¯ã¹ã¬ããéã®ããŒã¿åæã®çš®é¡ã䜿çšããå¿
èŠããããŸãã
åæ§ã®èŠåïŒ
- V712ã³ã³ãã€ã©ãŒããã®ãµã€ã¯ã«ãåé€ããããç¡éã«ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ãããåé¿ããã«ã¯ãæ®çºæ§å€æ°ãŸãã¯åæããªããã£ãã䜿çšããŸãã levelcompilerloggerwindow.cpp 23
- V712ã³ã³ãã€ã©ãŒããã®ãµã€ã¯ã«ãåé€ããããç¡éã«ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ãããåé¿ããã«ã¯ãæ®çºæ§å€æ°ãŸãã¯åæããªããã£ãã䜿çšããŸãã levelcompilerloggerwindow.cpp 232
void CAI_Rat::UpdateCL() { .... if (!Useful()) { inherited::UpdateCL (); Exec_Look (Device.fTimeDelta); CMonsterSquad *squad = monster_squad().get_squad(this); if (squad && ((squad->GetLeader() != this && !squad->GetLeader()->g_Alive()) || squad->get_index(this) == u32(-1))) squad->SetLeader(this); .... } .... }
PVS-Studio èŠå ïŒ
V547åŒ 'squad-> get_indexïŒthisïŒ== u32ïŒ-1ïŒ'ã¯åžžã«falseã§ãã 笊å·ãªãcharåã®å€ã®ç¯å²ïŒ[0ã255]ã ai_rat.cpp 480
ãã®åŒãåžžã«åœã§ããçç±ãçè§£ããããã«ãåã
ã®ãªãã©ã³ãã®å€ãèšç®ããŸãã u32ïŒ-1ïŒã¯0xFFFFFFFFãŸãã¯4294967295
ã§ããsquad-> get_indexïŒ....ïŒã¡ãœããã«ãã£ãŠè¿ãããåã¯u8ã§ããããããã®æå€§å€ã¯0xFFãŸãã¯255ã§ãããå³å¯ã«u32ïŒ-1ïŒæªæºã§ãã ãããã£ãŠããã®ãããªæ¯èŒã®å€ã¯åžžã«
falseã«ãªã
ãŸã ã ãã®ã³ãŒãã¯ãããŒã¿åãu8ã«å€æŽããããšã§ç°¡åã«ä¿®æ£ã§ããŸãã
squad->get_index(this) == u8(-1)
åã蚺æãã笊å·ãªã倿°ã®åé·æ¯èŒã«å¯ŸããŠæ©èœããŸãã
namespace ALife { typedef u64 _TIME_ID; } ALife::_TIME_ID CScriptActionCondition::m_tLifeTime; IC bool CScriptEntityAction::CheckIfTimeOver() { return((m_tActionCondition.m_tLifeTime >= 0) && ((m_tActionCondition.m_tStartTime + m_tActionCondition.m_tLifeTime) < Device.dwTimeGlobal)); }
PVS-Studioã® èŠå ïŒ
V547åŒ 'm_tActionCondition.m_tLifeTime> = 0'ã¯åžžã«trueã§ãã 笊å·ãªãã®åã®å€ã¯åžžã«> 0ã§ããscript_entity_action_inline.h 115
m_tLifeTime倿°ã¯ç¬Šå·ãªãã§ãããããåžžã«ãŒã以äžã§ãã ãããäžå¿
èŠãªãã§ãã¯ã§ããããããã«é ãããããžãã¯ã«ãšã©ãŒããããã©ãããéçºè
ã倿ããŠãã ããã
åæ§ã®èŠåïŒ
V547åŒ 'm_tActionCondition.m_tLifeTime <0'ã¯åžžã«falseã§ãã 笊å·ãªãã®åã®å€ã<0ã«ãªãããšã¯ãããŸããscript_entity_action_inline.h 143
ObjectFactory::ServerObjectBaseClass * CObjectItemScript::server_object (LPCSTR section) const { ObjectFactory::ServerObjectBaseClass *object = nullptr; try { object = m_server_creator(section); } catch(std::exception e) { Msg("Exception [%s] raised while creating server object from " "section [%s]", e.what(),section); return (0); } .... }
èŠåPVS-Studio ïŒ
V746ã¿ã€ãã®ã¹ã©ã€ã¹ã äŸå€ã¯ãå€ã§ã¯ãªãåç
§ã«ãã£ãŠãã£ããããå¿
èŠããããŸãã object_item_script.cpp 39
std :: exception :: whatïŒïŒé¢æ°ã¯ä»®æ³ã§ãããç¶æ¿ãããã¯ã©ã¹ã§ãªãŒããŒã©ã€ãã§ããŸãã ãã®äŸã§ã¯ãäŸå€ã¯å€ã«ãã£ãŠãã£ããããããããã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãã³ããŒãããããªã¢ãŒãã£ãã¯ã¿ã€ãã«é¢ãããã¹ãŠã®æ
å ±ã倱ãããŸãã ãã®å Žåã®
ïŒïŒã«ç®ãåããããšã¯ç¡æå³ã§ãã äŸå€ã¯ãªã³ã¯ããã£ããããããšã§ãïŒ
catch(const std::exception& e) {
ãã®ä»
void compute_cover_value (....) { .... float value [8]; .... if (value[0] < .999f) { value[0] = value[0]; } .... }
PVS-StudioèŠå ïŒ
V570 ãå€[0]ã倿°ã¯ããèªäœã«å²ãåœãŠãããŸãã compiler_cover.cpp 260
倿°
å€[0]ã¯ããèªäœã«å²ãåœãŠãããŸãã ãªããããäžæç¢ºãªã®ãã ãããã圌女ã¯å¥ã®äŸ¡å€ãäžããããŠããã¯ãã§ãã
void CActor::g_SetSprintAnimation(u32 mstate_rl, MotionID &head, MotionID &torso, MotionID &legs) { SActorSprintState& sprint = m_anims->m_sprint; bool jump = (mstate_rl&mcFall) || (mstate_rl&mcLanding) || (mstate_rl&mcLanding) || (mstate_rl&mcLanding2) || (mstate_rl&mcJump); .... }
PVS-StudioèŠå ïŒ
V501 ã||ãã®å·ŠåŽãšå³åŽã«åäžã®ãµãåŒãïŒmstate_rlïŒmcLandingïŒãããããŸã æŒç®åã actoranimation.cpp 290
æãå¯èœæ§ãé«ãã®ã¯ã
mstate_rlãšmcLandingã®è¿œå ãã§ãã¯ã ãã§ãããå€ãã®å Žåããã®ãããªèŠåã¯ããžãã¯ã®ãšã©ãŒãšæªæ€èšŒã®åæå€ãéç¥ããŸãã
åæ§ã®èŠåïŒ
- V501ã&&ãæŒç®åã®å·ŠåŽãšå³åŽã«ã¯ãåããµãåŒãHudItemDataïŒïŒãããããŸãã huditem.cpp 338
- V501ã||ãã®å·ŠåŽãšå³åŽã«åäžã®ãµãåŒãlist_idx == e_outfitãããããŸãã æŒç®åã uimptradewnd_misc.cpp 392
- V501ã||ãã®å·ŠåŽãšå³åŽã«åäžã®ãµãåŒãïŒD3DFMT_UNKNOWN == fTargetïŒãããããŸãã æŒç®åã hw.cpp 312
RELATION_REGISTRY::RELATION_MAP_SPOTS::RELATION_MAP_SPOTS() { .... spot_names[ALife::eRelationTypeWorstEnemy] = "enemy_location"; spot_names[ALife::eRelationTypeWorstEnemy] = "enemy_location"; .... }
PVS-StudioèŠå ïŒ
V519倿°ã«ã¯å€ãé£ç¶ããŠ2åå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ57ã58ãrelation_registry.cpp 58
ã¢ãã©ã€ã¶ãŒã¯ã2ã€ã®å€ãè¡ã®1ã€ã®å€æ°ã«å²ãåœãŠãããŠããããšãæ€åºããŸããã ãã®å Žåãããã¯åã«ãããã³ãŒãã§ãããåé€ããå¿
èŠãããããã«èŠããŸãã
void safe_verify(....) { .... printf("FATAL ERROR (%s): failed to verify data\n"); .... }
èŠåPVS-Studio ïŒ
V576圢åŒãæ£ãããã
ãŸãã ã ãprintfã颿°ã®åŒã³åºãäžã«ãç°ãªãæ°ã®å®åŒæ°ãäºæãããŸãã äºæ³ïŒ2.çŸåšïŒ1. entry_point.cpp 41
äžååãªæ°ã®åŒæ°ã
printf颿°ã«æž¡ãããŸããåœ¢åŒ 'ïŒ
s'ã¯ãæååãžã®ãã€ã³ã¿ãŒãæž¡ãå¿
èŠãããããšã瀺ããŸãã ãã®ãããªç¶æ³ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ãšã©ãŒãç·æ¥ããã°ã©ã ã®çµäºã«ã€ãªããå¯èœæ§ããããŸãã
ãããã«

X-Rayãšã³ãžã³ã®ãœãŒã¹ã³ãŒãã確èªãããšã倿°ã®äžå¿
èŠãªã³ãŒããŸãã¯çãããã³ãŒããšãæããã«èª€ã£ãå±éºãªç¬éãæããã«ãªããŸããã éçã¢ãã©ã€ã¶ãŒã¯ãéçºã®åææ®µéã§ãšã©ãŒãç¹å®ããã®ã«åœ¹ç«ã¡ãããã°ã©ããŒã®ç掻ã倧å¹
ã«ç°¡çŽ åããã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ãäœæããæéãè§£æŸããããšã«æ³šæããŠãã ããã
ãã®èšäºãè±èªåã®èŽè¡ãšå
±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒPavel Belikovã
X-Ray Engineã®ç°åžž ã