Unreal Engineãããžã§ã¯ãã¯éçºäžã§ã-æ°ããã³ãŒãã远å ããããã§ã«èšè¿°ãããŠãããã®ã倿ŽãããŸãã ãããžã§ã¯ãã®éçºã®é¿ããããªãçµæã¯ãã§ããã ãæ©ãæ€åºããããšãæãŸããæ°ãããšã©ãŒã®ã³ãŒãã«çŸããããšã§ãã ãšã©ãŒãæžãã1ã€ã®æ¹æ³ã¯ãPVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããããšã§ãã ããã«ãã¢ãã©ã€ã¶ãŒãæ¥éã«éçºãããŠãããæ°ãããšã©ãŒãã¿ãŒã³ãèŠã€ããããšãåŠãã§ããŸãããã®ããã€ãã¯ãã®èšäºã§èª¬æããŸãã ãããžã§ã¯ãã®ã³ãŒãã®å質ã«é¢å¿ãããå Žåã¯ããã®èšäºã圹ç«ã¡ãŸãã
ãã®åºçç©ã¯Andrey Karpovã«ãã£ãŠäœæãããã³ãŒãäŸã¯PVS-StudioããŒã ã®Ilya IvanovãšSergey Vasilievã«ãã£ãŠæäŸãããŸããã å
ã®ãœãŒã¹ã¯ããUnreal Engine ã®éçºããã»ã¹ã®äžéšãšããŠã®éçè§£æ ããšããUnreal Engineããã°ã§ããéçã³ãŒãåæãçè«
éçã³ãŒãåæã¯ãããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®ãšã©ãŒã𿬠ç¹ãèå¥ããããã»ã¹ã§ãã éçåæã¯ãèªååãããã³ãŒãã¬ãã¥ãŒããã»ã¹ãšèŠãªãããšãã§ããŸãã ã³ãŒãã¬ãã¥ãŒã«ã€ããŠããå°ã詳ããèŠãŠãããŸãããã
ã³ãŒãã¬ãã¥ãŒã¯ãæãå€ããæãæçšãªæ¬ 饿€åºæ¹æ³ã®1ã€ã§ãã ãœãŒã¹ã³ãŒããæ³šææ·±ãèªã¿ããããæ¹åããããã®æšå¥šäºé
ãäœæããããšããæããŸãã ã³ãŒãã®èªã¿åãäžã«ãå°æ¥ãšã©ãŒã«ãªãå¯èœæ§ã®ãããšã©ãŒãŸãã¯ã³ãŒãã®ã»ã¯ã·ã§ã³ãæããã«ãªããŸãã ãŸããã¬ãã¥ãŒäžã®ã³ãŒãã®äœæè
ã¯ãããã°ã©ã ã®ãã®éšåãŸãã¯ãã®éšåãã©ã®ããã«æ©èœãããã«ã€ããŠèª¬æãã¹ãã§ã¯ãªããšèããããŠããŸãã ã¢ã«ãŽãªãºã ã¯ãããã°ã©ã ã®ããã¹ããšã³ã¡ã³ãããçŽæ¥çè§£ããå¿
èŠããããŸãã ãã®æ¡ä»¶ãæºããããªãå Žåãã³ãŒãã宿ãããå¿
èŠããããŸãã
ååãšããŠãããã°ã©ãã¯ä»ã®èª°ãã®ã³ãŒãã®ãšã©ãŒãã¯ããã«ç°¡åã«èªèãããããã³ãŒãã®ã¬ãã¥ãŒã¯ããŸãæ©èœããŸãã ã³ãŒãã¬ãã¥ãŒææ³ã®è©³çްã«ã€ããŠã¯ãSteve McConnellã®åªããæžç±ãPerfect CodeãïŒSteve McConnellããCode CompleteãïŒãåç
§ããŠãã ããã
ã³ãŒãã¬ãã¥ãŒã®æ¹æ³ã«ã¯ã2ã€ã®æ¬ ç¹ããããŸãã
- éåžžã«é«ãäŸ¡æ Œã æ°ããã³ãŒãã確èªããããæšå¥šäºé
ãäœæããåŸã«ã³ãŒããå確èªãããããããã«ãã¡ã€ã³ã®äœæ¥ããè€æ°ã®ããã°ã©ããŒã宿çã«ãããå¿
èŠããããŸãã ãã®å Žåãããã°ã©ãã¯ãªã©ãã¯ã¹ããããã«å®æçã«äŒæ©ãåãå¿
èŠããããŸãã ã³ãŒãã®å€§ããªãã©ã°ã¡ã³ããäžåºŠã«èŠãããšãããšã泚æãããã«éããªããã³ãŒããã¬ãã¥ãŒããå©ç¹ãããã«æ¶ããŠããŸããŸãã
- 人ã
ã¯ãæ°ãã/倿Žãããã³ãŒãã«çŽæ¥é¢ä¿ããªããšã©ãŒãæ€åºããã®ãé£ãããšæããŸãã æžã蟌ãŸããã°ããã®ãã©ã°ã¡ã³ããèæ
®ãããšã stdlib.hããããŒãã¡ã€ã«ãæ¥ç¶ãããŠããªãããã malloc颿°ããã®äžã§æ£ããåäœããªããšä»®å®ããããšã¯å°é£ã§ãã ãã®ç¶æ³ã«ã€ããŠã¯ãèšäºã Cèšèªã®çŸãã64ããããšã©ãŒ ãã§è©³ãã説æããŠããŸãã å¥ã®äŸïŒããããŒãã¡ã€ã«å
ã®é¢æ°ãŸãã¯å€æ°ã®ã¿ã€ãã倿ŽããŸãã çè«çã«ã¯ããã®ãããªå€æŽã®åŸããã®é¢æ°ãŸãã¯å€æ°ã䜿çšããããã¹ãŠã®ã³ãŒãã調ã¹ãå¿
èŠããããŸãã å®éã«ã¯ãããã¯éåžžã«æéãããããååãšããŠãã¬ãã¥ãŒã¯ããã°ã©ããŒãäœãã倿Žããå Žæã«ã®ã¿å¶éãããŸãã
äžæ¹ã§ã¯ã宿çã«ã³ãŒããã¬ãã¥ãŒããããšæããŸãã äžæ¹ãé«ãããŸãã ãã¬ãŒããªãã¯éçã³ãŒãåæããŒã«ã§ãã ããã°ã©ã ã®ãœãŒã¹ã³ãŒããåŠçããã³ãŒãã®ç¹å®ã®ã»ã¯ã·ã§ã³ã«æ³šç®ãéããããã«ããã°ã©ããŒã«æšå¥šããŸãã åæã«ãã¢ãã©ã€ã¶ãŒã¯ç²ãããããããŒãã¡ã€ã«ã®ç·šéã®åœ±é¿ãåãããã¹ãŠã®ã³ãŒãããã§ãã¯ããŸãã ãã¡ãããããã°ã©ã ã¯ãããã°ã©ããŒã®ããŒã ã«ãã£ãŠå®è¡ãããã³ãŒãã®å®å
šãªã¬ãã¥ãŒã«ä»£ãããã®ã§ã¯ãããŸããã ãã ããå©ç/äŸ¡æ Œæ¯ã«ãããéçåæã®äœ¿çšã¯å€ãã®äŒæ¥ã«ãšã£ãŠéåžžã«æçšãªãã©ã¯ãã£ã¹ã«ãªããŸãã
ä»ã®ãšã©ãŒæ€åºæ¹æ³è«ãšåæ§ã«ãéçåæã«ã¯é·æãšçæããããŸãã ããã°ã©ã ããã¹ãããããã®å®ç§ãªæ¹æ³ã¯ãããŸããã æé©ãªçµæã¯ãåªããã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ãéçã³ãŒãåæãåçã³ãŒãåæãåäœãã¹ããååž°ãã¹ããªã©ãããŸããŸãªã¢ãããŒãã®çµã¿åããã䜿çšããŠååŸã§ããŸãã
éçåæã®éèŠãªå©ç¹ã¯ãã³ãŒãã«è¡šç€ºãããçŽåŸã«å€ãã®ãšã©ãŒãæ€åºã§ããããšã§ããã€ãŸãããšã©ãŒãä¿®æ£ããããšã¯éåžžã«å®äŸ¡ã§ãã
å®éããšã©ãŒãæ©æã«æ€åºãããã»ã©ãä¿®æ£ã®ã³ã¹ããäœããªããŸãã ãããã£ãŠãMcConnellã®èæžãPerfect Codeãã«èšèŒãããŠããããŒã¿ã«ãããšããã¹ã段éã§ã®ãšã©ãŒä¿®æ£ã¯ãã³ãŒãã£ã³ã°ïŒã³ãŒãã®èšè¿°ïŒæ®µéã§ã®10åã®è²»çšãããããŸãã
衚1.æ¬ é¥ã®æ€åºæéã«å¿ããæ¬ é¥ä¿®æ£ã®å¹³åã³ã¹ãïŒè¡šã®ããŒã¿ã¯S. McConnellã®ãPerfect Codeãã«ããæ¬ããåãããŠããŸãïŒãéçåæããŒã«ã䜿çšãããšãã³ãŒãã®äœææ®µéã«åºæã®å€æ°ã®ãšã©ãŒãç¹å®ã§ããããããããžã§ã¯ãå
šäœã®éçºã³ã¹ãã倧å¹
ã«åæžã§ããŸãã
éçã¢ãã©ã€ã¶ãŒã䜿çšããããšã®éèŠæ§ã¯ãæéãšãšãã«å¢å€§ããŸãã ããã¯ãææ°ã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããµã€ãºãåŸã
ã«å¢å ããŠããããã§ãã ããã°ã©ã ã¯ãã倧ãããããé£ãããªã£ãŠããŸãã ããã«ãã³ãŒãã®ãšã©ãŒå¯åºŠã¯ããã®ãµã€ãºã«éç·åœ¢ã«äŸåããŸãã
ãããžã§ã¯ãã倧ããã»ã©ãå«ãŸããã³ãŒãã®1000è¡ãããã®ãšã©ãŒãå€ããªããŸãã ãã®è峿·±ã衚ãã芧ãã ããã
衚2.ãããžã§ã¯ãã®ãµã€ãºãšäžè¬çãªãšã©ãŒå¯åºŠã ããŒã¿ãœãŒã¹ïŒãããã°ã©ã ã®å質ãšããã°ã©ãã®çç£æ§ãïŒJonesã1977ïŒãããœãããŠã§ã¢ã³ã¹ãã®èŠç©ãããïŒJonesã1998ïŒãããŒã¿ãèªèããããããããã«ãã°ã©ããäœæããŸãã
ãã£ãŒã1.ãããžã§ã¯ãã®å
žåçãªãšã©ãŒå¯åºŠã éã¯æå€§éã§ãã èµ€ã¯å¹³åé¡ã§ãã ç·ãäžçªå°ãªããã°ã©ãããããããžã§ã¯ãã®æé·ã«äŒŽããããã°ã©ãã¯ãããžã§ã¯ãã®å¿
èŠãªå質ãç¶æã§ããææ®µããŸããŸã䜿çšããå¿
èŠã«è¿«ãããŠããããšãããããŸãã é«å質ã®ã³ãŒããäœæããããã«åãããšãè¡ãããšã¯ã§ããŸãããããã¯ãããšãã°8幎åã«è¡ãããŸããã ããã¯ããŒã ã«ãšã£ãŠäžå¿«ãªçºèŠã«ãªãå¯èœæ§ããããŸãã圌ãã¯ãã€ãã®ããã«ã³ãŒããæžããŠããããã§ãå質ã®ç¶æ³ã¯æªåããŠããŸãã
æ°ããæ¹æ³è«ãšããŒã«ãç¿åŸããå¿
èŠããããŸãããããªããã°ããããžã§ã¯ãã®æé·ã«äŒŽããå€ãæè¡ã§ã¯ååã§ã¯ãªããªããŸãã ãããŠã䜿çšãã¹ãéåžžã«æçšãªææ³ã®1ã€ã¯ã調æ»ããéçã³ãŒãåæã§ãã
èªè
ãéçã³ãŒãåæã®æ¹æ³è«ã«ãŸã 粟éããŠããªãå Žåã¯ããªããšãèå³ãæã£ãŠããã ããã°å¹žãã§ãã 圌女ãšã®ãã詳现ãªç¥ãåãã®ããã«ãããã€ãã®ãªã³ã¯ãæäŸããŸãïŒ
- ãžã§ã³ã»ã«ãŒããã¯ã éçã³ãŒãåæ ã
- ãŠã£ãããã£ã¢ éçã³ãŒãåæ ã
- ãŠã£ãããã£ã¢ éçã³ãŒãåæã®ããã®ããŒã«ã®ãªã¹ã ã
- ã¢ã«ã»ããã·ãŒãã±ã³ã»ãããã¯ããã³ã»ã·ã§ã«ããã¢ã³ãã£ã»ãã§ãŠããã©ã€ã¢ã³ã»ãã«ãã³ãã»ã¹ã»ãã¬ã ããã£ãŒã«ãºã»ã¢ã³ãªã»ã°ãã¹ãã¢ã·ã£ã»ã«ã ã¹ããŒãã¹ã³ããã»ãã¯ããŒã¯ãããŒãœã³ã»ãšã³ã°ã©ãŒã æ°ååè¡ã®ã³ãŒããåŸã§ïŒéçåæã䜿çšããŠå®äžçã®ãã°ãèŠã€ããŸãã
- ãšã«ããªãŒãã»ãããããã éçã³ãŒãåæã«é¢ãããããªã®éžæ ã
- PVS-StudioããŒã ã®ããã° ã
çè«ããå®è·µãžãšç§»è¡ããéçè§£æãã¢ã³ãªã¢ã«ãšã³ãžã³ã²ãŒã ãšã³ãžã³ã®ãããªãããžã§ã¯ãã«ã©ã®ããã«åœ¹ç«ã€ããèŠãŠã¿ãŸãããã
ã¢ã³ãªã¢ã«ãšã³ãžã³
ç§ãã¡ã®ããŒã ã¯ãUnreal Engineã³ãŒãã§äœæ¥ã§ããããšãåã³å
æ ã«æããŸãïŒ
ãã§ã«2幎åã«ãããè¡ããŸããããé廿°å¹Žéãã³ãŒãã®ç·šéãšæ¹åã«é¢ããäœæ¥ãèç©ãããŠããŸããã 2幎éã®äŒæ©ã®åŸããã®ãããªãããžã§ã¯ãã®ã³ãŒãããŒã¹ãèŠããšãåžžã«äŸ¿å©ã§è峿·±ããã®ã§ãã ããã«ã¯ããã€ãã®çç±ããããŸãã
ãŸã第äžã«ãã¢ãã©ã€ã¶ãŒã®èª€æ€ç¥ã調ã¹ãããšã«èå³ããããŸãã ããŒã«ã§äœããä¿®æ£ã§ããŸããããã«ãããäžèŠãªã¡ãã»ãŒãžã®æ°ãæžããŸãã 誀æ€ç¥ãšã®éãã¯ãã³ãŒãã¢ãã©ã€ã¶ãŒã®éçºè
ã«ãšã£ãŠç¶ç¶çãªã¿ã¹ã¯ã§ãã ãã®ãããã¯ã«èå³ããã人ã¯ãèšäºã
éçã¢ãã©ã€ã¶ãŒãåœéœæ§ãšæŠãæ¹æ³ãšçç± ããèªãããšãææ¡ããŸãã
2幎éãUnreal Engineã®ã³ãŒãããŒã¹ã¯å€§ããå€åããŸããã ããã€ãã®æçãæ¶ããããã€ãã远å ãããŸããã å Žåã«ãã£ãŠã¯ãã©ã«ãå
šäœãã ãããã£ãŠãã³ãŒãã®ãã¹ãŠã®éšåã«ååãªæ³šæãæãããããã§ã¯ãããŸãããã€ãŸããPVS-Studioã«ãäœæ¥ããããŸãã
ã³ãŒãã®å質ã«å€å€§ãªæ³šæãæããPVS-Studioãªã©ã®ããŒã«ã䜿çšããŠããEpic Gamesãç§°è³ããããšæããŸãã ãã¡ãããèªè
ã¯ã«ãã«ãç¬ãããšãã§ããŸããããã¡ãããããªãã®ããŒã ã¯Epic Gamesãç§°è³ãã¹ãã§ããããã¯ããªãã®ã¯ã©ã€ã¢ã³ãã ããã§ããã Epic Gamesã®éçºè
ã«é¢ããè¯å®çãªãã£ãŒãããã¯ãæ®ãåæ©ããããŸãã ããããç§ã¯äŒç€Ÿãå¿ããè³è³ããŸããã éçã³ãŒãåæããŒã«ã䜿çšãããŠãããšããäºå®ã¯ããããžã§ã¯ãéçºãµã€ã¯ã«ã®æç床ãšãã³ãŒãã®ä¿¡é Œæ§ãšã»ãã¥ãªãã£ã«å¯ŸããäŒç€Ÿã®æžå¿µã瀺ããŠããŸãã
PVS-Studioã䜿çšãããšã³ãŒãã®å質ã倧å¹
ã«åäžãããšç¢ºä¿¡ããŠããã®ã¯ãªãã§ããïŒ æ¬¡ã®ãããªãããžã§ã¯ãã§ããšã©ãŒãç°¡åã«æ€åºã§ããæã匷åãªéçã¢ãã©ã€ã¶ãŒã®1ã€ã§ããããã§ãã
PVS-Studioã䜿çšãããšãã³ãŒãã1ã¹ããã远å ãããŸãã Epic Gamesã¯ããããžã§ã¯ãã§Unreal Engineã䜿çšãããã¹ãŠã®äººã®é¢åãèŠãŠãããŸãã ä¿®æ£ããããã¹ããšã«ã誰ãã®é çã軜æžãããŸãã
è峿·±ããã°
Unreal Engineã§çºèŠããŠä¿®æ£ãããã¹ãŠã®ãšã©ãŒã«ã€ããŠã¯èª¬æããŸããããæ³šç®ã«å€ããããã€ãã®ãšã©ãŒã®ã¿ã匷調ããŸãã èå³ã®ããæ¹ã¯ãGitHubã®
ãã«ãªã¯ãšã¹ããèŠãŠãä»ã®ãšã©ãŒã«æ
£ããããšãã§ããŸãã ãœãŒã¹ã³ãŒããšæå®ããããã«ãªã¯ãšã¹ãã«ã¢ã¯ã»ã¹ããã«ã¯ãGitHubã®Unreal Engineãªããžããªã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãGitHubã¢ã«ãŠã³ããšEpicGamesã¢ã«ãŠã³ããå¿
èŠ
ã§ã ããããã®ã¢ã«ãŠã³ãã¯unrealengine.comã«ãªã³ã¯ããå¿
èŠããããŸãã ãã®åŸãGitHubã®
Epic Gamesã³ãã¥ããã£ã«åå ããããã®æåŸ
ãåãå
¥ããå¿
èŠããããŸãã
æç€ºPVS-Studioã¢ãã©ã€ã¶ãŒã®éçºã¯ãæ°ãã蚺æã®åºçŸã ãã§ãªããæ¢åã®èšºæã®æ¹åã«ãé¢é£ããŠããŸãã ããšãã°ã倿°ã®å¯èœãªå€ãèšç®ããã¢ã«ãŽãªãºã ãæ¹åãããŠããŸãã ããã«ãããçŽ1幎åã«ãã¢ãã©ã€ã¶ãŒã¯ãã®çš®ã®ãšã©ãŒãæ€åºãå§ããŸããã
uint8* Data = (uint8*)PointerVal;
if (Data != nullptr || DataLen == 0)
{
NUTDebug::LogHexDump(Data, DataLen);
}
else if (Data == nullptr)
{
Ar.Logf(TEXT("Invalid Data parameter."));
}
else
{
Ar.Logf(TEXT("Invalid DataLen parameter."));
}
PVS-Studio: V547 Expression 'Data == nullptr' is always true. unittestmanager.cpp 1924
(Data != nullptr || DataLen == 0) , ,
Data nullptr. ,
(Data == nullptr) .
:
if (Data != nullptr && DataLen > 0)
V547 2010 . , .
DataLen, , . , , .
PVS-Studio, . , «», .. .
«», , C++. C++11, C++14 . , . V714, range-based . Unreal Engine V714 :
for (TSharedPtr<SWidget> SlateWidget : SlateWidgets)
{
SlateWidget = nullptr;
}
PVS-Studio: V714 Variable is not passed into foreach loop by a reference, but its value is changed inside of the loop. vreditorradialfloatingui.cpp 170
nullptr SlateWidgets. ,
SlateWidget â , . .
, :
for (TSharedPtr<SWidget> &SlateWidget : SlateWidgets)
{
SlateWidget = nullptr;
}
, , , . , V767 2015 ,
Unreal Engine. PVS-Studio 6.07 (8 2016). :
for(int i = 0; i < SelectedObjects.Num(); ++i)
{
UObject* Obj = SelectedObjects[0].Get();
EdObj = Cast<UEditorSkeletonNotifyObj>(Obj);
if(EdObj)
{
break;
}
}
PVS-Studio: V767 Suspicious access to element of 'SelectedObjects' array by a constant index inside a loop. skeletonnotifydetails.cpp 38
,
UEditorSkeletonNotifyObj. -
i 0.
:
UObject* Obj = SelectedObjects[i].Get();
V763, , V767, PVS-Studio 6.07. , , ,
RunTest:
bool FCreateBPTemplateProjectAutomationTests::RunTest(
const FString& Parameters)
{
TSharedPtr<SNewProjectWizard> NewProjectWizard;
NewProjectWizard = SNew(SNewProjectWizard);
TMap<FName, TArray<TSharedPtr<FTemplateItem>> >& Templates =
NewProjectWizard->FindTemplateProjects();
int32 OutMatchedProjectsDesk = 0;
int32 OutCreatedProjectsDesk = 0;
GameProjectAutomationUtils::CreateProjectSet(Templates,
EHardwareClass::Desktop,
EGraphicsPreset::Maximum,
EContentSourceCategory::BlueprintFeature,
false,
OutMatchedProjectsDesk,
OutCreatedProjectsDesk);
int32 OutMatchedProjectsMob = 0;
int32 OutCreatedProjectsMob = 0;
GameProjectAutomationUtils::CreateProjectSet(Templates,
EHardwareClass::Mobile,
EGraphicsPreset::Maximum,
EContentSourceCategory::BlueprintFeature,
false,
OutMatchedProjectsMob,
OutCreatedProjectsMob);
return ( OutMatchedProjectsDesk == OutCreatedProjectsDesk ) &&
( OutMatchedProjectsMob == OutCreatedProjectsMob );
}
:
- CreateProjectSet OutMatchedProjectsDesk OutCreatedProjectsDesk.
- CreateProjectSet OutMatchedProjectsMob OutCreatedProjectsMob.
, :
return ( OutMatchedProjectsDesk == OutCreatedProjectsDesk ) &&
( OutMatchedProjectsMob == OutCreatedProjectsMob );
, . , ,
CreateProjectSet , , .
CreateProjectSet:
static void CreateProjectSet(.... int32 OutCreatedProjects,
int32 OutMatchedProjects)
{
....
OutCreatedProjects = 0;
OutMatchedProjects = 0;
....
OutMatchedProjects++;
....
OutCreatedProjects++;
....
}
PVS-Studio :
- V763 Parameter 'OutCreatedProjects' is always rewritten in function body before being used. gameprojectautomationtests.cpp 88
- V763 Parameter 'OutMatchedProjects' is always rewritten in function body before being used. gameprojectautomationtests.cpp 89
, ,
OutCreatedProjects OutMatchedProjects ,
0.
: .
:
static void CreateProjectSet(.... int32 &OutCreatedProjects,
int32 &OutMatchedProjects)
, - . . ,
break:
{
case EWidgetBlendMode::Opaque:
ActualBackgroundColor.A = 1.0f;
case EWidgetBlendMode::Masked:
ActualBackgroundColor.A = 0.0f;
}
:
checkf(GPixelFormats[PixelFormat].BlockSizeX
== GPixelFormats[PixelFormat].BlockSizeY
== GPixelFormats[PixelFormat].BlockSizeZ
== 1,
TEXT("Tried to use compressed format?"));
- C++ , ,
V709.
, PVS-Studio. , ?
, . .
{
case EWidgetBlendMode::Opaque:
ActualBackgroundColor.A = 1.0f;
case EWidgetBlendMode::Masked:
ActualBackgroundColor.A = 0.0f;
}
. , , .
: - ?
PVS-Studio , , , . , PVS-Studio. .
, , , , , .
, , , , ., . , , , . , , , .
, . , , , â .
. "
' '" (
en). :
( , , )?, 90% « »., . 100 50 50 â . . , , , , « »., . â . «/ » . , â .
, .
. .. , , . , , . , //. : "
â ".
: . , :
- « »;
- , ;
- ( , );
- ;
- ;
- , ;
- , TDD;
- .
. - , - . â - , . .
Unreal Engine , PVS-Studio, , .
PVS-Studio . PVS-Studio ,
, ...