ãšã³ããªãŒ
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ã«çœ®ãæããå¿ èŠããããŸãã
/* process a single statement */ 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() { // swaps RGB for all pixels assert(IsDataValid()); assert(GetBytesPerPixel() == 4); UINT hxw = GetNumPixels(); for (UINT i = 0; i < hxw; i++) { DWORD col; GetPixel_ARGB8(&col, i); DWORD a = (col >> 24) && 0x000000FF; DWORD b = (col >> 16) && 0x000000FF; DWORD g = (col >> 8) && 0x000000FF; DWORD r = (col >> 0) && 0x000000FF; col = (a << 24) | (r << 16) | (g << 8) | b; SetPixel_ARGB8(i, col); } }
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 // DEBUG }
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; // 0=ready, 1=init, 2=building .... } void MODEL::build (Fvector* V, int Vcnt, TRI* T, int Tcnt, build_callback* bc, void* bcp) { .... BTHREAD_params P = { this, V, Vcnt, T, Tcnt, bc, bcp }; thread_spawn(build_thread,"CDB-construction",0,&P); while (S_INIT == status) Sleep(5); .... }
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ã®ç°åžž ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã