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ã€ã§ããããã§ãã
- GCCïŒ ãšã©ãŒ ïŒ
- ClangïŒ ãšã©ãŒ ã ãšã©ãŒ ã ãšã©ãŒ ïŒ
- ValgrindïŒ ãšã©ãŒ ïŒ
- GDBïŒ ãšã©ãŒ ïŒ
- FreeBSDïŒ ãšã©ãŒ ã ãšã©ãŒ ïŒ
- ãªã©ãªã© ã
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 // if (DataLen == 0)
{
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 , , ..
.