Ceann de na cásanna is reatha maidir le húsáid an anailísí PVS-Studio is ea é a chomhtháthú le córais CI. Agus cé gur féidir an anailís ar thionscadal PVS-Studio ó beagnach aon chóras comhtháthaithe leanúnach a chur san áireamh i roinnt orduithe, leanaimid ar aghaidh ag déanamh an phróisis seo níos áisiúla fós. Tá tacaíocht ag PVS-Studio anois chun aschur anailíseora a thiontú go formáid do TeamCity - Cineál Iniúchtaí TeamCity. A ligean ar a fheiceáil conas a oibríonn sé.
Eolas faoi na bogearraí a úsáidtear
Eolas faoin tionscadal atá á staidéar
Déanaimis iarracht an fheidhmiúlacht seo ar shampla praiticiúil - déanaimis anailís ar an tionscadal OpenRCT2.
coigeartú
Chun am a shábháil, is dócha go scipfidh mé an próiseas suiteála agus go dtosóidh mé ón nóiméad a mbeidh an freastalaí TeamCity agam ag rith ar mo ríomhaire. Ní mór dúinn dul go: localhost: {port sonraithe le linn an phróisis suiteála} (i mo chás, localhost: 9090) agus sonraí údaraithe a chur isteach. Tar éis dul isteach cuirfimid fáilte roimh:
Cliceáil ar an gcnaipe Cruthaigh Tionscadal. Ansin, roghnaigh de láimh agus líon isteach na réimsí.
Tar éis an cnaipe a bhrú Cruthaigh, cuirtear fáilte roimh fhuinneog le socruithe.
A ligean ar cliceáil Cruthaigh cumraíocht tógála.
Líon isteach na réimsí agus cliceáil Cruthaigh. Feicimid fuinneog ag iarraidh ort córas rialaithe leagan a roghnú. Ós rud é go bhfuil na foinsí lonnaithe go háitiúil cheana féin, cliceáil Skip to.
Ar deireadh, bogaimid ar aghaidh go dtí na socruithe tionscadail.
Cuirimis céimeanna tionóil leis, chun an cliceáil seo a dhéanamh: Céimeanna Tógáil -> Cuir céim thógála leis.
Anseo roghnaíonn muid:
- Cineál rádala -> Líne Ceannais
- Rith -> Script Chustaim
Ós rud é go ndéanfaimid anailís le linn tiomsú tionscadail, ba cheart go mbeadh cóimeáil agus anailís mar chéim amháin, mar sin líon isteach an réimse Script Chustaim:
Breathnóimid ar chéimeanna aonair níos déanaí. Tá sé tábhachtach nach dtógann sé ach aon líne déag de chód chun an anailísí a luchtú, an tionscadal a chur le chéile, é a anailísiú, an tuarascáil a aschur agus a fhormáidiú.
Is é an rud deireanach is gá dúinn a dhéanamh ná na hathróga timpeallachta a shocrú, a leag mé amach roinnt bealaí chun a n-inléiteacht a fheabhsú. Chun seo a dhéanamh, bogaimis ar aghaidh: Paraiméadair -> Cuir paraiméadar nua leis agus cuir trí athróg leis:
Níl le déanamh agat ach an cnaipe a bhrú Rith sa chúinne uachtarach ar dheis. Agus an tionscadal á chur le chéile agus á anailísiú, inseoidh mé duit faoin script.
Go díreach script
Ar dtús, ní mór dúinn an dáileadh PVS-Studio is déanaí a íoslódáil. Chun seo a úsáid againn an bainisteoir pacáiste Chocolatey. Dóibh siúd ar mian leo tuilleadh eolais a fháil faoi seo, tá comhfhreagrach ann
choco install pvs-studio -y
Ar aghaidh, cuirfimid fóntais rianaithe tógála tionscadal CLMonitor ar aghaidh.
%CLmon% monitor –-attach
Ansin tógfaimid an tionscadal mar athróg timpeallachta MSB is é an cosán go dtí an leagan de MBuild is gá dom a thógáil
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
Cuirimis an logáil isteach agus an eochair cheadúnais le haghaidh PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
Tar éis an tógáil a bheith críochnaithe, reáchtáil CLMonitor arís chun comhaid réamhphróiseáilte agus anailís statach a ghiniúint:
%CLmon% analyze -l "c:ptest.plog"
Ansin úsáidfimid áirgiúlacht eile ónár dáileadh. Tiontaíonn PlogConverter tuarascáil ó fhormáid chaighdeánach go formáid a bhaineann go sonrach le TeamCity. A bhuí leis seo, beimid in ann é a fheiceáil go díreach sa bhfuinneog tógála.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
Is é an chéim dheireanach ná an tuarascáil formáidithe a thaispeáint i stdout, áit a bpiocfaidh parsálaí TeamCity é.
type "C:tempptest.plog_TeamCity.txt"
Cód iomlán scripte:
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"
Idir an dá linn, tá an tionól agus an anailís ar an tionscadal críochnaithe go rathúil, is féidir linn dul go dtí an cluaisín Tionscadail agus déan cinnte de.
Anois, a ligean ar cliceáil ar Cigireachtaí Iomlánchun féachaint ar thuarascáil an anailíseora:
Déantar rabhaidh a ghrúpáil de réir uimhreacha riail diagnóiseacha. Chun dul tríd an gcód, ní mór duit cliceáil ar an uimhir líne leis an rabhadh. Má chliceálann tú ar an comhartha ceiste sa chúinne uachtarach ar dheis osclófar cluaisín nua duit le doiciméadú. Is féidir leat nascleanúint a dhéanamh tríd an gcód freisin trí chliceáil ar an uimhir líne leis an rabhadh anailísí. Is féidir nascleanúint ó ríomhaire cianda nuair a bhíonn tú ag úsáid SourceTreeRoot marcóir. Is féidir le duine ar bith a bhfuil suim aige sa mhodh oibríochta seo den anailíseoir eolas a chur ar an rannán comhfhreagrach
Ag féachaint ar thorthaí an anailíseora
Anois agus an tógáil críochnaithe á imscaradh agus á chumrú againn, déanaimis féachaint ar roinnt rabhaidh suimiúla a fuarthas sa tionscadal a bhfuilimid ag féachaint air.
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;
}
Thug an anailíseoir earráid faoi deara tar éis dó an chuimhne a leithdháileadh go dinimiciúil CruthaighObject, nuair a tharlaíonn eisceacht, ní dhéantar an chuimhne a ghlanadh, agus tarlaíonn sceitheadh cuimhne.
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 beag duine seachas anailísí statach a d’fhéadfadh pas a fháil sa tástáil aireach seo. Tá an sampla cóip-ghreamú seo go maith ar an gcúis seo go beacht.
Rabhaidh N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
Ar ndóigh, ní earráid i gcónaí é athróg leis an ainm céanna a úsáid sa bhunrang agus sa sliocht. Mar sin féin, glacann teicneolaíocht oidhreachta féin leis go bhfuil réimsí uile an ranga tuismitheora i láthair sa rang leanaí. Trí réimsí leis an ainm céanna san oidhre a dhearbhú, cruthaímid mearbhall.
Rabhadh N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
A ligean ar ghlacadh le breathnú níos dlúithe. Léiriú íomháTreoir/8 beidh sé bréagach má treoshuíomh íomhá atá sa raon ó -7 go 7. An dara cuid: (imageDirection/8) !=3 seiceálacha treoshuíomh íomhá as a bheith lasmuigh den raon: ó -31 go -24 agus ó 24 go 31, faoi seach. Is cosúil go bhfuil sé aisteach go leor dom uimhreacha a sheiceáil lena gcuimsiú i raon áirithe ar an mbealach seo agus, fiú mura bhfuil aon earráid sa phíosa cód seo, mholfainn na coinníollacha seo a athscríobh le bheith níos soiléire. Dhéanfadh sé seo an saol i bhfad níos éasca do na daoine a léifeadh agus a choimeádfadh an có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;
....
}
....
}
Is dócha gur trí dhí-thiomsú a fuarthas an blúire cód seo. Ansin, de réir an nóta tráchta a fágadh, baineadh cuid den chód neamhoibríoch. Mar sin féin, tá cúpla oibríocht fágtha fós Id cúrsóra, rud nach bhfuil mórán ciall leo freisin.
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); // <=
}
....
}
Is furasta an cód seo a cheartú; ní gá duit ach é a sheiceáil an tríú huair imreoir chuig pointeoir nialasach, nó cuir le corp an ráitis choinníollaigh é. Mholfainn an dara rogha:
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));
....
}
....
}
Is féidir leat fáil réidh le líne chóid atá deacair le léamh i gceann amháin swoop agus an fhadhb a réiteach le seiceáil le haghaidh nullptr. Molaim an cód a athrú mar seo 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();
}
}
Breathnaíonn an cód aisteach go leor. Feictear dom go raibh typo sa riocht nó nuair a bhí an athróg á athshannadh ColumnHeaderPressedCurrentState luachanna bréagach.
Aschur
Mar is féidir linn a fheiceáil, tá comhtháthú an anailísí statach PVS-Studio isteach i do thionscadal TeamCity simplí go leor. Chun seo a dhéanamh, is leor comhad cumraíochta beag amháin a scríobh. Tabharfaidh seiceáil an chóid deis duit fadhbanna a aithint díreach tar éis an tionóil, rud a chabhróidh leat iad a dhíchur nuair a bhíonn castacht agus costas na n-athruithe fós íseal.
Más mian leat an t-alt seo a roinnt le lucht féachana Béarla, bain úsáid as an nasc aistriúcháin: Vladislav Stolyarov.
Foinse: will.com