ãããªã²ãŒã æ¥çã§ãœãããŠã§ã¢ãéçºããŠããŠã補åã®å質ãæ¹åããããã«ä»ã«äœãã§ããã®ããéçºããã»ã¹ãç°¡çŽ åããããã«ãéçåæã䜿çšããªãã®ã§ã¯ãªãããšèããŠããå Žåã¯ãå§ããŸãããã çãïŒ ããŠãç§ã¯ããªãã«ãããçŽåŸãããããšããŸãã ãããªã²ãŒã æ¥çã®ããããããŒãç¯ããŠããééãã«æ³šç®ãããå Žåã¯ãåã³ãããªãã¯ãã®ã¢ãã¬ã¹ã«æ¥ãŸãã-æãèå³æ·±ããã®ãããªãã®ããã«ç¹å¥ã«éžã°ããŸããã
éç解æã䜿çšããçç±
ãããªã²ãŒã ã®éçºã«ã¯å€æ°ã®æ®µéãå«ãŸãããšããäºå®ã«ãããããããããã°ã©ãã³ã°ã¯äŸç¶ãšããŠäž»èŠãªæ®µéã®1ã€ã§ãã ããšãäœåè¡ãã®ã³ãŒããæžããªããŠããããŸããŸãªããŒã«ã䜿çšããå¿ èŠããããŸãããã®å質ã¯äœ¿ãããããšæçµçµæã«äŸåããŸãã ããªãããã®ãããªããŒã«ïŒããšãã°ãã²ãŒã ãšã³ãžã³ïŒã®éçºè ã§ããã°ããã¹ãŠããã§ã«æ確ã«ãªã£ãŠããã¯ãã§ãã
éç解æããœãããŠã§ã¢éçºå šè¬ã«åœ¹ç«ã€ã®ã¯ãªãã§ããïŒ
äž»ãªçç±ã¯ããã€ããããŸãã
- ä¿®æ£ãšã©ãŒã®ã³ã¹ããšè€éãã¯ãæéãšãšãã«å¢å ããŸãã éçåæã®äž»ãªå©ç¹ã®1ã€ã¯ãéçºã®åæ段éã§ã®ãšã©ãŒæ€åºã§ãïŒã³ãŒãã®äœææã«ãšã©ãŒãèŠã€ããããšãã§ããŸãïŒã ãããã£ãŠãéçã¢ãã©ã€ã¶ãŒã䜿çšãããšãé çã«ãªãåã«å€ãã®ãšã©ãŒãæ€åºããŠä¿®æ£ããããšã«ãããèªåãšååã®ç掻ãç°¡çŽ åã§ããŸãã
- éçåæã䜿çšãããšãããŸããŸãªãšã©ãŒãã¿ãŒã³ïŒã³ããŒããŒã¹ããã¿ã€ããã¹ãæ©èœã®èª€çšãªã©ïŒãç¹å®ã§ããŸãã
- ååãšããŠãéçåæã¯ãåçåæã§ã¯æ€åºããã«ããåé¡ãç¹å®ããã®ã«é©ããŠããŸãã ãã ããéããŸãçã§ãã
- ããŸããŸãªèŠåæå¶æ©èœïŒåäžããã¿ãŒã³å¥ãªã©ïŒãç¡é¢ä¿ãªèšºæã®ç¡å¹åãåæããã®ãã¡ã€ã«ãšãã£ã¬ã¯ããªã®ç¡å¹åã«ãããè² ã®äœ¿çšãã€ã³ãïŒããšãã°ã誀æ€åºïŒã¯éåžžãæ·±å»ãªéçã¢ãã©ã€ã¶ãŒã®éçºããŒã ã«ãã£ãŠãã¹ã ãŒãºåããããŸãã ããã«ãããã¢ãã©ã€ã¶ãŒãé©åã«æ§æããããšã§ãããã€ãºãã®å²åãå€§å¹ ã«æžããããšãã§ããŸãã ååã®Andrei Karpovã¯ã EFLã³ã¢ã©ã€ãã©ãªã®ãã§ãã¯ã«é¢ããèšäºã§ ãã¢ãã©ã€ã¶ãŒãæ§æãããŠããå Žåã誀æ€ç¥ã®æ°ã¯10ã15ïŒ ã«éããªãããšãå®èšŒããŸããã
ãšã«ãããããã¯ãã¹ãŠçè«ã§ãããããããããå®çšçãªäŸã«èå³ãããã§ãããã ããŠããããã以äžã«ç€ºããŸãã
Unreal Engineã®éç解æ
ãããŸã§èªãã ããšããããªããã¢ã³ãªã¢ã«ãšã³ãžã³ãšã¯äœãããšããã¯ã²ãŒã ãºãšã¯ã©ããªäŒç€Ÿãªã®ããäŒããŠã¯ãããŸããããããããã®äººãã¡ãããªãã®æš©éã楜ããã§ããªããªããããã䜿ã£ãŠããç§ã«æçŽãæžããŠãã ããã
PVS-StudioããŒã ã¯ãEpic GamesããŒã ãšæ°åååããUnreal Engineãããžã§ã¯ãã§éç解æãå®è£ ããã³äœ¿çšããã¢ãã©ã€ã¶ãŒã«ãã£ãŠæ€åºããããšã©ãŒ/誀æ€ç¥ãä¿®æ£ããã®ãæ¯æŽããŸããã åæ¹ã«ãšã£ãŠèå³æ·±ãããããŠæçãªçµéšã ã£ããšç¢ºä¿¡ããŠããŸãã
çµæã®1ã€ã¯ãUnreal Engineã«ç¹å¥ãªãã©ã°ãè¿œå ãããããšã§ãéç解æãUnreal Engineãããžã§ã¯ãã¢ã»ã³ããªã·ã¹ãã ã«ç°¡åã«çµ±åã§ããããã«ãªããŸããã
éµãšãªãã¢ã€ãã¢ã¯ã·ã³ãã«ã§ã-人ã ã¯ã³ãŒãã®å質ãæ°ã«ããããã«ç°ãªãã¢ãããŒãã䜿çšããŸãããã®1ã€ã¯éçåæã®å°å ¥ã§ããã
éç解æã«é¢ãããžã§ã³ã»ã«ãŒããã¯
ãããªã²ãŒã æ¥çã§æãæåãªéçºè ã®1人ã§ãããžã§ã³ã«ãŒããã¯ã¯ãããã°ã©ããŒãšããŠã®äž»ãªæ¥çžŸã®1ã€ãšããŠãéç解æææ³ã®ç©æ¥µçãªäœ¿çšããã€ãŠèªèããŠããŸãããåæã ãããªããç¥ã£ãŠãã誰ããéçåæã¯åå¿è ã®ããã®ããŒã«ã§ãããšæ¬¡åèšã£ããšãã圌ã«ãã®åŒçšãèŠããŠãã ããã ã«ãŒããã¯ã¯ã 察å¿ããèšäºã§éçåæã®ç¥èã説æããŸããããããèªãããšã匷ããå§ãããŸãïŒåæ©ãšäžè¬çãªéçºã®äž¡æ¹ã«ã€ããŠã
ã²ãŒã ããã³ã²ãŒã ãšã³ãžã³ã§éçåæã䜿çšããŠæ€åºããããšã©ãŒ
ãããããéçåæã®å©ç¹ã瀺ãæè¯ã®æ¹æ³ã®1ã€ã¯ããã®æ©èœãå®éã«ç€ºãããšã§ãã ããšãã°ãPVS-StudioããŒã ã¯ãããè¡ãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãããã§ãã¯ããŸãã
誰ã«ãšã£ãŠãã¡ãªããïŒ
- ãããžã§ã¯ãéçºè ã«ã¯ãšã©ãŒãéç¥ãããä¿®æ£ã§ããŸãã çæ³çã«ã¯ããã¡ãããã¢ãããŒãã¯ãã°/èšäºã«ãããšã©ãŒã®ä¿®æ£ãšã¯ç°ãªãã¹ãã§ãããããžã§ã¯ããèªåã§ãã§ãã¯ããçºè¡ãããèŠåã調ã¹ã䟡å€ããããŸãã ããã¯ãèšäºã®èè ããããžã§ã¯ãã«ãšã£ãŠéèŠã§ã¯ãªããšã©ãŒãèŠå€±ã£ãããæå³ããã«ãããã«çŠç¹ãåããããããå¯èœæ§ãããå Žåã«ã®ã¿éèŠã§ãã
- ã¢ãã©ã€ã¶ã®éçºè ã¯ãåæã®çµæã«åºã¥ããŠããŒã«ãæ¹åãããšã©ãŒãæ€åºããã¢ãã©ã€ã¶ã®æ©èœãå®èšŒããããšãã§ããŸãã
- èªè ã¯ãã©ã®ãšã©ãŒãã¿ãŒã³ãèš±å¯ãããŠãããã確èªããçµéšãç©ãã§ãéçåæã®æ¹æ³ãç解ããŸãã
äžè¬çã«-æå¹æ§ãšå©çã®èšŒæ ã§ã¯ãªããã®ã¯äœã§ããïŒ
éç解æããã§ã«äœ¿çšããŠããã³ãã³ã
誰ããéçºããã»ã¹ã«éçåæãå°å ¥ãããã©ãããèããŠããéãäžéšã®ããŒã ã¯ãã§ã«ããã䜿çšããŠãããå©çãåŸãŠããŸãïŒ ããšãã°ãRocksteadyãEpic GamesãZeniMax MediaãOculusãCodemastersãWargamingãªã©ïŒ ãœãŒã¹ ïŒã
ãããªã²ãŒã æ¥çã®ããã10ã³ãŒãã®ãã°
ããã¯ããçš®ã®ã¡ã¬ã°ããŒãã«ãªãããããã§ã¯ãªããã²ãŒã ãã²ãŒã ãšã³ãžã³ã§PVS-Studioã¢ãã©ã€ã¶ãŒã«ãã£ãŠæ€åºããããšã©ãŒã§ãããç§ã«ãšã£ãŠæãèå³æ·±ããšæãããããšãããã«èšåãã䟡å€ããããŸãã
ãã€ãã®ããã«ãèå³ãåŒãããã«ããŸãäžèšã®ã³ãŒããã©ã°ã¡ã³ãã®ãšã©ãŒãèªåã§èŠã€ããŠãããã¢ãã©ã€ã¶ãŒã®èŠåãšåé¡ã®èª¬æãèªãããšããå§ãããŸãã
10äœ
åºå žïŒ X-Ray Engineã®ç°åžžãæ¢ã
第10äœã¯ãSTALKERã²ãŒã ã§äœ¿çšãããŠããX-Ray Engineã²ãŒã ãšã³ãžã³ã®ãšã©ãŒã§ããã®ã·ãªãŒãºã®ã²ãŒã ããã¬ã€ãã人ã¯ãã²ãŒã ããã»ã¹äžã«çºçããå€ãã®é¢çœãïŒããã§ã¯ãªãïŒãã°ãèŠããŠããã§ãããã ããã¯ç¹ã«STALKERïŒClear Skyã«åœãŠã¯ãŸããŸããClearSkyã¯ãããããªãã§ã¯ãã¬ã€ã§ããŸããã§ããïŒç§ã¯ãã¹ãŠã®ã»ãŒããã殺ããããã°ãä»ã§ãèŠããŠããŸãïŒã ã²ãŒã ãšã³ãžã³ã®åæã瀺ããããã«ãã³ãŒãã«ã¯æ¬åœã«ãã°ããããå€ãã®ãã°ããããŸãã 以äžã¯ãã®1ã€ã§ãã
BOOL CActor::net_Spawn(CSE_Abstract* DC) { .... m_States.empty(); .... }
PVS-StudioèŠå ïŒ V530é¢æ° 'empty'ã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã
åé¡ã¯ç°¡åã§ã-è¿ãããbooleanã¡ãœããemptyã䜿çšãããã³ã³ããã空ãã©ããã瀺ããŸãã äžèšã®åŒã«ã¯ã¡ãœããåŒã³åºã以å€ã«äœãååšããªããšããäºå®ããå€æãããšãéçºè ã¯ã³ã³ãããŒãã¯ãªã¢ãããã£ãã®ã«ãclearã§ã¯ãªã空ã®ã¡ãœãããåŒã³åºããŠééãããšæ³å®ã§ããŸãã
ããã¯ãããã10ã«ãšã£ãŠã¯åçŽãããééãã ãšèª°ããèšããããããŸããã ããããããã¯åœŒå¥³ã®é åã§ãïŒ ãã®ãããåŽé¢ããèŠããšããšã©ãŒã¯éåžžã«åçŽã§æçœã§ããããã«èŠããŸããããã®ãããªãåçŽãªããšã©ãŒã¯ããŸããŸãªãããžã§ã¯ãã§çºçããïŒããã³æ€åºãããïŒããšã¯ãããŸããã
9äœ
åºå žïŒ åŸ æã®CryEngine Vãã¹ã
ã²ãŒã ãšã³ãžã³ã®ãšã©ãŒã®ãããã¯ãåŒãç¶ãæããã«ããŸãã 9äœã¯CryEngine Vã®ã³ãŒãã§ãããã®ãšã³ãžã³ã®ã²ãŒã ã§ã¯ãX-Rayãšã³ãžã³ã®ã²ãŒã ã»ã©å€ãã®ãã°ã«æ°ä»ããŸããã§ãããããåæ€ãã«ããããšã³ãžã³ã«å€ãã®äžå¯©ãªã³ãŒããã©ã°ã¡ã³ããå«ãŸããŠããããšãããããŸããã
void CCryDXGLDeviceContext:: OMGetBlendState(...., FLOAT BlendFactor[4], ....) { CCryDXGLBlendState::ToInterface(ppBlendState, m_spBlendState); if ((*ppBlendState) != NULL) (*ppBlendState)->AddRef(); BlendFactor[0] = m_auBlendFactor[0]; BlendFactor[1] = m_auBlendFactor[1]; BlendFactor[2] = m_auBlendFactor[2]; BlendFactor[2] = m_auBlendFactor[3]; *pSampleMask = m_uSampleMask; }
PVS-StudioèŠå ïŒ V519 ãBlendFactor [2]ãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã
ç§ãã¡ã®èšäºã§ç¹°ãè¿ãèšåãããŠããããã«ãã¿ã€ããã¹ããå ãã人ã¯ããŸããã å®éã«ã¯ãéç解æãã³ããŒïŒããŒã¹ãããã³ã¿ã€ããã¹ãæ€åºããåªããä»äºãããããšãç¹°ãè¿ã確èªãããŠããŸãã m_auBlendFactoré åããBlendFactorã«å€ãã³ããŒããŸãããã誀ã£ãŠããããå°å°ãã BlendFactorã 2åæžã蟌ã¿ãŸãã[2] ã ãã®æ··ä¹±ã®ããã m_auBlendFactor [3 ]ã®å€ã¯BlendFactor [2]ã«æžã蟌ãŸããå€ã¯BlendFactor [3]ã§å€æŽãããŸããã
8äœ
ãœãŒã¹ïŒ å®å®ã®ãŠãã³ãŒã³ïŒãã¹ããŒã¹ãšã³ãžãã¢ãã®ãœãŒã¹ã³ãŒãã®ç¢ºèª
ã³ãŒã¹ãå°ãå€æŽããC ++ããCïŒã«ç§»è¡ããŸãã ããã¯ãã¹ããŒã¹ãšã³ãžãã¢ãããžã§ã¯ãã®ã³ãŒãã§ããããã¯ãã¹ããŒã¹æ§é ã®æ§ç¯ãšç¶æã«é¢ãããµã³ãããã¯ã¹ã²ãŒã ã§ãã ç§èªèº«ã¯ã²ãŒã ããã¬ã€ããŸããã§ããããèšäºã®è§£èª¬è ã®äžäººãèšã£ãããã«ãã ç§ã¯çµæã«ããŸãé©ããŠããŸãã:) ãã ããŠãç§ã¯æ¬åœã«é¢çœããšã©ãŒãèŠã€ããããšãã§ããŸããã以äžã¯ãã®ãã¡ã®2ã€ã§ãã
public void Init(string cueName) { .... if (m_arcade.Hash == MyStringHash.NullOrEmpty && m_realistic.Hash == MyStringHash.NullOrEmpty) MySandboxGame.Log.WriteLine(string.Format( "Could not find any sound for '{0}'", cueName)); else { if (m_arcade.IsNull) string.Format( "Could not find arcade sound for '{0}'", cueName); if (m_realistic.IsNull) string.Format( "Could not find realistic sound for '{0}'", cueName); } }
PVS-Studioã®èŠå ïŒ
- V3010é¢æ° 'Format'ã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã
- V3010é¢æ° 'Format'ã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã
ã芧ã®ãšãããã¡ãœããã®æ»ãå€ãç¡èŠããéã®ãšã©ãŒã¯ãC ++ã³ãŒãã ãã§ãªããCïŒã§ãèŠã€ãããŸãã String.Formatã¡ãœããã¯ããã©ãŒãããæååãšãã©ãŒããããããªããžã§ã¯ãã«åºã¥ããŠçµæã®æååãæ§æããçµæãã¡ãœããã®æ»ãå€ãšããŠè¿ããŸãã äžèšã®ã³ãŒãã§ã¯ã elseãã©ã³ãã«string.Formatã® 2ã€ã®åŒã³åºãããããŸããããããã®æ»ãå€ã¯äœ¿çšãããŸããã ã»ãšãã©ã®å Žå ã MySandboxGame.Log.WriteLineã¡ãœããã䜿çšããifã¹ããŒãã¡ã³ãã®then-ãã©ã³ãã§è¡ãããæ¹æ³ãšåæ§ã«ããããã®ã¡ãã»ãŒãžãèªçŽããå¿ èŠããããŸããã
7äœ
åºå žïŒ Quake III Arena GPL Design Review
éçåæã¯ã¿ã€ããã¹ãããŸãæ€åºããããšãè¿°ã¹ãŸãããïŒ ä»¥äžã®äŸã¯ãããã®å¥ã®ç¢ºèªã§ãã
void Terrain_AddMovePoint(....) { .... x = ( v[ 0 ] - p->origin[ 0 ] ) / p->scale_x; y = ( v[ 1 ] - p->origin[ 1 ] ) / p->scale_x; .... }
PVS-StudioèŠå ïŒ V537 ãscale_xãã¢ã€ãã ã®äœ¿çšã®æ£ç¢ºãã確èªããããšãæ€èšããŠãã ããã
å€æ°xãšyã«æžã蟌ã¿ãŸãããäž¡æ¹ã®å²ãåœãŠã§åŒp-> scale_xãå€ãèšç®ããåŒã§äœ¿çšãããŸãã ããã¯éåžžã«çãããèŠãã2çªç®ã®ã±ãŒã¹ã§ã¯ãåŒp-> scale_xãp-> scale_yã«çœ®ãæããå¿ èŠãããããã§ã ã
6äœ
ãœãŒã¹ïŒ Unity CïŒãœãŒã¹ã³ãŒãã®ç¢ºèª
Unity Technologiesã¯æè¿ãç¬èªã®ã²ãŒã ãšã³ãžã³ã§ããUnityã®ãœãŒã¹ã³ãŒããå ¬éããŸããã ç§ãã¡ã¯ãã®ãããªã€ãã³ããéãæããããšãã§ãããåæäžã«å€ãã®èå³æ·±ãå ŽæãèŠã€ããŸããã 以äžã¯ãã®1ã€ã§ãã
public override bool IsValid() { .... return base.IsValid() && (pageSize >= 1 || pageSize <= 1000) && totalFilters <= 10; }
PVS-StudioèŠå ïŒ V3063è©äŸ¡ãããå Žåãæ¡ä»¶åŒã®äžéšã¯åžžã«trueã§ãïŒpageSize <= 1000ã
pageSizeã®ç¡å¹ãªç¯å²ãã§ãã¯ããããŸãã ã»ãšãã©ã®å Žåã pageSizeã®å€ã[1;ã®ç¯å²å ã«ããããšã確èªããäºå®ã§ããã 1000]ã ããããæ®å¿µãªã¿ã€ããã¹ãè¡ãããŸãããæŒç®å '&&'ã®ä»£ããã«ãããã°ã©ããŒã誀ã£ãŠ '||'ãæžããŸããã éšååŒã¯å®éã«ã¯äœããã§ãã¯ããŸããã
5äœ
ãœãŒã¹ïŒ Unity3DãªãŒãã³ã³ã³ããŒãã³ãã®ãšã©ãŒã®åæ
é£æ¥ããå Žæã«ã¯ãUnity3Dã³ã³ããŒãã³ãã®èå³æ·±ããã°ããããŸãã ãœãŒã¹èšäºã¯ãUnityãšã³ãžã³ã®ãœãŒã¹ã³ãŒããéããã1幎以äžåã«æžãããŸããã ããã§ããããã§ãé¢çœããã®ãèŠã€ããããšãã§ããŸããã
public static CrawledMemorySnapshot Unpack(....) { .... var result = new CrawledMemorySnapshot { .... staticFields = packedSnapshot.typeDescriptions .Where(t => t.staticFieldBytes != null & t.staticFieldBytes.Length > 0) .Select(t => UnpackStaticFields(t)) .ToArray() .... }; .... }
PVS-StudioèŠå ïŒ V3080 nullåç §è§£é€ã®å¯èœæ§ããããŸãã ãt.staticFieldBytesãã®æ€æ»ãæ€èšããŠãã ããã
Whereã¡ãœããã«åŒæ°ãšããŠæž¡ãããã©ã ãåŒã«æ³šç®ããŠãã ããã ã³ãŒãããå€æãããšã typeDescriptionsã³ã¬ã¯ã·ã§ã³ã«ã¯ã staticFieldBytesã¡ã³ããŒãnullã«ãªãå¯èœæ§ã®ããèŠçŽ ãå«ãŸããå ŽåããããŸã ã ãã®ããã Lengthããããã£ã«ã¢ã¯ã»ã¹ããåã«ã staticFieldBytesïŒ= Nullã確èªããŸãã æŒç®åã¯æ··ä¹±ããŠããã ãã§ãã&&ãã®ä»£ããã«ãïŒãã䜿çšãããŠããŸãã ããã¯ãå·Šã®åŒã®è©äŸ¡çµæïŒ true \ false ïŒã«é¢ä¿ãªããå³ã®åŒãè©äŸ¡ãããããšãæå³ããŸãããã®ããã staticFieldBytes == nullã®å Žåã Lengthããããã£ã«ã¢ã¯ã»ã¹ãããšãã«NullReferenceExceptionåã®äŸå€ãã¹ããŒãããŸãã ã&&ãã䜿çšããå Žåã staticFieldBytes == nullã®å ŽåãåŒã®å³åŽã¯è©äŸ¡ãããªãããããã®ãããªç¶æ³ã¯çºçããŸããã
Unityãããã10ã«2床ã©ã³ã¯ã€ã³ããå¯äžã®ãšã³ãžã³ã§ãããšããäºå®ã«ãããããããããã¯ããã¢ãçŽ æŽãããã²ãŒã ãäœæããã®ãæ¢ããŸããã å«ã-ããã°ããšã®æŠãã«ã€ããŠã
4äœ
ãœãŒã¹ïŒ Godotãšã³ãžã³ã®ãœãŒã¹ã³ãŒãåæ
æ¬ èœããŠããããŒã¯ãŒãã«é¢é£ããèå³æ·±ããšã©ãŒãããå ŽåããããŸãã äŸïŒäŸå€ãªããžã§ã¯ãã¯äœæãããŸãããéçºè ãthrowããŒã¯ãŒãã®æå®ãå¿ããŠããããããããªãæ¹æ³ã§ã䜿çšãããŸããã ãã®ãããªãšã©ãŒã¯ãCïŒãããžã§ã¯ãããã³C ++ãããžã§ã¯ãã§çºçã ãŸã ã æ¬ èœããŠããããŒã¯ãŒãã¯ãGodot Engineã²ãŒã ãšã³ãžã³ã§ãèŠã€ãããŸããã
Variant Variant::get(const Variant& p_index, bool *r_valid) const { .... if (ie.type == InputEvent::ACTION) { if (str =="action") { valid=true; return ie.action.action; } else if (str == "pressed") { valid=true; ie.action.pressed; } } .... }
PVS-Studioã® èŠå ïŒ V607ææè ãªãã®è¡šçŸãie.action.pressedãã
äžèšã®ã³ãŒãã¹ããããã§ã¯ã ie.typeãšstrã®å€ã«å¿ããŠã Variantåã®ç¹å®ã®å€ãè¿ãããããšãããã ãŸã ã äžåºŠã ãããªã¿ãŒã³åŒã¯æ£åžžã«èšè¿°ãããŸãã-return ie.action.action; ã returnã¹ããŒãã¡ã³ããå¿ãã2åç®ã®ãããç®çã®å€ã¯è¿ããããã¡ãœããã¯åŒãç¶ãå®è¡ãããŸãã
3äœ
ãœãŒã¹ïŒ PVS-StudioïŒDoom 3ã³ãŒãã®åæ
ããã§ããããã3ãã«å°éããŸããã ã¯ããŒã ãéããããšã¯ãDoom 3ã²ãŒã ã®ãœãŒã¹ã³ãŒãã®å°ããªæçã§ããäžã§è¿°ã¹ãããã«ããšã©ãŒã¯æšªããèŠããšåçŽã«èŠãããã®ãããªééããã©ã®ããã«è¡ãããæ確ã§ã¯ãªããšããäºå®ã¯ãäœãæå³ããŸãã-å®éã«ã¯ãã©ã®ã¿ã€ãã®ãšã©ãŒãçºçããªãã§ãããã...
void Sys_GetCurrentMemoryStatus( sysMemoryStats_t &stats ) { .... memset( &statex, sizeof( statex ), 0 ); .... }
PVS-StudioèŠå ïŒ V575 ãmemsetãé¢æ°ã¯ã0ãèŠçŽ ãåŠçããŸãã 3çªç®ã®åŒæ°ã調ã¹ãŸãã
åé¡ãããããç解ããã«ã¯ã memseté¢æ°ã®ã·ã°ããã£ãæãåºã䟡å€ããããŸãã
void* memset(void* dest, int ch, size_t count);
é¢æ°ã®ã·ã°ããã£ãšãã®åŒã³åºããæ¯èŒãããšãæåŸã®2ã€ã®åŒæ°ãæ··åãããŠããããšãããããŸãã ãã®çµæããªã»ãããå¿ èŠãªäžéšã®ã¡ã¢ãªãããã¯ã¯å€æŽãããŸããã
2äœ
2äœã¯ãXenkoã²ãŒã ãšã³ãžã³ã®CïŒã³ãŒãã§èŠã€ãã£ããšã©ãŒã§ãã
åºå žïŒ Xenkoã²ãŒã ãšã³ãžã³ã®ãšã©ãŒãæ¢ããŠããŸã
private static ImageDescription CreateDescription(TextureDimension dimension, int width, int height, int depth, ....) { .... } public static Image New3D(int width, int height, int depth, ....) { return new Image(CreateDescription(TextureDimension.Texture3D, width, width, depth, mipMapCount, format, 1), dataPointer, 0, null, false); }
PVS-StudioèŠå ïŒ V3065ãã©ã¡ãŒã¿ãŒ 'height'ã¯ã¡ãœããã®æ¬äœå ã§ã¯äœ¿çšãããŸããã
CreateDescriptionã¡ãœããã«åŒæ°ãæž¡ãããšã§ãšã©ãŒãçºçããŸããã ãã®ã·ã°ããã£ãèŠããšã2çªç®ã3çªç®ã4çªç®ã®ãã©ã¡ãŒã¿ãŒãããããwidth ã height ã depthãšåŒã°ããŠããããšãããããŸãã åŒã³åºããããšãåŒæ°width ã widthãããã³depthãæž¡ãããŸãã çãããïŒ ãã®ãããã¢ãã©ã€ã¶ãŒã¯ããã®å ŽæãèŠåãçºããã»ã©çããããšå€æããŸããã
äžäœ
åºå žïŒ åŸ æã®ã¢ã³ãªã¢ã«ãšã³ãžã³4æ€èšŒ
Unreal Engineã²ãŒã ãšã³ãžã³ããã®ä»æ¥ã®ãããã10ããšã©ãŒãèŠåºããŸãã ã 2017幎ã®C ++ãããžã§ã¯ãã®ããã10ãšã©ãŒ ãã®èšäºã®å Žåã®ããã«ã以äžã®ãšã©ãŒãèŠããšããæãèå³æ·±ããšã©ãŒã®ãªã¹ããå°ãã®ã¯ã ãããããã«ç解ããŸããã
bool VertInfluencedByActiveBone( FParticleEmitterInstance* Owner, USkeletalMeshComponent* InSkelMeshComponent, int32 InVertexIndex, int32* OutBoneIndex = NULL); void UParticleModuleLocationSkelVertSurface::Spawn(....) { .... int32 BoneIndex1, BoneIndex2, BoneIndex3; BoneIndex1 = BoneIndex2 = BoneIndex3 = INDEX_NONE; if(!VertInfluencedByActiveBone( Owner, SourceComponent, VertIndex[0], &BoneIndex1) && !VertInfluencedByActiveBone( Owner, SourceComponent, VertIndex[1], &BoneIndex2) && !VertInfluencedByActiveBone( Owner, SourceComponent, VertIndex[2]) &BoneIndex3) { .... }
PVS-StudioèŠå ïŒ V564 ãïŒãæŒç®åã¯ããŒã«åã®å€ã«é©çšãããŸãã æ¬åŒ§ãå«ããã®ãå¿ããŠããããã&&ãæŒç®åã䜿çšããããšãæå³ããŠããå¯èœæ§ããããŸãã
ã¢ãã©ã€ã¶ãŒã®èŠåãšäžèšã®ã³ãŒããæ¯èŒããŠããããã§ã&&ãã®ä»£ããã«ãïŒãã䜿çšããã®ã¯ã©ãã§ããïŒã ãã ãã VertInfluencedByActiveBoneé¢æ°ã®æåŸã®ãã©ã¡ãŒã¿ãŒã«ããã©ã«ãå€ãããã ifã¹ããŒãã¡ã³ãã®æ¡ä»¶åŒãç°¡çŽ åããããšã«æ³šæãæããšããã¹ãŠãããæ確ã«ãªããŸãã
if (!foo(....) && !foo(....) && !foo(....) & arg)
æåŸã®éšååŒã«ç¹ã«æ³šæããŠãã ããã
!VertInfluencedByActiveBone(Owner, SourceComponent, VertIndex[2]) &BoneIndex3
ããã©ã«ãå€ãæã€ãã©ã¡ãŒã¿ãŒã¯ããªãã¯ãæŒããŸãã-ããã©ã«ãå€ããªãå Žåããã®ã³ãŒãã¯ã³ã³ãã€ã«ãããŸããã ããããããã§ããããããã¹ãŠãæ£åžžã«ã³ã³ãã€ã«ããããšã©ãŒãåæ§ã«æ£åžžã«ãã¹ã¯ãããŸãã ããã¯çãããå Žæã§ãããã¢ãã©ã€ã¶ãŒã¯æ°ä»ããŸãã-äžçœ®æŒç® 'ïŒ'ãå·Šãªãã©ã³ãã¯boolåã§ãå³ãªãã©ã³ãã¯int32ã§ãã
ãããã«
éç解æãã²ãŒã ãã²ãŒã ãšã³ãžã³ã®éçºã«åœ¹ç«ã€ããšããããŠã³ãŒãïŒããã³çµæãšããŠæçµè£œåïŒã®å質ãæ¹åãããšãã質åã«å¯Ÿãããã1ã€ã®çãã§ããããšã瀺ãããšãã§ãããšæããŸãã ãããªã²ãŒã æ¥çã§éçºããŠããå Žåã¯ãéçåæã«ã€ããŠååã«äŒãããã®èšäºã衚瀺ããã ãã§ãã ã©ãããå§ããã¹ããèããŠããŸããïŒ PVS-Studioããå§ããŸãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒã»ã«ã²ã€ãŽã¡ã·ãªãšãã ãããªã²ãŒã éçºã®éçåæïŒãœãããŠã§ã¢ãã°ã®ããã10
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãåéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã