Chimodzi mwazinthu zamakono zogwiritsira ntchito PVS-Studio analyzer ndikuphatikizana ndi machitidwe a CI. Ndipo ngakhale kuwunika kwa polojekiti ya PVS-Studio kuchokera pafupifupi njira iliyonse yophatikizira ingapangidwe kukhala malamulo ochepa, tikupitiliza kupanga izi kukhala zosavuta. PVS-Studio tsopano ili ndi chithandizo chosinthira zotulutsa za analyzer kukhala mtundu wa TeamCity - TeamCity Inspections Type. Tiyeni tiwone momwe zimagwirira ntchito.
Zambiri zamapulogalamu omwe agwiritsidwa ntchito
Zambiri za polojekiti yomwe ikuphunziridwa
Tiyeni tiyese izi ndi chitsanzo chothandiza - tiyeni tiwunike ntchito ya OpenRCT2.
kusintha
Kuti ndisunge nthawi, mwina ndidumpha kukhazikitsa ndikuyamba kuyambira pomwe ndili ndi seva ya TeamCity ikuyenda pakompyuta yanga. Tiyenera kupita ku: localhost:{port yomwe idatchulidwa pokhazikitsa} (kwa ine, localhost:9090) ndikulowetsa data yovomerezeka. Titalowa tidzalandilidwa ndi:
Dinani pa Pangani Project batani. Kenako, sankhani Pamanja ndikudzaza minda.
Pambuyo kukanikiza batani Pangani, tikulandilidwa ndi zenera lomwe lili ndi zoikamo.
Tiyeni tidule Pangani kasinthidwe kamangidwe.
Lembani minda ndikudina Pangani. Tikuwona zenera likukupemphani kuti musankhe makina owongolera. Popeza magwero ali kale kwanuko, dinani Pitani.
Pomaliza, timapita ku zoikamo za polojekiti.
Tiyeni tiwonjezere masitepe a msonkhano, kuti tichite izi: Pangani masitepe -> Onjezani sitepe yomanga.
Apa tikusankha:
- Mtundu wothamanga -> Command Line
- Thamangani -> Custom Script
Popeza tidzachita kusanthula panthawi yopanga polojekiti, kusonkhanitsa ndi kusanthula kuyenera kukhala gawo limodzi, choncho lembani ntchitoyi Malemba Achizolowezi:
Tidzawona masitepe apayekha pambuyo pake. Ndikofunikira kuti kutsitsa analyzer, kusonkhanitsa polojekiti, kuisanthula, kutulutsa lipoti ndikuikonza kumangotengera mizere khumi ndi imodzi yokha.
Chomaliza chomwe tikuyenera kuchita ndikukhazikitsa zosintha zachilengedwe, zomwe ndafotokoza njira zina zowongolera kuwerenga kwawo. Kuti tichite izi, tiyeni tipitirire: Ma Parameters -> Onjezani magawo atsopano ndi kuwonjezera mitundu itatu:
Zomwe muyenera kuchita ndikudina batani Thamangani mu ngodya yapamwamba kumanja. Pamene polojekiti ikusonkhanitsidwa ndikuwunikidwa, ndikuwuzani za script.
Mwachindunji script
Choyamba, tiyenera kutsitsa kugawa kwaposachedwa kwa PVS-Studio. Kwa ichi timagwiritsa ntchito Chocolatey package manager. Kwa iwo amene akufuna kudziwa zambiri za izi, pali lolingana
choco install pvs-studio -y
Chotsatira, tiyeni tiyambitse pulogalamu ya CLMonitor yomanga chotsatira.
%CLmon% monitor β-attach
Kenako tidzamanga pulojekiti ngati kusintha kwa chilengedwe MSB ndiye njira yopita ku mtundu wa MSBuild womwe ndikufunika kupanga
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
Tiyeni tilowetse kiyi yolowera ndi laisensi ya PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
Ntchitoyi ikamalizidwa, thamangitsaninso CLMonitor kuti mupange mafayilo okonzedweratu ndi kusanthula kokhazikika:
%CLmon% analyze -l "c:ptest.plog"
Kenako tidzagwiritsa ntchito chida china kuchokera pakugawa kwathu. PlogConverter imasintha lipoti kuchokera pamtundu wokhazikika kukhala mawonekedwe a TeamCity enieni. Chifukwa cha izi, tidzatha kuziwona mwachindunji pawindo lomanga.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
Gawo lomaliza ndikuwonetsa lipoti losinthidwa stdout, kumene idzatengedwa ndi TeamCity parser.
type "C:tempptest.plog_TeamCity.txt"
Script kodi:
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"
Pakalipano, msonkhano ndi kusanthula kwa polojekitiyo zatha bwino, tikhoza kupita ku tabu ntchito ndipo tsimikizirani zimenezo.
Tsopano tiyeni dinani Kuyendera Totalkupita kukuwona lipoti la analyzer:
Machenjezo amaikidwa m'magulu ndi manambala a malamulo a matenda. Kuti mudutse pama code, muyenera dinani nambala ya mzere ndi chenjezo. Kudina chizindikiro chafunso pakona yakumanja yakumanja kukutsegulirani tabu yatsopano yokhala ndi zolembedwa. Mukhozanso kuyang'ana pa code podina nambala ya mzere ndi chenjezo la analyzer. Kuyenda kuchokera pakompyuta yakutali ndikotheka mukamagwiritsa ntchito SourceTreeRoot chikhomo. Aliyense amene ali ndi chidwi ndi njira iyi yogwiritsira ntchito analyzer akhoza kudzidziwa bwino ndi gawo lolingana
Kuwona zotsatira za analyzer
Tsopano popeza tamaliza kuyika ndikukonza zomanga, tiyeni tiwone machenjezo osangalatsa omwe akupezeka mu polojekiti yomwe tikuyang'ana.
Chenjezo 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;
}
Analyzer adawona cholakwika chomwe atatha kugawa mozama kukumbukira CreateObject, pamene chosiyana chichitika, kukumbukira sikuchotsedwa, ndipo kukumbukira kutayika.
Chenjezo 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),
....
};
Ndi anthu ochepa kupatulapo static analyzer omwe angapambane mayeso atcheru awa. Chitsanzo cha copy-paste ndi chabwino pachifukwa ichi.
Machenjezo N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
Zoonadi, kugwiritsa ntchito kusinthika komwe kuli ndi dzina lomwelo m'kalasi yoyambira komanso mbadwa sizovuta nthawi zonse. Komabe, ukadaulo wa cholowa palokha umaganiza kuti magawo onse a kalasi ya makolo alipo mu kalasi ya ana. Polengeza minda yokhala ndi dzina lomwelo mwa wolowa, timayambitsa chisokonezo.
Chenjezo N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
Tiyeni tione bwinobwino. Kufotokozera Chithunzi Njira / 8 zikhala zabodza ngati imageDirection ili pakati pa -7 mpaka 7. Gawo lachiwiri: (chithunziMalangizo / 8) != 3 cheke imageDirection kukhala kunja kwa mitundu: kuchokera -31 mpaka -24 ndi kuchokera 24 mpaka 31, motero. Zikuwoneka zachilendo kwa ine kuyang'ana manambala kuti aphatikizidwe mumtundu wina motere, ndipo, ngakhale palibe cholakwika pachidutswa ichi, ndingalimbikitse kulembanso izi kuti zikhale zomveka bwino. Izi zikanapangitsa moyo kukhala wosavuta kwa anthu omwe angawerenge ndikusunga code iyi.
Chenjezo 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;
....
}
....
}
Chidutswa cha code ichi mwachiwonekere chinapezedwa ndi decompilation. Kenaka, kuweruza ndi ndemanga yomwe yatsala, gawo la code yosagwira ntchito linachotsedwa. Komabe, pali ntchito zingapo zomwe zatsala cursorId, zomwenso sizimamveka bwino.
Chenjezo 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); // <=
}
....
}
Khodi iyi ndiyosavuta kukonza; muyenera kungoyang'ana kachitatu player pa cholozera chachabechabe, kapena yonjezerani ku thupi la mawu ovomerezeka. Ndingapangire njira yachiwiri:
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);
}
}
....
}
Chenjezo 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));
....
}
....
}
Mutha kuchotsa mzere wosavuta kuwerenga wamakhodi mumsewu umodzi ndikuthana ndi vuto ndikufufuza nullptr. Ndikupangira kusintha code motere:
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);
....
}
....
}
Chenjezo N8
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
Code ikuwoneka yachilendo kwambiri. Zikuwoneka kwa ine kuti panali vuto la typo mumkhalidwewo kapena poperekanso kusinthako ColumnHeaderPressedCurrentState mfundo zabodza.
Pomaliza
Monga tikuonera, kuphatikiza PVS-Studio static analyzer mu projekiti yanu ya TeamCity ndikosavuta. Kuti muchite izi, ndikwanira kulemba fayilo imodzi yaying'ono yosinthira. Kuyang'ana kachidindo kudzakuthandizani kuzindikira mavuto mwamsanga mutangotha ββββmsonkhano, zomwe zingathandize kuwathetsa pamene zovuta ndi mtengo wa kusintha zikadali zotsika.
Ngati mukufuna kugawana nkhaniyi ndi omvera olankhula Chingerezi, chonde gwiritsani ntchito ulalo womasulira: Vladislav Stolyarov.
Source: www.habr.com