Is e aon de na suidheachaidhean as ùire airson a bhith a’ cleachdadh an anailisiche PVS-Studio a bhith ag amalachadh le siostaman CI. Agus ged a dh’ fhaodar mion-sgrùdadh a dhèanamh air pròiseact PVS-Studio bho cha mhòr siostam amalachaidh leantainneach sam bith a-steach do dìreach beagan òrdughan, tha sinn a’ leantainn air adhart a’ dèanamh a’ phròiseas seo eadhon nas goireasaiche. Tha taic aig PVS-Studio a-nis airson toradh anailis a thionndadh gu cruth airson TeamCity - Seòrsa Sgrùdaidhean TeamCity. Chì sinn mar a tha e ag obair.
Fiosrachadh mun bhathar-bog a chaidh a chleachdadh
Fiosrachadh mun phròiseact fo sgrùdadh
Feuch sinn an gnìomh seo air eisimpleir practaigeach - dèanamaid sgrùdadh air a’ phròiseact OpenRCT2.
adjustment
Gus ùine a shàbhaladh, is dòcha gun leum mi air a’ phròiseas stàlaidh agus tòisichidh mi bhon mhionaid a bhios am frithealaiche TeamCity agam a’ ruith air a’ choimpiutair agam. Feumaidh sinn a dhol gu: localhost: {port air a shònrachadh tron phròiseas stàlaidh} (na mo chùis, localhost: 9090) agus cuir a-steach dàta ceadachaidh. Às deidh dhuinn a dhol a-steach gheibh sinn fàilte bho:
Cliog air a’ phutan Cruthaich Pròiseact. An uairsin, tagh le làimh agus lìon a-steach na raointean.
An dèidh putadh air a 'phutan Cruthaich, tha uinneag le roghainnean a’ cur fàilte oirnn.
Briogamaid Cruthaich rèiteachadh togail.
Lìon a-steach na raointean agus cliog Cruthaich. Chì sinn uinneag ag iarraidh ort siostam smachd dreach a thaghadh. Leis gu bheil na stòran mar-thà suidhichte gu h-ionadail, cliog Air adhart.
Mu dheireadh, gluaisidh sinn air adhart gu roghainnean a 'phròiseict.
Nach cuir sinn ceumannan cruinneachaidh ris, gus seo a dhèanamh cliog: Tog ceumannan -> Cuir ceum togail ris.
An seo tha sinn a 'taghadh:
- Seòrsa ruitheadair -> Loidhne-àithne
- Ruith -> Custom Script
Leis gun dèan sinn mion-sgrùdadh aig àm cur ri chèile pròiseict, bu chòir co-chruinneachadh agus mion-sgrùdadh a bhith mar aon cheum, mar sin lìon a-steach an raon Sgriobt gnàthach:
Bheir sinn sùil air ceumannan fa leth nas fhaide air adhart. Tha e cudromach nach toir e ach aon loidhne deug de chòd a bhith a’ luchdachadh an anailisiche, a’ cruinneachadh a’ phròiseict, ga sgrùdadh, a’ cur a-mach na h-aithisge agus a’ cruth.
Is e an rud mu dheireadh a dh’ fheumas sinn a dhèanamh caochladairean na h-àrainneachd a shuidheachadh, a tha mi air cuid de dhòighean a mhìneachadh gus an leughadh a leasachadh. Gus seo a dhèanamh, gluaisidh sinn air adhart: Paramadairean -> Cuir paramadair ùr ris agus cuir trì caochladairean ris:
Chan eil agad ach am putan a bhrùthadh Run anns an oisean gu h-àrd air an làimh dheis. Fhad ‘s a tha am pròiseact ga chur ri chèile agus ga sgrùdadh, innsidh mi dhut mun sgriobt.
Sgriobt gu dìreach
An toiseach, feumaidh sinn an sgaoileadh PVS-Studio as ùire a luchdachadh sìos. Airson seo bidh sinn a’ cleachdadh manaidsear pacaid Chocolatey. Dhaibhsan a tha airson barrachd fhaighinn a-mach mu dheidhinn seo, tha freagairt ann
choco install pvs-studio -y
An uairsin, leig leinn goireas tracadh togail pròiseact CLMonitor a chuir air bhog.
%CLmon% monitor –-attach
An uairsin togaidh sinn am pròiseact mar chaochladair àrainneachd MSB an e an t-slighe chun dreach de MBuild a dh’ fheumas mi a thogail
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
Nach cuir sinn a-steach an iuchair logaidh a-steach agus cead airson PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
Às deidh an togail a bhith deiseil, ruith CLMonitor a-rithist gus faidhlichean ro-ullaichte agus mion-sgrùdadh statach a ghineadh:
%CLmon% analyze -l "c:ptest.plog"
An uairsin cleachdaidh sinn goireas eile bhon sgaoileadh againn. Bidh PlogConverter ag atharrachadh aithisg bho chruth àbhaisteach gu cruth a tha sònraichte do TeamCity. Taing dha seo, bidh e comasach dhuinn fhaicinn gu dìreach san uinneag togail.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
Is e an ceum mu dheireadh an aithisg cruth a thaisbeanadh a-steach stdout, far am bi am parser TeamCity air a thogail.
type "C:tempptest.plog_TeamCity.txt"
Còd an sgriobt slàn:
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"
Anns an eadar-ama, tha co-chruinneachadh agus mion-sgrùdadh a ’phròiseict air a chrìochnachadh gu soirbheachail, is urrainn dhuinn a dhol chun tab pròiseactan agus ubeditsya anns an etom.
A-nis leig dhuinn briogadh air Sgrùdaidhean Iomlanairson a dhol gu aithisg an anailisiche fhaicinn:
Tha rabhaidhean air an cruinneachadh a rèir àireamhan riaghailt breithneachaidh. Gus seòladh tron chòd, feumaidh tu briogadh air an àireamh loidhne leis an rabhadh. Ma bhriogas tu air a’ chomharra ceist san oisean gu h-àrd air an làimh dheis, fosglaidh tu taba ùr le sgrìobhainnean. Faodaidh tu cuideachd seòladh tron chòd le bhith a 'briogadh air an àireamh loidhne leis an rabhadh analyzer. Tha e comasach seòladh bho choimpiutair iomallach nuair a bhios tu a’ cleachdadh SourceTreeRoot comharraiche. Faodaidh neach sam bith aig a bheil ùidh anns a 'mhodh-obrachaidh seo den anailisiche eòlas a chur air an earrann iomchaidh
A’ coimhead air toraidhean an anailisiche
A-nis gu bheil sinn deiseil a’ cleachdadh agus a’ rèiteachadh an togalaich, leig dhuinn sùil a thoirt air rabhaidhean inntinneach a lorgar sa phròiseact air a bheil sinn a’ coimhead.
Rabhadh 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;
}
Mhothaich an anailisiche mearachd às deidh dha cuimhne a chuir a-steach gu dinamach Cruthaich Rud, nuair a thachras eisgeachd, chan eil an cuimhne air a ghlanadh, agus bidh aodion cuimhne a’ tachairt.
Rabhadh 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),
....
};
Is e glè bheag de dhaoine a bharrachd air anailisiche statach a b’ urrainn a dhol seachad air an deuchainn aire seo. Tha an eisimpleir leth-bhreac seo math airson an dearbh adhbhar seo.
Rabhaidhean N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
Gu dearbh, chan eil e an-còmhnaidh mearachd a bhith a’ cleachdadh caochladair leis an aon ainm sa chlas bhunaiteach agus san t-sliochd. Ach, tha teicneòlas oighreachd fhèin a 'gabhail ris gu bheil a h-uile raon den chlas phàrant an làthair anns a' chlas chloinne. Le bhith ag ainmeachadh raointean leis an aon ainm san oighre, bidh sinn a’ cruthachadh troimh-chèile.
Rabhadh N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
Bheir sinn sùil nas mionaidiche. Briseadh dealbh Stiùireadh/8 bidh e ceàrr ma tha dealbh-stiùiridh tha e anns an raon bho -7 gu 7. An dàrna pàirt: (imageDirection/8) !=3 seicichean dealbh-stiùiridh airson a bhith taobh a-muigh an raoin: bho -31 gu -24 agus bho 24 gu 31, fa leth. Tha e a’ coimhead car neònach dhomh àireamhan a sgrùdadh airson an toirt a-steach do raon sònraichte san dòigh seo agus, eadhon ged nach eil mearachd anns a’ phìos còd seo, bhithinn a’ moladh na cumhachan sin ath-sgrìobhadh airson a bhith nas soilleire. Dhèanadh seo beatha mòran na b’ fhasa dha na daoine a bhiodh a’ leughadh agus a’ cumail a’ chòd seo.
Rabhadh 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;
....
}
....
}
Tha e coltach gun d’ fhuaireadh a’ chriomag còd seo le dì-chruinneachadh. An uairsin, a 'breithneachadh leis a' bheachd a chaidh fhàgail, chaidh pàirt den chòd neo-obrachail a thoirt air falbh. Ach, tha obair no dhà air fhàgail fhathast Id cùrsair, rud nach eil a’ dèanamh mòran ciall cuideachd.
Rabhadh 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); // <=
}
....
}
Tha an còd seo gu math furasta a cheartachadh; cha leig thu leas ach sgrùdadh a dhèanamh air an treas uair cluicheadair gu puing null, no cuir ri corp na h-aithris chumha. Tha mi a’ moladh an dàrna roghainn:
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);
}
}
....
}
Rabhadh 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));
....
}
....
}
Gheibh thu cuidhteas loidhne còd a tha doirbh a leughadh ann an aon thuit swoop agus fuasgladh fhaighinn air an duilgheadas le sgrùdadh airson nullptr. Tha mi a’ moladh an còd atharrachadh mar a leanas:
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);
....
}
....
}
Rabhadh N8
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
Tha an còd a 'coimhead gu math neònach. Tha e coltach riumsa gun robh typo an dàrna cuid san t-suidheachadh no nuair a bha mi ag ath-shònrachadh an caochladair ColumnHeaderPressedStateCurrent ciall ceàrr.
co-dhùnadh
Mar a chì sinn, tha e gu math sìmplidh an anailisiche statach PVS-Studio a thoirt a-steach don phròiseact TeamCity agad. Gus seo a dhèanamh, tha e gu leòr dìreach aon fhaidhle rèiteachaidh beag a sgrìobhadh. Le bhith a 'sgrùdadh a' chòd leigidh sin dhut duilgheadasan a chomharrachadh dìreach às deidh co-chruinneachadh, a chuidicheas le bhith gan cur às nuair a tha iom-fhillteachd agus cosgais nan atharrachaidhean fhathast ìosal.
Ma tha thu airson an artaigil seo a cho-roinn le luchd-èisteachd Beurla, cleachd an ceangal eadar-theangachaidh: Vladislav Stolyarov.
Source: www.habr.com