PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืื—ื“ ื”ืชืจื—ื™ืฉื™ื ื”ืขื“ื›ื ื™ื™ื ื‘ื™ื•ืชืจ ืœืฉื™ืžื•ืฉ ื‘ื ืชื— PVS-Studio ื”ื•ื ื”ืฉื™ืœื•ื‘ ืฉืœื• ืขื ืžืขืจื›ื•ืช CI. ื•ืœืžืจื•ืช ืฉื ื™ืชืŸ ืœื‘ื ื•ืช ืืช ื”ื ื™ืชื•ื— ืฉืœ ืคืจื•ื™ืงื˜ PVS-Studio ื›ืžืขื˜ ืžื›ืœ ืžืขืจื›ืช ืื™ื ื˜ื’ืจืฆื™ื” ืจืฆื™ืคื” ื‘ื›ืžื” ืคืงื•ื“ื•ืช ื‘ืœื‘ื“, ืื ื• ืžืžืฉื™ื›ื™ื ืœื”ืคื•ืš ืืช ื”ืชื”ืœื™ืš ื”ื–ื” ืœื ื•ื— ืขื•ื“ ื™ื•ืชืจ. ืœ-PVS-Studio ื™ืฉ ื›ืขืช ืชืžื™ื›ื” ื‘ื”ืžืจืช ืคืœื˜ ืžื ืชื— ืœืคื•ืจืžื˜ ืขื‘ื•ืจ TeamCity - TeamCity Inspections Type. ื‘ื•ื ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“.

ืžื™ื“ืข ืขืœ ื”ืชื•ื›ื ื” ืฉื‘ื” ื ืขืฉื” ืฉื™ืžื•ืฉ

ืกื˜ื•ื“ื™ื• PVS - ืžื ืชื— ืกื˜ื˜ื™ ืฉืœ ืงื•ื“ C, C++, C# ื•-Java, ืฉื ื•ืขื“ ืœื”ืงืœ ืขืœ ื”ืžืฉื™ืžื” ืฉืœ ืžืฆื™ืืช ื•ืชื™ืงื•ืŸ ืกื•ื’ื™ื ืฉื•ื ื™ื ืฉืœ ืฉื’ื™ืื•ืช. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื ืชื— ื‘-Windows, Linux ื•-macOS. ื‘ืžืืžืจ ื–ื” ื ืฉืชืžืฉ ื‘ืื•ืคืŸ ืคืขื™ืœ ืœื ืจืง ื‘ื ืชื— ืขืฆืžื•, ืืœื ื’ื ื‘ื›ืžื” ื›ืœื™ ืขื–ืจ ืžื”ืคืฆืชื•.

CLMonitor - ื”ื•ื ืฉืจืช ื ื™ื˜ื•ืจ ื”ืžื ื˜ืจ ื”ืฉืงื•ืช ืžื”ื“ืจ. ื™ืฉ ืœื”ืคืขื™ืœ ืื•ืชื• ืžื™ื“ ืœืคื ื™ ืฉืžืชื—ื™ืœื™ื ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ืฉืœืš. ื‘ืžืฆื‘ ื—ื˜ื˜ื ื•ืช, ื”ืฉืจืช ื™ื™ืจื˜ ืจื™ืฆื•ืช ืฉืœ ื›ืœ ื”ืžื”ื“ืจื™ื ื”ื ืชืžื›ื™ื. ืจืื•ื™ ืœืฆื™ื™ืŸ ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื›ืœื™ ื–ื” ืจืง ืœื ื™ืชื•ื— ืคืจื•ื™ืงื˜ื™ื ืฉืœ C/C++.

PlogConverter - ื›ืœื™ ืขื–ืจ ืœื”ืžืจืช ื“ื•ื—ื•ืช ืžื ืชื— ืœืคื•ืจืžื˜ื™ื ืฉื•ื ื™ื.

ืžื™ื“ืข ืขืœ ื”ืคืจื•ื™ืงื˜ ื”ื ื‘ื“ืง

ื‘ื•ืื• ื ื ืกื” ืืช ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื–ื• ืขืœ ื“ื•ื’ืžื” ืžืขืฉื™ืช - ื‘ื•ืื• ื ื ืชื— ืืช ืคืจื•ื™ืงื˜ OpenRCT2.

OpenRCT2 - ื™ื™ืฉื•ื ืคืชื•ื— ืฉืœ ื”ืžืฉื—ืง RollerCoaster Tycoon 2 (RCT2), ืžืจื—ื™ื‘ ืื•ืชื• ืขื ืคื•ื ืงืฆื™ื•ืช ื—ื“ืฉื•ืช ื•ืชื™ืงื•ืŸ ื‘ืื’ื™ื. ื”ืžืฉื—ืง ืกื•ื‘ื‘ ืกื‘ื™ื‘ ื‘ื ื™ื™ื” ื•ืชื—ื–ื•ืงื” ืฉืœ ืคืืจืง ืฉืขืฉื•ืขื™ื ื”ืžื›ื™ืœ ืžืชืงื ื™ื, ื—ื ื•ื™ื•ืช ื•ืžืชืงื ื™ื. ื”ืฉื—ืงืŸ ื—ื™ื™ื‘ ืœื ืกื•ืช ืœื”ืจื•ื•ื™ื— ื•ืœืฉืžื•ืจ ืขืœ ื”ืžื•ื ื™ื˜ื™ืŸ ื”ื˜ื•ื‘ ืฉืœ ื”ืคืืจืง ืชื•ืš ืฉืžื™ืจื” ืขืœ ื”ืื•ืจื—ื™ื ืžืจื•ืฆื™ื. OpenRCT2 ืžืืคืฉืจ ืœืš ืœืฉื—ืง ื’ื ื‘ืชืจื—ื™ืฉ ื•ื’ื ื‘ืืจื’ื– ื—ื•ืœ. ืชืจื—ื™ืฉื™ื ื“ื•ืจืฉื™ื ืžื”ืฉื—ืงืŸ ืœื”ืฉืœื™ื ืžืฉื™ืžื” ืกืคืฆื™ืคื™ืช ืชื•ืš ื–ืžืŸ ืžื•ื’ื“ืจ, ื‘ืขื•ื“ ืฉ-Sandbox ืžืืคืฉืจ ืœืฉื—ืงืŸ ืœื‘ื ื•ืช ืคืืจืง ื’ืžื™ืฉ ื™ื•ืชืจ ืœืœื ื”ื’ื‘ืœื•ืช ืื• ื›ืกืคื™ื.

ื”ืชืืžื”

ื›ื“ื™ ืœื—ืกื•ืš ื–ืžืŸ, ืื ื™ ื›ื ืจืื” ืื•ื•ืชืจ ืขืœ ืชื”ืœื™ืš ื”ื”ืชืงื ื” ื•ืืชื—ื™ืœ ืžื”ืจื’ืข ืฉื‘ื• ืฉืจืช TeamCity ืคื•ืขืœ ื‘ืžื—ืฉื‘ ืฉืœื™. ืขืœื™ื ื• ืœืขื‘ื•ืจ ืืœ: localhost:{port ืฉืฆื•ื™ืŸ ื‘ืžื”ืœืš ืชื”ืœื™ืš ื”ื”ืชืงื ื”} (ื‘ืžืงืจื” ืฉืœื™, localhost:9090) ื•ืœื”ื–ื™ืŸ ื ืชื•ื ื™ ื”ืจืฉืื”. ืœืื—ืจ ื”ื›ื ื™ืกื” ื™ืงื‘ืœื• ืืช ืคื ื™ื ื•:

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืœื—ืฅ ืขืœ ื›ืคืชื•ืจ ืฆื•ืจ ืคืจื•ื™ื™ืงื˜. ืœืื—ืจ ืžื›ืŸ, ื‘ื—ืจ ื‘ืื•ืคืŸ ื™ื“ื ื™ ื•ืžืœื ืืช ื”ืฉื“ื•ืช.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืœืื—ืจ ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ืฆื•ืจ, ืืช ืคื ื™ื ื• ืžืงื‘ืœ ื—ืœื•ืŸ ืขื ื”ื’ื“ืจื•ืช.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ื‘ื•ื ื ืงืœื™ืง ืฆื•ืจ ืชืฆื•ืจืช ื‘ื ื™ื™ื”.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืžืœื ืืช ื”ืฉื“ื•ืช ื•ืœื—ืฅ ืฆื•ืจ. ืื ื• ืจื•ืื™ื ื—ืœื•ืŸ ื”ืžื‘ืงืฉ ืžืžืš ืœื‘ื—ื•ืจ ืžืขืจื›ืช ื‘ืงืจืช ื’ืจืกืื•ืช. ืžื›ื™ื•ื•ืŸ ืฉื”ืžืงื•ืจื•ืช ื›ื‘ืจ ืžืžื•ืงืžื™ื ืžืงื•ืžื™ืช, ืœื—ืฅ ืœื“ืœื’.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืœื‘ืกื•ืฃ, ื ืขื‘ื•ืจ ืœื”ื’ื“ืจื•ืช ื”ืคืจื•ื™ืงื˜.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ื‘ื•ืื• ื ื•ืกื™ืฃ ืฉืœื‘ื™ ื”ืจื›ื‘ื”, ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช ืœื—ืฅ: ืฉืœื‘ื™ ื‘ื ื™ื™ื” -> ื”ื•ืกืฃ ืฉืœื‘ ื‘ื ื™ื™ื”.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ื›ืืŸ ืื ื• ื‘ื•ื—ืจื™ื:

  • ืกื•ื’ ืจืฅ -> ืฉื•ืจืช ืคืงื•ื“ื”
  • ื”ืคืขืœื” -> ืกืงืจื™ืคื˜ ืžื•ืชืื ืื™ืฉื™ืช

ืžื›ื™ื•ื•ืŸ ืฉืื ื• ื ื‘ืฆืข ื ื™ืชื•ื— ื‘ืžื”ืœืš ื”ื™ื“ื•ืจ ื”ืคืจื•ื™ืงื˜, ื”ื”ืจื›ื‘ื” ื•ื”ื ื™ืชื•ื— ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ืฉืœื‘ ืื—ื“, ืื– ืžืœืื• ืืช ื”ืฉื“ื” ืกืงืจื™ืคื˜ ืžื•ืชืื ืื™ืฉื™ืช:

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ื ื‘ื—ืŸ ืฆืขื“ื™ื ื‘ื•ื“ื“ื™ื ื‘ื”ืžืฉืš. ื—ืฉื•ื‘ ืฉื˜ืขื™ื ืช ื”ื ืชื—, ื”ืจื›ื‘ืช ื”ืคืจื•ื™ืงื˜, ื ื™ืชื•ื—ื•, ื”ืคืœื˜ ืฉืœ ื”ื“ื•ื— ื•ืขื™ืฆื•ื‘ื• ื™ื™ืงื— ืจืง ืื—ืช ืขืฉืจื” ืฉื•ืจื•ืช ืงื•ื“.

ื”ื“ื‘ืจ ื”ืื—ืจื•ืŸ ืฉืขืœื™ื ื• ืœืขืฉื•ืช ื”ื•ื ืœื”ื’ื“ื™ืจ ืืช ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื”, ืฉืชื™ืืจืชื™ ื›ืžื” ื“ืจื›ื™ื ืœืฉื™ืคื•ืจ ื”ืงืจื™ืื•ืช ืฉืœื”ื. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ื‘ื•ืื• ื ืžืฉื™ืš: ืคืจืžื˜ืจื™ื -> ื”ื•ืกืฃ ืคืจืžื˜ืจ ื—ื“ืฉ ื•ืœื”ื•ืกื™ืฃ ืฉืœื•ืฉื” ืžืฉืชื ื™ื:

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ื›ืœ ืฉืขืœื™ื›ื ืœืขืฉื•ืช ื”ื•ื ืœืœื—ื•ืฅ ืขืœ ื”ื›ืคืชื•ืจ ื”ืคืขืœื” ื‘ืคื™ื ื” ื”ื™ืžื ื™ืช ื”ืขืœื™ื•ื ื”. ื‘ื–ืžืŸ ื”ื”ืจื›ื‘ื” ื•ื”ื ื™ืชื•ื— ืฉืœ ื”ืคืจื•ื™ืงื˜, ืืกืคืจ ืœื›ื ืขืœ ื”ืชืกืจื™ื˜.

ืชืกืจื™ื˜ ื™ืฉื™ืจ

ืจืืฉื™ืช, ืขืœื™ื ื• ืœื”ื•ืจื™ื“ ืืช ื”ื”ืคืฆื” ื”ืขื“ื›ื ื™ืช ื‘ื™ื•ืชืจ ืฉืœ PVS-Studio. ืœืฉื ื›ืš ืื ื• ืžืฉืชืžืฉื™ื ื‘ืžื ื”ืœ ื—ื‘ื™ืœื•ืช ื”ืฉื•ืงื•ืœื“. ืœืžื™ ืฉืจื•ืฆื” ืœื“ืขืช ื™ื•ืชืจ ืขืœ ื–ื”, ื™ืฉ ื”ื•ื“ืขื” ืžืงื‘ื™ืœื” ืžืืžืจ:

choco install pvs-studio -y

ืœืื—ืจ ืžื›ืŸ, ื”ื‘ื” ื ืฉื™ืง ืืช ื›ืœื™ ื”ืžืขืงื‘ ืœื‘ื ื™ื™ืช ืคืจื•ื™ืงื˜ CLMonitor.

%CLmon% monitor โ€“-attach

ืœืื—ืจ ืžื›ืŸ ื ื‘ื ื” ืืช ื”ืคืจื•ื™ืงื˜ ื›ืžืฉืชื ื” ืกื‘ื™ื‘ืชื™ MSB ื”ื•ื ื”ื ืชื™ื‘ ืœื’ืจืกื” ืฉืœ MSBuild ืฉืื ื™ ืฆืจื™ืš ืœื‘ื ื•ืช

%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable

ื”ื‘ื” ื ื–ื™ืŸ ืืช ื”ื›ื ื™ืกื” ื•ืžืคืชื— ื”ืจื™ืฉื™ื•ืŸ ืขื‘ื•ืจ PVS-Studio:

%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%

ืœืื—ืจ ื”ืฉืœืžืช ื”ื‘ื ื™ื™ื”, ื”ืคืขืœ ืฉื•ื‘ ืืช CLMonitor ื›ื“ื™ ืœื™ืฆื•ืจ ืงื‘ืฆื™ื ืžืขื•ื‘ื“ื™ื ืžืจืืฉ ื•ื ื™ืชื•ื— ืกื˜ื˜ื™:

%CLmon% analyze -l "c:ptest.plog"

ืื– ื ืฉืชืžืฉ ื‘ื›ืœื™ ืฉื™ืจื•ืช ืื—ืจ ืžื”ื”ืคืฆื” ืฉืœื ื•. PlogConverter ืžืžื™ืจ ื“ื•ื— ืžืคื•ืจืžื˜ ืกื˜ื ื“ืจื˜ื™ ืœืคื•ืจืžื˜ ืกืคืฆื™ืคื™ ืœ-TeamCity. ื”ื•ื“ื•ืช ืœื›ืš, ื ื•ื›ืœ ืœืฆืคื•ืช ื‘ื• ื™ืฉื™ืจื•ืช ื‘ื—ืœื•ืŸ ื”ื‘ื ื™ื™ื”.

%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"

ื”ืฉืœื‘ ื”ืื—ืจื•ืŸ ื”ื•ื ืœื”ืฆื™ื’ ืืช ื”ื“ื•ื— ื”ืžืขื•ืฆื‘ ื‘ stdout, ืฉื ื”ื•ื ื™ื™ืงืœื˜ ืขืœ ื™ื“ื™ ืžื ืชื— TeamCity.

type "C:tempptest.plog_TeamCity.txt"

ืงื•ื“ ืกืงืจื™ืคื˜ ืžืœื:

choco install pvs-studio -y
%CLmon% monitor --attach
set platform=x64
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
%CLmon% analyze -l "c:ptest.plog"
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
type "C:tempptest.plog_TeamCity.txt"

ื‘ื™ื ืชื™ื™ื ื”ื”ืจื›ื‘ื” ื•ื”ื ื™ืชื•ื— ืฉืœ ื”ืคืจื•ื™ืงื˜ ื”ืกืชื™ื™ืžื• ื‘ื”ืฆืœื—ื”, ื ื•ื›ืœ ืœืขื‘ื•ืจ ืœืœืฉื•ื ื™ืช ืคืจื•ื™ืงื˜ื™ื ื•ืœื•ื•ื“ื ืืช ื–ื”.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืขื›ืฉื™ื• ื‘ื•ืื• ื ืœื—ืฅ ืขืœ ื‘ื“ื™ืงื•ืช ืกืš ื”ื›ืœื›ื“ื™ ืœืขื‘ื•ืจ ืœืฆืคื™ื™ื” ื‘ื“ื•ื— ื”ื ืชื—:

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืื–ื”ืจื•ืช ืžืงื•ื‘ืฆื•ืช ืœืคื™ ืžืกืคืจื™ ื›ืœืœ ืื‘ื—ื•ืŸ. ื›ื“ื™ ืœื ื•ื•ื˜ ื‘ืงื•ื“, ืขืœื™ืš ืœืœื—ื•ืฅ ืขืœ ืžืกืคืจ ื”ืฉื•ืจื” ืขื ื”ืื–ื”ืจื”. ืœื—ื™ืฆื” ืขืœ ืกื™ืžืŸ ื”ืฉืืœื” ื‘ืคื™ื ื” ื”ื™ืžื ื™ืช ื”ืขืœื™ื•ื ื” ืชืคืชื— ืœืš ืœืฉื•ื ื™ืช ื—ื“ืฉื” ืขื ืชื™ืขื•ื“. ืืชื” ื™ื›ื•ืœ ื’ื ืœื ื•ื•ื˜ ื‘ืงื•ื“ ืขืœ ื™ื“ื™ ืœื—ื™ืฆื” ืขืœ ืžืกืคืจ ื”ืฉื•ืจื” ืขื ืื–ื”ืจืช ื”ื ืชื—. ื ื™ื•ื•ื˜ ืžืžื—ืฉื‘ ืžืจื•ื—ืง ืืคืฉืจื™ ื‘ืขืช ื”ืฉื™ืžื•ืฉ SourceTreeRoot ืกึทืžึธืŸ. ื›ืœ ืžื™ ืฉืžืขื•ื ื™ื™ืŸ ื‘ืžืฆื‘ ืคืขื•ืœื” ื–ื” ืฉืœ ื”ื ืชื— ื™ื›ื•ืœ ืœื”ื›ื™ืจ ืืช ื”ืกืขื™ืฃ ื”ืžืงื‘ื™ืœ ืชื™ืขื•ื“.

ืฆืคื™ื™ื” ื‘ืชื•ืฆืื•ืช ื”ื ืชื—

ื›ืขืช, ืœืื—ืจ ืฉืกื™ื™ืžื ื• ืœืคืจื•ืก ื•ืœื”ื’ื“ื™ืจ ืืช ื”-build, ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื›ืžื” ืื–ื”ืจื•ืช ืžืขื ื™ื™ื ื•ืช ืฉื ืžืฆืื• ื‘ืคืจื•ื™ืงื˜ ืฉืื ื• ื‘ื•ื—ื ื™ื.

ืื–ื”ืจื” N1

V773 [CWE-401] ื”ื—ืจื™ื’ ื ื–ืจืง ืžื‘ืœื™ ืœืฉื—ืจืจ ืืช ืžืฆื‘ื™ืข ื”'ืชื•ืฆืื”'. ืชื™ืชื›ืŸ ื“ืœื™ืคืช ื–ื™ื›ืจื•ืŸ. libopenrct2 ObjectFactory.cpp 443

Object* CreateObjectFromJson(....)
{
  Object* result = nullptr;
  ....
  result = CreateObject(entry);
  ....
  if (readContext.WasError())
  {
    throw std::runtime_error("Object has errors");
  }
  ....
}

Object* CreateObject(const rct_object_entry& entry)
{
  Object* result;
  switch (entry.GetType())
  {
    case OBJECT_TYPE_RIDE:
      result = new RideObject(entry);
      break;
    case OBJECT_TYPE_SMALL_SCENERY:
      result = new SmallSceneryObject(entry);
      break;
    case OBJECT_TYPE_LARGE_SCENERY:
      result = new LargeSceneryObject(entry);
      break;
    ....
    default:
      throw std::runtime_error("Invalid object type");
  }
  return result;
}

ื”ืžื ืชื— ื”ื‘ื—ื™ืŸ ื‘ืฉื’ื™ืื” ืฉืœืื—ืจ ื”ืงืฆืื” ื“ื™ื ืžื™ืช ืฉืœ ื–ื™ื›ืจื•ืŸ ืคื ื™ืžื” CreateObject, ื›ืืฉืจ ืžืชืจื—ืฉ ื—ืจื™ื’, ื”ื–ื™ื›ืจื•ืŸ ืื™ื ื• ืžื ื•ืงื” ื•ืžืชืจื—ืฉืช ื“ืœื™ืคืช ื–ื™ื›ืจื•ืŸ.

ืื–ื”ืจื” N2

V501 ื™ืฉ ืชืชื™-ื‘ื™ื˜ื•ื™ื™ื ื–ื”ื™ื '(1ULL << WIDX_MONTH_BOX)' ืžืฉืžืืœ ื•ืžื™ืžื™ืŸ ืœ-'|' ืžึทืคืขึดื™ืœ. libopenrct2ui Cheats.cpp 487

static uint64_t window_cheats_page_enabled_widgets[] = 
{
  MAIN_CHEAT_ENABLED_WIDGETS |
  (1ULL << WIDX_NO_MONEY) |
  (1ULL << WIDX_ADD_SET_MONEY_GROUP) |
  (1ULL << WIDX_MONEY_SPINNER) |
  (1ULL << WIDX_MONEY_SPINNER_INCREMENT) |
  (1ULL << WIDX_MONEY_SPINNER_DECREMENT) |
  (1ULL << WIDX_ADD_MONEY) |
  (1ULL << WIDX_SET_MONEY) |
  (1ULL << WIDX_CLEAR_LOAN) |
  (1ULL << WIDX_DATE_SET) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_MONTH_UP) |
  (1ULL << WIDX_MONTH_DOWN) |
  (1ULL << WIDX_YEAR_BOX) |
  (1ULL << WIDX_YEAR_UP) |
  (1ULL << WIDX_YEAR_DOWN) |
  (1ULL << WIDX_DAY_BOX) |
  (1ULL << WIDX_DAY_UP) |
  (1ULL << WIDX_DAY_DOWN) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_DATE_GROUP) |
  (1ULL << WIDX_DATE_RESET),
  ....
};

ืžืขื˜ ืื ืฉื™ื ืžืœื‘ื“ ืžื ืชื— ืกื˜ื˜ื™ ื™ื›ืœื• ืœืขื‘ื•ืจ ืืช ืžื‘ื—ืŸ ื”ืงืฉื‘ ื”ื–ื”. ื“ื•ื’ืžื” ื–ื• ืฉืœ ื”ืขืชืง-ื”ื“ื‘ืง ื˜ื•ื‘ื” ื‘ื“ื™ื•ืง ืžื”ืกื™ื‘ื” ื”ื–ื•.

ืื–ื”ืจื•ืช N3

V703 ื–ื” ืžื•ื–ืจ ืฉืฉื“ื” 'ื“ื’ืœื™ื' ื‘ืžื—ืœืงื” ื”ื ื’ื–ืจืช 'RCT12BannerElement' ืžื—ืœื™ืฃ ืืช ื”ืฉื“ื” ื‘ืžื—ืœืงื” ื”ื‘ืกื™ืกื™ืช 'RCT12TileElementBase'. ืงื•ื•ื™ ื‘ื“ื™ืงื”: RCT12.h:570, RCT12.h:259. libopenrct2 RCT12.h 570

struct RCT12SpriteBase
{
  ....
  uint8_t flags;
  ....
};
struct rct1_peep : RCT12SpriteBase
{
  ....
  uint8_t flags;
  ....
};

ื›ืžื•ื‘ืŸ ืฉืฉื™ืžื•ืฉ ื‘ืžืฉืชื ื” ื‘ืขืœ ืื•ืชื• ืฉื ื‘ืžื—ืœืงื” ื”ื‘ืกื™ืกื™ืช ื•ื‘ืฆืืฆื ืื™ื ื• ืชืžื™ื“ ืฉื’ื™ืื”. ืขื ื–ืืช, ื˜ื›ื ื•ืœื•ื’ื™ื™ืช ื”ื”ื•ืจืฉื” ืขืฆืžื” ืžื ื™ื—ื” ืฉื›ืœ ื”ืชื—ื•ืžื™ื ืฉืœ ื›ื™ืชืช ื”ืื‘ ื ืžืฆืื™ื ื‘ื›ื™ืชืช ื”ื™ืœื“. ืขืœ ื™ื“ื™ ื”ื›ืจื–ื” ืขืœ ืฉื“ื•ืช ืขื ืื•ืชื• ืฉื ื‘ื™ื•ืจืฉ, ืื ื• ืžืฆื™ื’ื™ื ื‘ืœื‘ื•ืœ.

ืื–ื”ืจื” N4

V793 ื–ื” ืžื•ื–ืจ ืฉื”ืชื•ืฆืื” ืฉืœ ื”ื”ืฆื”ืจื” 'imageDirection / 8' ื”ื™ื ื—ืœืง ืžื”ืชื ืื™. ืื•ืœื™ ืฆืจื™ืš ื”ื™ื” ืœื”ืฉื•ื•ืช ืืช ื”ื”ืฆื”ืจื” ื”ื–ื• ืœืžืฉื”ื• ืื—ืจ. libopenrct2 ObservationTower.cpp 38

void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
  if ((imageDirection / 8) && (imageDirection / 8) != 3)
  {
    ....
  }
  ....
}

ื‘ื•ืื• ื ืกืชื›ืœ ืžืงืจื•ื‘. ื‘ื™ื˜ื•ื™ imageDirection/8 ื™ื”ื™ื” ืฉืงืจ ืื imageDirection ื”ื•ื ื‘ื˜ื•ื•ื— ืฉื‘ื™ืŸ -7 ืœ-7. ื—ืœืง ืฉื ื™: (imageDirection / 8) != 3 ืฆ'ืงื™ื imageDirection ืœื”ื™ื•ืช ืžื—ื•ืฅ ืœื˜ื•ื•ื—: ืž-31 ืขื“ -24 ื•ืž-24 ืขื“ 31, ื‘ื”ืชืืžื”. ื–ื” ื ืจืื” ืœื™ ื“ื™ ืžื•ื–ืจ ืœื‘ื“ื•ืง ืžืกืคืจื™ื ืœื”ื›ืœืœื” ื‘ื˜ื•ื•ื— ืžืกื•ื™ื ื‘ื“ืจืš ื–ื•, ื•ื’ื ืื ืื™ืŸ ืฉื’ื™ืื” ื‘ืงื˜ืข ื”ืงื•ื“ ื”ื–ื”, ื”ื™ื™ืชื™ ืžืžืœื™ืฅ ืœืฉื›ืชื‘ ืืช ื”ืชื ืื™ื ื”ืืœื” ื›ื“ื™ ืœื”ื™ื•ืช ืžืคื•ืจืฉื™ื ื™ื•ืชืจ. ื–ื” ื™ืขืฉื” ืืช ื”ื—ื™ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืงืœื™ื ืขื‘ื•ืจ ื”ืื ืฉื™ื ืฉื™ืงืจืื• ื•ืชื—ื–ืงื• ืืช ื”ืงื•ื“ ื”ื–ื”.

ืื–ื”ืจื” N5

V587 ืจืฆืฃ ืžื•ื–ืจ ืฉืœ ืžื˜ืœื•ืช ืžืกื•ื’ ื–ื”: A = B; B = A;. ืงื•ื•ื™ ื‘ื“ื™ืงื”: 1115, 1118. libopenrct2ui MouseInput.cpp 1118

void process_mouse_over(....)
{
  ....
  switch (window->widgets[widgetId].type)
  {
    case WWT_VIEWPORT:
      ebx = 0;
      edi = cursorId;                                 // <=
      // Window event WE_UNKNOWN_0E was called here,
      // but no windows actually implemented a handler and
      // it's not known what it was for
      cursorId = edi;                                 // <=
      if ((ebx & 0xFF) != 0)
      {
        set_cursor(cursorId);
        return;
      }
      break;
      ....
  }
  ....
}

ืงื˜ืข ืงื•ื“ ื–ื” ื”ื•ืฉื’ ื›ื›ืœ ื”ื ืจืื” ืขืœ ื™ื“ื™ ื“ื”-ืงื•ืžืคื™ืœืฆื™ื”. ืœืื—ืจ ืžื›ืŸ, ืื ืœืฉืคื•ื˜ ืœืคื™ ื”ื”ืขืจื” ืฉื ืฉืืจื”, ื—ืœืง ืžื”ืงื•ื“ ืฉืื™ื ื• ืขื•ื‘ื“ ื”ื•ืกืจ. ืขื ื–ืืช, ื ื•ืชืจื• ืขื•ื“ ื›ืžื” ื ื™ืชื•ื—ื™ื cursorId, ืฉื’ื ื–ื” ืœื ื”ื’ื™ื•ื ื™ ื‘ืžื™ื•ื—ื“.

ืื–ื”ืจื” N6

V1004 [CWE-476] ื”ืžืฆื‘ื™ืข 'ืฉื—ืงืŸ' ื”ื™ื” ื‘ืฉื™ืžื•ืฉ ืœื ื‘ื˜ื•ื— ืœืื—ืจ ืฉื”ื•ื ืื•ืžืช ื›ื ื’ื“ nullptr. ืงื•ื•ื™ ื‘ื“ื™ืงื”: 2085, 2094. libopenrct2 Network.cpp 2094

void Network::ProcessPlayerList()
{
  ....
  auto* player = GetPlayerByID(pendingPlayer.Id);
  if (player == nullptr)
  {
    // Add new player.
    player = AddPlayer("", "");
    if (player)                                          // <=
    {
      *player = pendingPlayer;
       if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
       {
         _serverConnection->Player = player;
       }
    }
    newPlayers.push_back(player->Id);                    // <=
  }
  ....
}

ื“ื™ ืงืœ ืœืชืงืŸ ืืช ื”ืงื•ื“ ื”ื–ื”; ืืชื” ืจืง ืฆืจื™ืš ืœื‘ื“ื•ืง ืื•ืชื• ืคืขื ืฉืœื™ืฉื™ืช ืฉื—ืงืŸ ืœืžืฆื‘ื™ืข ืจื™ืง, ืื• ื”ื•ืกืฃ ืื•ืชื• ืœื’ื•ืฃ ื”ื”ืฆื”ืจื” ื”ืžื•ืชื ื™ืช. ื”ื™ื™ืชื™ ืžืฆื™ืข ืืช ื”ืืคืฉืจื•ืช ื”ืฉื ื™ื™ื”:

void Network::ProcessPlayerList()
{
  ....
  auto* player = GetPlayerByID(pendingPlayer.Id);
  if (player == nullptr)
  {
    // Add new player.
    player = AddPlayer("", "");
    if (player)
    {
      *player = pendingPlayer;
      if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
      {
        _serverConnection->Player = player;
      }
      newPlayers.push_back(player->Id);
    }
  }
  ....
}

ืื–ื”ืจื” N7

V547 [CWE-570] ื”ื‘ื™ื˜ื•ื™ 'name == nullptr' ื”ื•ื ืชืžื™ื“ ืฉืงืจ. libopenrct2 ServerList.cpp 102

std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
  auto name = json_object_get(server, "name");
  .....
  if (name == nullptr || version == nullptr)
  {
    ....
  }
  else
  {
    ....
    entry.name = (name == nullptr ? "" : json_string_value(name));
    ....
  }
  ....
}

ืืชื” ื™ื›ื•ืœ ืœื”ื™ืคื˜ืจ ืžืฉื•ืจืช ืงื•ื“ ืงืฉื” ืœืงืจื™ืื” ื‘ืžื›ื” ืื—ืช ื•ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื‘ื‘ื“ื™ืงืช nullptr. ืื ื™ ืžืฆื™ืข ืœืฉื ื•ืช ืืช ื”ืงื•ื“ ื‘ืื•ืคืŸ ื”ื‘ื:

std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
  auto name = json_object_get(server, "name");
  .....
  if (name == nullptr || version == nullptr)
  {
    name = ""
    ....
  }
  else
  {
    ....
    entry.name = json_string_value(name);
    ....
  }
  ....
}

ืื–ื”ืจื” N8

V1048 [CWE-1164] ืœืžืฉืชื ื” 'ColumnHeaderPressedCurrentState' ื”ื•ืงืฆื” ืื•ืชื• ืขืจืš. libopenrct2ui CustomListView.cpp 510

void CustomListView::MouseUp(....)
{
  ....
  if (!ColumnHeaderPressedCurrentState)
  {
    ColumnHeaderPressed = std::nullopt;
    ColumnHeaderPressedCurrentState = false;
    Invalidate();
  }
}

ื”ืงื•ื“ ื ืจืื” ื“ื™ ืžื•ื–ืจ. ื ืจืื” ืœื™ ืฉื”ื™ื™ืชื” ืฉื’ื™ืืช ื”ืงืœื“ื” ืื• ื‘ืชื ืื™ ืื• ื‘ื”ืงืฆืื” ืžื—ื“ืฉ ืฉืœ ื”ืžืฉืชื ื” ColumnHeaderPressedCurrentState ืขืจื›ื™ื ืฉืงืจ.

ืคืœื˜

ื›ืคื™ ืฉืื ื• ื™ื›ื•ืœื™ื ืœืจืื•ืช, ืฉื™ืœื•ื‘ ื”ืžื ืชื— ื”ืกื˜ื˜ื™ PVS-Studio ื‘ืคืจื•ื™ืงื˜ TeamCity ืฉืœืš ื”ื•ื ื“ื™ ืคืฉื•ื˜. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ื–ื” ืžืกืคื™ืง ื›ื“ื™ ืœื›ืชื•ื‘ ืจืง ืงื•ื‘ืฅ ืชืฆื•ืจื” ืงื˜ืŸ ืื—ื“. ื‘ื“ื™ืงืช ื”ืงื•ื“ ืชืืคืฉืจ ืœืš ืœื–ื”ื•ืช ื‘ืขื™ื•ืช ืžื™ื“ ืœืื—ืจ ื”ื”ืจื›ื‘ื”, ืžื” ืฉื™ืขื–ื•ืจ ืœื”ืขืœื™ื ืื•ืชืŸ ื›ืืฉืจ ื”ืžื•ืจื›ื‘ื•ืช ื•ื”ืขืœื•ืช ืฉืœ ื”ืฉื™ื ื•ื™ื™ื ืขื“ื™ื™ืŸ ื ืžื•ื›ื™ื.

PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2
ืื ื‘ืจืฆื•ื ืš ืœืฉืชืฃ ืžืืžืจ ื–ื” ืขื ืงื”ืœ ื“ื•ื‘ืจ ืื ื’ืœื™ืช, ืื ื ื”ืฉืชืžืฉ ื‘ืงื™ืฉื•ืจ ื”ืชืจื’ื•ื: ื•ืœื“ื™ืกืœื‘ ืกื˜ื•ืœื™ืืจื•ื‘. PVS-Studio ื•ืฉื™ืœื•ื‘ ืžืชืžืฉืš: TeamCity. ื ื™ืชื•ื— ืคืจื•ื™ืงื˜ Open RollerCoaster Tycoon 2.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”