á¨PVS-Studio analyzerá ááá áá á áŁá áá
áłá á¨áá áááłáá˝ á áṠᨠCI áľáááśá˝ áá áŤáá áá
á°áľ ááᢠáĽá ááá áĽááłá ᨠPVS-Studio ááŽáááľ á¨áá áá°á á¨ááááá ááŁáááľ áŤáá áá
á°áľ áľáááľ áľááłá á áĽááľ áľáááá˝ ááľáĽ áááᣠá˘á˝áá áá
á áá°áľ á¨á áá ááš áĽáá˛áá áĽáá°ááááᢠPVS-áľáąá˛áŽ á áá á°ááłá áá
ááľá áá° TeamCity - TeamCity Inspections Type á
áá¸áľ áááá¨á áľáá á ááᢠáĽáá´áľ áĽáá°áá°áŤ áĽáá.
áľá áĽá á áá á¨ááá áśááľáá áá¨á
á áĽááľ áá áľááá ááŽáááľ áá¨á
áá áá á°ááŁá á á°ááŁáŤá ááłá áĽáááá - ᨠOpenRCT2 ááŽáááľá áĽáááááá˘
á á°áἠááľá¨á
ááá áááá ἠááááŁáľ á¨ááŤá áá°áąá ááááá áĽá ᨠTeamCity á áááá á áŽáááá°áŹ áá á¨á°áŤáá áľ áá ááᎠáĽáááŤáá. áá°áĄ localhostáĄ{á ááŤá áá°áľ ááľáĽ á¨á°ááá¸áá áá°áĽ} (á áĽá áááł localhost:9090) áááľ áĽá á¨áááł ááἠááľááŁáľ á ááĽáᢠá¨ááŁá á áá á°áááł áá°á áááĄ-
á¨ááŽáááľ áá á áááá á á
áŤáľááᢠá ááá á á áĽá
ááá¨áĄ áĽá ááľáŽášá áááá˘
á ááŤáŠá á¨á°áŤá á áá áá á¨, á
áá
áśá˝ áŁáá ááľáŽáľ áĽááá ááá.
á á
áĽááľáá á¨áááŁáł áá
á ááá áŠ.
ááľáŽášá ááá áĽá á á
áŤáľáá áá á¨. á¨áľáŞáľ áááŁá áŞáŤ áľáááľ áĽááľáľááἠá¨áá áá
ááľáŽáľ áĽááŤááᢠáááŽáš ááľááá á á áŤáŁá˘á áľáááá, á á
áŤáľáá á áá.
á áá¨á¨áťá áá° á¨ááŽáááą ááźáśá˝ áĽáááłáá.
á¨áá°áĽá°á˘áŤ á°á¨ááá˝á áĽáá¨ááᣠáá
áá áááľá¨á á á
áŤáľááᥠá°á¨ááá˝á áááᥠ-> á¨áááŁáł á°á¨áá áŤáá.
áĽáá
áĽááááŁáá:
- á¨áŠáŤ á áááľ -> á¨áľáĽáá ááľáá
- á ááľ -> áĽá áľááŞááľá˘
á ááŽáááľ áá ááá áá áľ áľáá°á áľáááá°áŤáŁáľáĽá°áŁ áĽá áľáá°á á ááľ áĽááá ááá áľááá áľ ááľáŠá áá áĽá áľááŞááľ:
á¨ááá°áĽ á°á¨ááá˝á á áá áĽáááá¨áłáá. á°ááłáá ááŤáᣠááŽáááąá áá°áĽá°áĽáŁ áá°áá°áᣠáŞáááąá áááŁáľ áĽá áá
á¨á˝ á áľáŤ á ááľ á¨áŽáľ ááľááŽá˝á áĽáť ááá°áľ á áľááá ááá˘
áĽá ááľá¨á áŤááĽá á¨áá¨á¨áťá ááá á¨á áŤáŁá˘ á°ááááŽá˝á áááá á ááᣠáá á á°ááŁá˘ááłá¸áá áááťáťá á ááłááľ ááááśá˝á áááŤááᢠáá áá áááľá¨á áá° ááľ áĽáááĽááĄ- áááŞáŤáá˝ -> á á˛áľ áááŞáŤ áŤáá áĽá áśáľáľ á°ááááŽá˝á áŤááá˘
ááľá¨á áŤááĽááľ á ááŤáŠá ááŤá áĽáť áá áŠáŤ á áááá áá áĽá áá. ááŽáááą áĽá¨á°á°á á°á áĽá áĽá¨á°á°áá°á, áľá áľááŞááą áĽáááááłáá.
ááĽáł áľááŞááľá˘
á ááááŞáŤáŁ á¨á
áἠáááá ᨠPVS-áľáąá˛áŽ áľáááľ ááá¨áľ á ááĽáᢠááá
ᨠChocolatey áĽá
á á áľá°áłáłáŞá áĽáá áááá. áľááá
ááłá á¨á áá áááá
ááááá, á°ááá
á á
choco install pvs-studio -y
á ááá á ᨠCLMonitor ááŽáááľ áááŁáł áá¨áłá°áŤ áááááŤá áĽááľáááá˘
%CLmon% monitor â-attach
á¨ááŤá ááŽáááąá áĽáá° á¨á áŤáŁá˘ á°áááá áĽááááŁáá á¤á.á¤áľ.á˘. áááááŁáľ á¨ááŤáľáááá ᨠMSBuild áĽáŞáľ ááááľ ááá˘
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
áPVS-áľáąá˛áŽ á¨ááá˘áŤ áĽá á¨áááľ ááá áĽááľááŁáĄ-
%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"
á¨áá¨á¨áťá áĽááá á¨á°áá¨ááá áŞáááľ áá° ááľáĽ ááłá¨áľ ááᢠáľáśáľá 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"
áá á áĽáá˛á áĽááłá á¨ááŽáááą áľáĽá°áŁ áĽá áľáá°á á á°áłáŤ áááł á°á áá áá, áá° áľáŠ áááľ áĽáá˝ááá ááŽáááśá˝ áĽá áĄá¤á˛áľáľáŤ в Ńtom.
á áá á á
áĽááľáá á á ááá ááááŤáá˝á¨áľááłá áááŁáá ááá¨áľáĄ-
ááľá ááááŤáá˝ á ááá፠á°áἠááĽáŽá˝ ááá°áŁá. á áŽáą ááľáĽ ááá°áľ á¨ááľá ááááŤá áá áŤááá á¨ááľáá ááĽá á á
ááľá¨á áŤáľáááááłáᢠá áááá áá áĽá áá áŤááá á¨áĽáŤá ááááľ á á
ááľá¨á á¨á°ááľ áá á á˛áľ áľá áá¨ááłáᢠáĽáá˛áá á á°ááłá ááľá ááá፠á¨ááľáá ááĽáŠá á á
á ááľá¨á á áŽáą ááľáĽ áá°áľ áá˝ááᢠá áá ááá áľ áá á¨áááľ áŽááá°á áá°áľ ááťáá ááá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;
}
á°ááłá áá á°á¨ áľááľáłá á á°ááááááľ á¨áá°áĽ á áá á¨áá áľá á°áľ á áľá°áááᢠááá ááá áŠáአáááł á˛áá á, áá á°á¨ áľááľáłá á áá¸áłá, áĽá á¨ááľáłááť ááłá˝ áá¨á°áłá.
ááľá ááá፠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),
....
};
á¨áľáłá˛á á°ááłá á áľá°áá áĽááľ á°áá˝ áá áá á¨áľáŠá¨áľ áá°á ááá áá˝ááᢠáá á¨á á -ááá á ááłá ááá á áľááá áĽáŠ ááá˘
ááľá ááááŤáá˝ N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
áĽááἠáá, á áá á¨áłá ááá ááľáĽ áĽá á áľáááľ ááľáĽ á°ááłáłá áľá áŤáá á°áááá áá áá áááá áľá á°áľ á áá°áá. ááá áĽáá á¨áááľ á´áááá áŤáą ááá á¨ááá ááá ááľáŽá˝ á áá ááá ááľáĽ áĽáá°ááá ááááłá. á ááŤá˝ ááľáĽ á°ááłáłá áľá áŤáá¸áá ááľáŽá˝ á ááá , á፠áááŁáľá áĽáááĽáŤáá.
ááľá ááá፠N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
áĽáľá˛ á áá áĽáá áĽáááááᢠá áááá˝ ááľá á á áŁáŤ/8 á¨áá áá¸áľ ááááᢠááľá á á áŁáŤ ᨠ-7 áĽáľá¨ 7 áŁáá ááá ááľáĽ ááᢠááá°á ááááĄ- (ááľá á á áŁáŤ / 8) != 3 áźáŽá˝ ááľá á á áŁáŤ á¨ááá áá ááááĄ- ᨠ-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); // <=
}
....
}
áá áŽáľ ááá¨á á áŁá ááá ááᣠááśáľá°á áá áá¨ááἠáĽáť áŤáľáááááłá á°áŤáá˝ áá° áŁáś á áá ááá áá° áááłá ááááŤá á áŤá áá¨ááŠá˘ ááá°ááá á ááŤá áĽá áááá-
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();
}
}
áŽáą á áŁá áĽáááł áááľááᢠá áááłá áá ááá á°áááááá áĽáá°áá á˛áá°áĽ á¨áľá¨áŁ áľá¨áŁ á¨áá ᨠáááľáá á¨á ááľ áŤáľá ááŹáľCurrentState áľááááá˝ á¨áá°áľ.
áá°áá°ááŤ
áĽáá°ááá¨áᣠᨠPVS-Studio static analyzerá á¨áĽááľá á¨TeamCity ááŽáááľ áá ááááľ á áŁá ááá ááᢠáá áá áááľá¨á á ááľ áľáá˝ á¨áá á ááá áĽáť ááťá á á áá. áŽáąá ááá°á˝ á¨á°á°á á°á á áá áá˛áŤáá á˝ááŽá˝á ááá°á áĽáá˛áŤáá áŤáľá˝áááłá, áá á ááľáĽáľáĽááľ áĽá áááŚá˝ á ááá áá á°á á˛áá áĽááąá áááľáááľ áá¨áłá.
áá
áá á˝áá ááĽááááá á°áá᪠áłáłááá˝ áááŤáľ á¨ááá áĽáŁááá á¨áľááá ááŤáŤáŁáá áá áá-ááá˛áá áľáśááŤáŽáá˘
ááá: hab.com