ʻO kekahi o nā hiʻohiʻona o kēia manawa no ka hoʻohana ʻana i ka anana PVS-Studio ʻo ia ka hoʻohui ʻana me nā ʻōnaehana CI. A ʻoiai ʻo ka nānā ʻana i kahi papahana PVS-Studio mai kahi kokoke i nā ʻōnaehana hoʻohui hoʻomau hiki ke kūkulu ʻia i loko o nā kauoha liʻiliʻi, hoʻomau mākou i kēia kaʻina hana i ʻoi aku ka maʻalahi. Loaʻa iā PVS-Studio ke kākoʻo no ka hoʻohuli ʻana i ka mea hoʻopuka analyer i kahi ʻano no TeamCity - TeamCity Inspections Type. E ʻike kākou pehea e hana ai.
ʻIke e pili ana i ka polokalamu i hoʻohana ʻia
ʻIke e pili ana i ka papahana e aʻo ʻia nei
E ho'āʻo kākou i kēia hana me kahi laʻana kūpono - e nānā kākou i ka papahana OpenRCT2.
hoʻoponopono
I mea e mālama ai i ka manawa, e hoʻokuʻu paha wau i ke kaʻina hana hoʻonohonoho a hoʻomaka mai ka manawa e holo ana ka server TeamCity ma kaʻu kamepiula. Pono mākou e hele i: localhost:{port specified during the installation process} (ma koʻu hihia, localhost:9090) a hoʻokomo i ka ʻikepili ʻae. Ma hope o ke komo ʻana e hoʻokipa ʻia mākou e:
Kaomi ma ka pihi Create Project. A laila, koho Manual a hoʻopiha i nā kahua.
Ma hope o ke kaomi ʻana i ke pihi Hoʻoulu, hoʻokipa ʻia mākou e kahi puka aniani me nā hoʻonohonoho.
E kaomi kāua E hana i ka hoʻonohonoho kūkulu.
E hoʻopiha i nā kahua a kaomi Hoʻoulu. ʻIke mākou i kahi puka aniani e noi ana iā ʻoe e koho i kahi ʻōnaehana mana mana. No ka mea aia nā kumu ma ka ʻāina, kaomi E lele.
ʻO ka hope, neʻe mākou i nā hoʻonohonoho papahana.
E hoʻohui i nā ʻanuʻu hui, e hana i kēia kaomi: Hana i nā ʻanuʻu -> Hoʻohui i ka hana kūkulu.
Maanei mākou e koho ai:
- ʻAno holo -> Laina kauoha
- Holo -> Palapala Kuʻuna
No ka mea e hana mākou i ka nānā ʻana i ka wā o ka hōʻuluʻulu ʻana o ka papahana, ʻo ka hui ʻana a me ka nānā ʻana i hoʻokahi pae, no laila e hoʻopiha i ke kahua Hōʻike Kūʻokoʻa:
E nānā mākou i kēlā me kēia pae ma hope. He mea nui ka hoʻouka ʻana i ka mea loiloi, ka hui ʻana i ka papahana, ka nānā ʻana iā ia, ka hoʻopuka ʻana i ka hōʻike a me ka hoʻopili ʻana iā ia he ʻumikumamākahi laina o ke code.
ʻO ka mea hope a mākou e hana ai, ʻo ia ka hoʻonohonoho ʻana i nā ʻano hoʻololi kaiapuni, aʻu i wehewehe ai i kekahi mau ala e hoʻomaikaʻi ai i kā lākou heluhelu ʻana. No ka hana ʻana i kēia, e neʻe kākou: Nā ʻāpana -> Hoʻohui i nā ʻāpana hou a hoʻohui i ʻekolu mau hoʻololi:
ʻO nā mea a pau āu e hana ai, e kaomi i ke pihi holo ma ke kihi akau luna. ʻOiai e hōʻuluʻulu ʻia a nānā ʻia ka papahana, e haʻi wau iā ʻoe e pili ana i ka palapala.
Palapala pololei
ʻO ka mea mua, pono mākou e hoʻoiho i ka hoʻolaha PVS-Studio hou. No kēia, hoʻohana mākou i ka luna Chocolatey package. No ka poʻe makemake e ʻike hou aku e pili ana i kēia, aia kahi pili
choco install pvs-studio -y
Ma hope aʻe, e hoʻolauna i ka CLMonitor project build tracking utility.
%CLmon% monitor –-attach
A laila e kūkulu mākou i ka papahana ma ke ʻano he hoʻololi kaiapuni MSB ʻo ia ke ala i ka mana o MSBuild pono wau e kūkulu
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
E komo kāua i ke kī komo a me ka laikini no PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
Ma hope o ka pau ʻana o ke kūkulu ʻana, e holo hou iā CLMonitor e hana i nā faila preprocessed a me ka loiloi static:
%CLmon% analyze -l "c:ptest.plog"
A laila e hoʻohana mākou i kahi mea hoʻohana ʻē aʻe mai kā mākou mahele. Hoʻololi ʻo PlogConverter i kahi hōʻike mai kahi ʻano maʻamau i kahi ʻano kikoʻī TeamCity. Mahalo i kēia, hiki iā mākou ke nānā pono iā ia ma ka puka makani kūkulu.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
ʻO ka hana hope e hōʻike i ka hōʻike i hoʻonohonoho ʻia ma stdout, kahi e kiʻi ʻia e ka TeamCity parser.
type "C:tempptest.plog_TeamCity.txt"
Helu palapala piha:
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"
I kēia manawa, ua hoʻopau maikaʻi ʻia ka hui a me ka nānā ʻana o ka papahana, hiki iā mākou ke hele i ka pā hana a e hooiaio.
I kēia manawa e kaomi ma luna Huina Nanae hele i ka nānā ʻana i ka hōʻike loiloi:
Hoʻopili ʻia nā ʻōlelo aʻo e nā helu lula diagnostic. No ka hoʻokele ʻana i ke code, pono ʻoe e kaomi i ka helu laina me ka ʻōlelo aʻo. Ke kaomi ʻana i ka māka nīnau ma ke kihi ʻākau i luna e wehe iā ʻoe i kahi ʻaoʻao hou me nā palapala. Hiki iā ʻoe ke hoʻokele i ke code ma ke kaomi ʻana i ka helu laina me ka ʻōlelo aʻoaʻo analyer. Hiki ke hoʻokele mai kahi kamepiula mamao ke hoʻohana SourceTreeRoot hoailona. ʻO ka mea makemake i kēia ʻano hana o ka mea ananely hiki ke hoʻomaʻamaʻa iā lākou iho me ka pauku pili
Ke nānā 'ana i nā hualoa'a a ka mea ho'oponopono
I kēia manawa ua pau mākou i ka hoʻonohonoho ʻana a me ka hoʻonohonoho ʻana i ke kūkulu ʻana, e nānā i kekahi mau ʻōlelo aʻo hoihoi i loaʻa i ka papahana a mākou e nānā nei.
'Ōlelo 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;
}
Ua ʻike ka mea loiloi i kahi hewa ma hope o ka hoʻokaʻawale ʻana i ka hoʻomanaʻo i loko CreateObject, i ka wā e puka mai ai kahi ʻokoʻa, ʻaʻole i holoi ʻia ka hoʻomanaʻo, a hiki mai kahi leak hoʻomanaʻo.
'Ōlelo 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),
....
};
ʻAʻole hiki i nā kānaka ʻē aʻe ke hele i kēia hōʻike hoʻolohe. Maikaʻi kēia laʻana kope-paste no kēia kumu.
'Ōlelo N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
ʻOiaʻiʻo, ʻo ka hoʻohana ʻana i kahi ʻano me ka inoa hoʻokahi i ka papa kumu a me ka mamo ʻaʻole ia he hewa mau. Eia naʻe, manaʻo ka ʻenehana hoʻoilina ponoʻī aia nā kahua āpau o ka papa makua i ka papa keiki. Ma ka haʻi ʻana i nā māla me ka inoa like i ka hoʻoilina, hana mākou i ka huikau.
'Ōlelo N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
E nānā pono kākou. Hōʻike kiʻi kuhikuhi/8 e hoopunipuni ina kiʻi kuhikuhi Aia ma ka laulima mai -7 a hiki i 7. Mahele ʻelua: (Ala kiʻi / 8) != 3 hōʻoia kiʻi kuhikuhi no ka mea ma waho o ka laulā: mai -31 a i -24 a mai 24 a 31. He mea kupanaha iaʻu ke nānā i nā helu no ka hoʻokomo ʻana i kekahi ʻano ma kēia ʻano, a inā ʻaʻohe hewa o kēia ʻāpana code, makemake wau e kākau hou i kēia mau kūlana i ʻoi aku ka maopopo. ʻO kēia ka mea e maʻalahi ai ke ola no ka poʻe e heluhelu a mālama i kēia code.
'Ōlelo 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;
....
}
....
}
Loaʻa paha kēia ʻāpana code ma o ka decompilation. A laila, i ka hoʻoholo ʻana ma ka ʻōlelo i waiho ʻia, ua wehe ʻia kahi hapa o ka code hana ʻole. Eia nō naʻe, aia nō ʻelua mau hana i koe cursorId, ʻaʻole hoʻi i manaʻo nui.
'Ōlelo 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); // <=
}
....
}
He mea maʻalahi kēia code e hoʻoponopono; pono ʻoe e nānā i ke kolu o ka manawa Hawaii i kahi kuhikuhi null, a i ʻole e hoʻohui i ke kino o ka ʻōlelo kūlana. Manaʻo wau i ka koho ʻelua:
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);
}
}
....
}
'Ōlelo 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));
....
}
....
}
Hiki iā ʻoe ke hoʻopau i kahi laina paʻakikī o ka helu helu i hoʻokahi swoop a hoʻoponopono i ka pilikia me ka nānā ʻana nullptr. Manaʻo wau e hoʻololi i ke code penei:
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);
....
}
....
}
'Ōlelo N8
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
ʻAno ʻē ke ʻano o ke code. Me he mea lā aia kekahi typo ma ke kūlana a i ʻole ke kau hou ʻana i ka loli ColumnHeaderPressedCurrentState nā hiʻohiʻona wahahee.
hopena
E like me kā mākou e ʻike ai, maʻalahi ka hoʻohui ʻana i ka PVS-Studio static analyzer i kāu papahana TeamCity. No ka hana ʻana i kēia, ua lawa ke kākau ʻana i hoʻokahi faila hoʻonohonoho liʻiliʻi. ʻO ka nānā ʻana i ke code e ʻae iā ʻoe e ʻike i nā pilikia ma hope koke o ka hōʻuluʻulu ʻana, e kōkua i ka hoʻopau ʻana iā lākou inā haʻahaʻa ka paʻakikī a me ke kumukūʻai o nā loli.
Inā makemake ʻoe e kaʻana like i kēia ʻatikala me ka lehulehu ʻōlelo Pelekania, e ʻoluʻolu e hoʻohana i ka loulou unuhi: Vladislav Stolyarov.
Source: www.habr.com