PVS-Studio ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠáááºááŸáá¡ááŒá±á¡áá±áá»á¬ážáá²ááŸáá
áºáá¯ááŸá¬ CI á
áá
áºáá»á¬ážááŸáá·áº áá±á«ááºážá
ááºážááŒááºážááŒá
áºáá«áááºá PVS-Studio ááá±á¬áá»ááºáá
áºáá¯á¡á¬áž á
ááºáááºáááŒááºáá±á«ááºážá
ááºážááŸá¯á
áá
áºáá®ážáá«ážá០ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡áá»áá¯á·ááᯠá¡áááá·áºáá±ážáá¯á¶á¡áááºážáááºááŒáá·áº áááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž á€áá¯ááºáááºážá
ááºááᯠááá¯ááá¯á¡áááºááŒá±á
á±ááẠáá»áœááºá¯ááºááá¯á· áááºáááºáá¯ááºáá±á¬ááºáá«áááºá PVS-Studio ááẠááá¯á¡áá« ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡ááœááºá¡á¬áž TeamCity - TeamCity á
á
áºáá±ážáá±ážá¡áá»áá¯ážá¡á
á¬ážá¡ááœáẠáá±á¬áºáááºá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²áááºá¡ááœáẠáá¶á·ááá¯ážááŸá¯ááŸááá«áááºá áááºááá¯á¡áá¯ááºáá¯ááºáá² ááŒáá·áºáá¡á±á¬ááºá
á¡áá¯á¶ážááŒá¯áá²á·áá±á¬á·ááºáá²áá²á·áááºáááºáá²á·á¡áá»ááºá¡áááº
ááá±á¬áá»ááºááŸáá·áºáááºáááºáá±á¬ á¡áá»ááºá¡áááºáá»á¬ážááᯠáá±á·áá¬ááá¯ááºáá«áááºá
áááºááœá±á·ááá°áá¬áá áºáá¯ááœáẠá€áá¯ááºáá±á¬ááºáá»ááºááᯠá ááºážááŒáá·áºááŒáá«á áá¯á· - OpenRCT2 ááá±á¬áá»ááºááᯠááœá²ááŒááºážá áááºááŒá¬ááŒáá·áºááŒáá«á áá¯á·á
ááá·áºá¡á±á¬ááºáá¯ááºááŒááºáž
á¡áá»áááºáá¯ááºáááºáá¬áááºá¡ááœááºá áá»áœááºá¯ááºááẠáá»áœááºá¯ááºáááœááºááŒá°áá¬ááœáẠTeamCity áá¬áá¬ááᯠáá¯ááºáá±á¬ááºáá±ááá·áºá¡áá»áááºá០á áááºá áááºáááºááŒááºážáá¯ááºáááºážá ááºááᯠáá»á±á¬áºááœá¬ážáá±áááºá áá»áœááºá¯ááºááá¯á·ááẠ- localhost:{áááºáááºááŒááºážáá¯ááºáááºážá ááºá¡ááœááºáž áááºááŸááºáá¬ážáá±á¬ ááááºáááºáž} (áá»áœááºá¯ááºáááá á¹á ááœááºá localhost:9090) ááá¯á·ááœá¬ážá ááœáá·áºááŒá¯áá»ááºáá±áá¬ááᯠááá·áºáá«á áááºááŒá®ážáá±á¬áẠáá»áœááºá¯ááºááá¯á·á¡á¬áž ááŸá¯ááºáááºáá«áááºá
Create Project ááá¯ááºááᯠááŸáááºáá«á ááá¯á·áá±á¬áẠManually ááá¯ááœá±ážáá»ááºááŒá®áž ááœááºáááºáá»á¬ážááᯠááŒáá·áºá
áœááºáá«á
ááá¯ááºááá¯ááŸáááºááŒá®ážáá±á¬áẠáááºáá®ážáááºáááºáá»á¬ážááŒáá·áº ááŒáááºážáá±á«ááºá០ááŒáá¯ááá¯áá«áááºá
ááŸáááºááŒáá·áºáá¡á±á¬áẠáááºáá±á¬ááºááŸá¯áá¯á¶á
á¶ááᯠáááºáá®ážáá«á.
ááœááºáááºáá»á¬ážááá¯ááŒáá·áºááŒá®áž ááá
áºááŸáááºáá«á áááºáá®áž. áá¬ážááŸááºážááááºážáá»á¯ááºááŸá¯á
áá
áºááᯠááœá±ážáá»ááºááẠááá·áºá¡á¬áž áá±á¬ááºážááá¯áá±ááá·áº áááºážááá¯ážáá
áºáá¯ááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááááºá á¡áááºážá¡ááŒá
áºáá»á¬ážááẠáá±áá¡ááá¯áẠáááºááŸááá±ááŒá®ááŒá
áºáá±á¬ááŒá±á¬áá·áºá ááŸáááºáá«á ááŒáá¯ážáá¯ááº.
áá±á¬ááºáá¯á¶ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠááá±á¬áá»ááºáááºáááºáá»á¬ážááá¯á· áááºááœá¬ážáá«á
á
á¯á
ááºážááŸá¯ á¡ááá·áºáá»á¬ážááᯠáá±á«ááºážááá·áºááŒáá«á
áá¯á·á Build á¡ááá·áºáá»á¬áž -> áááºáá±á¬ááºááŸá¯á¡ááá·áºááᯠááá·áºáá«á.
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á· ááœá±ážáá»ááºáááº-
- Runner á¡áá»áá¯ážá¡á á¬áž -> Command Line
- Run -> Custom Script ááá¯ááœáá·áºáá«á
ááá±á¬áá»ááºá á¯á ááºážááŸá¯á¡ááœááºáž áá»áœááºá¯ááºááá¯á·ááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáá¯ááºáá±á¬ááºáááºááŒá áºáá±á¬ááŒá±á¬áá·áº á á¯á ááºážááŸá¯ááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááẠá¡ááá·áºáá áºááá·áºááŒá áºááá·áºáá±á¬ááŒá±á¬áá·áº ááœááºáááºááœáẠááŒáá·áºá áœááºáá«á á áááºááŒáá¯áẠScript:
áá±á¬ááºááá¯ááºážááœáẠáá
áºáŠážáá»ááºáž á¡ááá·áºáá»á¬ážááᯠááŒáá·áºáá«áááºá ááœá²ááŒááºážá
áááºááŒá¬áá°á¡á¬áž áááºááŒááºážá ááá±á¬áá»ááºááᯠá
á¯á
ááºážááŒááºážá ááœá²ááŒááºážá
áááºááŒá¬ááŒááºážá á¡á
á®áááºáá¶á
á¬ááᯠáá¯ááºáá±ážááŒááºážááŸáá·áº áá±á¬áºáááºáá»ááŒááºážááá¯á·ááẠáá¯áẠááá·áºáá
áºááá¯ááºážáᬠáá°ááẠá¡áá±ážááŒá®ážáá«áááºá
áá±á¬ááºáá¯á¶ážáá¯ááºáááŸá¬á Environment variable ááœá±ááᯠáááºááŸááºááŒá®áž áá°ááá¯á·áá²á· áááºááŸá¯ááá¯ááºááŸá¯ááᯠááŒáŸáá·áºáááºááá¯á· áááºážáááºážááá»áá¯á·ááᯠáá±á¬áºááŒáá±ážáá¬ážáá«áááºá áá«ááá¯áá¯ááºááá¯á·á áááºááœá¬ážááŒáá¡á±á¬ááº- ááá·áºáááºáá»ááºáá»á¬áž -> áá«áá¬áá®áá¬á¡áá áºááá·áºáá«á ááŸáá·áº variable áá¯á¶ážáá¯áá±á«ááºážááá·áºáá«á
áááºáá¯ááºáááºááŸá¬ááá¯ááºááá¯ááŸáááºáá«á ááœá±ážááŸá¬áž áá¬áááºá¡áá±á«áºáá±á¬áá·áºááŸá¬á ááá±á¬áá»ááºááᯠá
á¯á
ááºážááŒá®áž ááœá²ááŒááºážá
áááºááŒá¬áá±áá»áááºááŸá¬ áá¬ááºááœáŸááºážá¡ááŒá±á¬ááºáž ááŒá±á¬ááŒáááºá
ááá¯ááºááá¯ááºáá²áá»á
áŠážá
áœá¬á áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºáá¯á¶ážáá±á«áº PVS-Studio ááŒáá·áºááŒá°ážááŸá¯ááᯠáá±á«ááºážáá¯ááºáá¯ááºááẠááá¯á¡ááºáááºá áááºážá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠChocolatey áááºáá±á·áá»áºáááºáá±áá»á¬ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá áá®á¡ááŒá±á¬ááºážááᯠááá¯áááá»ááºáá°ááœá±á¡ááœááºáá±á¬á· áááºááá¯ááºáá¬áá
áºáá¯ááŸááá«áááºá
choco install pvs-studio -y
ááá¯á·áá±á¬ááºá CLMonitor ááá±á¬áá»ááºáááºáá±á¬ááºááŒá±áá¬áá¶ááŒááºáž utility ááá¯ááœáá·áºááŒáá«á áá¯á·á
%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%
áááºáá±á¬ááºááŸá¯ááŒá®ážááœá¬ážáá±á¬á¡áá«á ááŒáá¯áááºáá¯ááºáá±á¬ááºááŒá®ážáá¬ážááá¯ááºáá»á¬ážááŸáá·áº static ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáááºáá®ážáááºá¡ááœáẠCLMonitor ááᯠáááºáá¶áá¯ááºáá±á¬ááºáá«á
%CLmon% analyze -l "c:ptest.plog"
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·á ááŒáá·áºááŒá°ážááŸá¯á០á¡ááŒá¬ážáá±á¬ á¡áá¯á¶ážáááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá PlogConverter ááẠá¡á á®áááºáá¶á á¬ááᯠá á¶áá±á¬áºáááºá០TeamCity áá®ážááá·áºáá±á¬áºáááºááá¯á· ááŒá±á¬ááºážáááºá áááºážááá¯áá»á±ážáá°ážáááºáá«áááºá áááºážááᯠbuild window ááœáẠááá¯ááºááá¯ááºááŒáá·áºááŸá¯ááá¯ááºáááºááŒá áºáááºá
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
áá±á¬ááºáá¯á¶ážá¡ááá·áºááŸá¬ áá±á¬áºáááºáá¯ááºáá¬ážáá±á¬ á¡á á®áááºáá¶á á¬ááᯠááŒááááºááŒá áºáááºá áááTeamCity parser á០áá±á¬ááºáá°ááá·áºáá±áá¬ááœááºá
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"
á€á¡áá±á¬á¡ááœááºážá ááá±á¬áá»ááºá á ááºážáá±ážááœá²ááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ á¡á±á¬ááºááŒááºá áœá¬ ááŒá®ážááœá¬ážáááŒáá·áº áááºááºááá¯á· ááœá¬ážááá¯ááºáá«áááºá á á®áá¶ááááºážáá»á¬áž áá±áá»á¬á¡á±á¬ááºáá¯ááºáá«á
áá² ááŸáááºááá¯ááºááŒáá¡á±á¬áẠá
á¯á
á¯áá±á«ááºážá
á
áºáá±ážááŒááºážáááœá²ááŒááºážá
áááºááŒá¬áá° á¡á
á®áááºáá¶á
á¬ááᯠááŒáá·áºááŸá¯áááº-
ááááá±ážáá»ááºáá»á¬ážááᯠáá±á¬áá«ááŸá¬ááœá±áá±ážá
ááºážáá»ááºážáá¶áá«ááºáá»á¬ážááŒáá·áº á¡á¯ááºá
á¯ááœá²á·áá¬ážáááºá áá¯ááºááá¯ááŒááºá ááœá¬ážáá¬ááẠááááá±ážáá»ááºááŒáá·áº ááá¯ááºážáá¶áá«ááºááᯠááŸáááºááá«áááºá áá¬áááºá¡áá±á«áºáá±á¬áá·áºááŸá áá±ážááœááºážá¡ááŸááºá¡áá¬ážááᯠááŸáááºááŒááºážááŒáá·áº á
á¬ááœááºá
á¬áááºážáá»á¬ážáá«ááŸááá±á¬ áááºááºá¡áá
áºáá
áºáá¯ááᯠááá·áºá¡á¬áž ááœáá·áºáá±ážáááºááŒá
áºáááºá ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááááá±ážáá»ááºááŒáá·áº ááá¯ááºážáá¶áá«ááºáá±á«áºááœáẠááŸáááºááŒááºážááŒáá·áº áááºááẠáá¯ááºááŸáá
áºááá·áº ááœá¬ážáá¬ááá¯ááºáááºá á¡áá¯á¶ážááŒá¯ááá·áºá¡áá« á¡áá±ážááááºážááœááºááŒá°áá¬á០áááºážááŒá±á¬ááºážááŒááá¯ááºáááºá á¡áááºážá¡ááŒá
áºTreeRoot á¡ááŸááºá¡áá¬ážá ááœá²ááŒááºážá
áááºááŒá¬áá°á á€áá¯ááºáá±á¬ááºááŸá¯áá¯á¶á
á¶ááᯠá
áááºáááºá
á¬ážáá° áááºáá°áááᯠáááºááá¯ááºáá¬ááá¹áááŸáá·áº áááºážááŸá®ážááá¯ááºáá«áááºá
ááœá²ááŒááºážá áááºááŒá¬áá°áááááºáá»á¬ážááá¯ááŒáá·áºááŸá¯ááŒááºážá
ááᯠáááºáá±á¬ááºááŸá¯á¡á¬áž ááŒáá·áºáá»ááºááŒá®áž ááŒááºáááºáááºááŸááºááŒááºáž ááŒá®ážáááºááŸáá·áºá áá»áœááºá¯ááºááá¯á· ááŒáá·áºááŸá¯áá±ááá·áº ááá±á¬áá»ááºááœáẠááœá±á·ááŸááááá·áº á áááºáááºá á¬ážááœáẠááááá±ážáá»ááºá¡áá»áá¯á·ááᯠááŒáá·áºáá«á
ááááá±ážáá»áẠN1
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
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),
....
};
static ááœá²ááŒááºážá áááºááŒá¬áá°ááŸááœá²á á¡ááŒá¬ážáá°á¡áááºážáááºá á€á¡á¬áá¯á¶á á°ážá áá¯ááºááŸá¯á ááºážáááºááŸá¯ááᯠá¡á±á¬ááºááŒááºááá¯ááºáááºá á€áá±á¬áºáá®áá°ážááá·áºáá¬ážáá±á¬ á¥ááá¬ááẠá€á¡ááŒá±á¬ááºážááŒá±á¬áá·áº á¡ááá¡áá» áá±á¬ááºážáá«áááºá
ááááá±ážáá»ááºáá»á¬áž N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
áá¯ááºáá«áááºá base class áá²á· descendant ááŸá¬ áá¬áááºáá°áá²á· variable ááá¯áá¯á¶ážáá¬á á¡ááŒá²áááºáž error ááá¯ááºáá«áá°ážá ááá¯á·áá¬ááœááºá á¡ááœá±áááºáá¶ááŒááºážáááºážááá¬ááá¯ááºááá¯ááºá áááá¡áááºážá¡á á¬ážá áááºáááºá¡á¬ážáá¯á¶ážááẠááá±ážá¡áááºážá¡á á¬ážááœáẠááŸááá±áááºáᯠáá°ááááºá á¡ááœá±áááºáá¶áá°ááœáẠá¡áááºáá° áááºáááºáá»á¬ážááᯠááŒá±áá¬ááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠááŸá¯ááºááœá±ážááŸá¯áá»á¬ážááᯠááááºáááºáá±ážáááºá
ááááá±ážáá»áẠN4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
á¡áá®ážáááºááŒáá·áºááŒáá«á áá¯á·á á áá¬ážááẠáá¯á¶áááºážááœáŸááº/á ááŸá¬ážááẠááŸá¬ážáááá·áºáááºá áá¯á¶áááºážááœáŸáẠá¡ááœá¬á¡áá±áž -7 á០7 á¡ááœááºážááŸááááºá áá¯áááá¡ááá¯ááºáž- (imageDirection / 8) != á á á áºáá±ážááŸá¯áá»á¬áž áá¯á¶áááºážááœáŸáẠá¡ááá¯ááºážá¡ááŒá¬ážááŒááºáááŒá áºááŒááºážá¡ááœááº- -31 á០-24 ááŸáá·áº 24 á០ââ31 á¡áá®ážáá®ážá á€áááºážááŒáá·áº á¡áá»áá¯á·áá±á¬ á¡ááá¯ááºážá¡ááŒá¬ážáá áºáá¯ááœáẠáá¶áá«ááºáá»á¬ážáá«áááºááŒááºážá¡ááœáẠáá¶áá«ááºáá»á¬ážááᯠá á áºáá±ážááŒááºážááẠáá»áœááºá¯ááºá¡ááœáẠá¡ááœááºáá°ážáááºážáá¯á¶áááŒá®ážá á€áá¯ááºá¡ááá¯ááºážááœáẠá¡ááŸá¬ážá¡ááœááºážáááŸááá»áŸááºáááºá á€á¡ááŒá±á¡áá±áá»á¬ážááᯠááá¯ááá¯ááŸááºážáááºážá á±ááẠááŒááºáááºáá±ážáá¬ážááẠá¡ááŒá¶ááŒá¯ááá¯áá«áááºá áááºážááẠá€áá¯ááºááá¯áááºááŒá®áž ááááºážááááºážáá¬ážáá°áá»á¬ážá¡ááœáẠááááᯠááá¯ááá¯ááœááºáá°á á±áááºááŒá áºáááºá
ááááá±ážáá»áẠN5
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
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); // <=
}
....
}
á€áá¯ááºááẠááŒááºáááºá¡áá±á¬áºáá±ážááœááºáá°áááºá áááºááẠáááºážááᯠááááá¡ááŒááẠá á áºáá±ážááẠááá¯á¡ááºáá«áááºá áá á¬ážáá° null pointer ááá¯á·á ááá¯á·ááá¯áẠconditional statement á body ááá¯á· ááá·áºáá«á áá«áá¯ááá option ááá¯á¡ááŒá¶ááŒá¯áá»ááºáá«áááº:
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
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
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
áá¯ááºá áá±á¬áºáá±á¬áºáá°ážáááºážáá¯á¶ááááºá á¡ááŒá±á¡áá±ááœááºááŒá áºá á± ááá¯á·ááá¯áẠvariable ááᯠááŒááºáááºáááºááŸááºáá±ážááá·áºá¡áá«ááœáẠtypo áá áºáá¯ááŸááá±áááºáᯠáá°áááá«áááºá ColumnHeaderPressedCurrentState á¡ááááºáá«áá» áááŸááºáá±á¬.
áá±á¬ááºáá»ááº
áá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºáááá·áºá¡ááá¯ááºáž PVS-Studio static analyzer ááᯠáááºá TeamCity ááá±á¬áá»ááºááœáẠáá±á«ááºážá ááºážááŒááºážááẠá¡ááœááºááá¯ážááŸááºážáá«áááºá áá®ááá¯áá¯ááºááá¯á·á áá±ážáááºáá²á· configuration file áá áºáá¯áá²áá±ážááá¯á·áá¯á¶áá±á¬ááºáá«áááºá áá¯ááºááá¯á á áºáá±ážááŒááºážááẠáááºáááºááŒá®ážáá±á¬áẠááŒá¿áá¬áá»á¬ážááᯠáá»ááºáá»ááºážáá±á¬áºáá¯ááºááá¯ááºáááºááŒá áºááŒá®ážá ááŸá¯ááºááœá±ážááŸá¯ááŸáá·áº á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá áá¯ááºáá»á ááááºáááºážáá«ážáá±áá±ážáá»áááºááœáẠáááºážááá¯á·ááᯠáááºááŸá¬ážááŸááºážáááºážááá¯ááºáááºááŒá áºáááºá
á€áá±á¬ááºážáá«ážááᯠá¡ááºá¹áááááºá
áá¬ážááŒá±á¬ ááááááºááŸáá·áº áá»áŸáá±ááá¯áá«áá áá¬áá¬ááŒááºááá·áºááº- Vladislav Stolyarov ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com