E 'ngoe ea maemo a hajoale a ho sebelisa analyzer ea PVS-Studio ke ho hokahana ha eona le litsamaiso tsa CI. Mme leha tlhahlobo ea projeke ea PVS-Studio ho tsoa ho sistimi efe kapa efe e tsoelang pele ea ho kopanya e ka hahuoa ka litaelo tse 'maloa feela, re ntse re tsoela pele ho etsa hore ts'ebetso ena e be bonolo le ho feta. Hona joale PVS-Studio e na le ts'ehetso ea ho fetolela tlhahiso ea analyzer hore e be sebopeho sa TeamCity - Mofuta oa Tlhahlobo oa TeamCity. A re bone hore na e sebetsa joang.
Lintlha tse mabapi le software e sebelisitsoeng
Lintlha tse mabapi le morero o ntseng o ithutoa
Ha re leke ts'ebetso ena ho mohlala o sebetsang - ha re hlahlobeng morero oa OpenRCT2.
phetoho
E le ho boloka nako, mohlomong ke tla tlōla mokhoa oa ho kenya 'me ke qale ho tloha ha ke e-na le seva sa TeamCity se sebetsang khomphuteng ea ka. Re hloka ho ea ho: localhost:{port e boletsoeng nakong ea ts'ebetso ea ho kenya} (tabeng ea ka, localhost:9090) 'me u kenye lintlha tsa tumello. Ka mor'a ho kena re tla amoheloa ke:
Tobetsa konopo ea Create Project. E latelang, khetha Ka letsoho 'me u tlatse libaka.
Ka mor'a ho tobetsa konopo Create, re lumelisoa ke fensetere e nang le litlhophiso.
Ha re tobetse Etsa tlhophiso ea ho haha.
Tlatsa masimo mme o tobetse Create. Re bona fensetere e u kopang hore u khethe mokhoa oa ho laola mofuta. Kaha mehloli e se e fumaneha sebakeng sa heno, tobetsa Skip.
Qetellong, re fetela ho litlhophiso tsa morero.
Ha re kenye mehato ea kopano, ho etsa tlanya ena: Haha mehato -> Eketsa mohato oa ho haha.
Mona re khetha:
- Mofuta oa semathi -> Mola oa Taelo
- Matha -> Custom Script
Kaha re tla etsa tlhahlobo nakong ea ho bokella morero, kopano le tlhahlobo e lokela ho ba mohato o le mong, kahoo tlatsa tšimo Script Script:
Re tla sheba mehato ea motho ka mong hamorao. Ke habohlokoa hore ho kenya analyzer, ho bokella morero, ho e hlahloba, ho ntša tlaleho le ho e hlophisa ho nka mela e leshome le motso o mong feela oa khoutu.
Ntho ea ho qetela eo re lokelang ho e etsa ke ho beha mefuta-futa ea tikoloho, eo ke e hlalositseng litsela tse ling tsa ho ntlafatsa ho bala ha tsona. Ho etsa sena, ha re tsoeleng pele: Liparamente -> Kenya paramente e ncha ebe o eketsa mefuta e meraro:
Seo u lokelang ho se etsa ke ho tobetsa konopo Matha sekhutlong se kaholimo ho le letona. Ha morero o ntse o bokelloa le ho hlahlojoa, ke tla u bolella ka script.
Script ka ho toba
Taba ea pele, re hloka ho khoasolla phepelo ea morao-rao ea PVS-Studio. Bakeng sa sena re sebelisa mookameli oa sephutheloana sa Chocolatey. Bakeng sa ba batlang ho tseba haholoanyane ka sena, ho na le e tsamaisanang
choco install pvs-studio -y
Ka mor'a moo, ha re qaleng ts'ebeliso ea ts'ebeliso ea projeke ea CLMonitor.
%CLmon% monitor –-attach
Joale re tla aha morero ona e le mofuta oa tikoloho MSB ke tsela ea mofuta oa MSBuild eo ke hlokang ho e haha
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
Ha re kenye senotlolo sa ho kena le laesense bakeng sa PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
Kamora hore moaho o phetheloe, tsamaisa CMonitor hape ho hlahisa lifaele tse fetisitsoeng pele le tlhahlobo e tsitsitseng:
%CLmon% analyze -l "c:ptest.plog"
Joale re tla sebelisa sesebelisoa se seng ho tloha kabong ea rona. PlogConverter e fetolela tlaleho ho tloha sebopehong se tloaelehileng ho ea ho sebopeho se ikhethileng sa TeamCity. Ka lebaka la sena, re tla khona ho e sheba ka kotloloho fensetereng ea kaho.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
Mohato oa ho qetela ke ho hlahisa tlaleho e hlophisitsoeng ho stout, moo e tla nkuoa ke mohlahlobi oa TeamCity.
type "C:tempptest.plog_TeamCity.txt"
Khoutu e felletseng ea mongolo:
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"
Ho sa le joalo, kopano le tlhahlobo ea morero e phethiloe ka katleho, re ka ea ho tab Projects le убедиться в этом.
Joale ha re tobetse Kakaretso ea Litlhahloboho ea ho sheba tlaleho ea analyzer:
Litemoso li hlophisoa ka linomoro tsa melao ea tlhahlobo. Ho tsamaea ka khoutu, o hloka ho tobetsa nomoro ea mohala ka temoso. Ho tobetsa letšoao la potso hukung e kaholimo ho le letona ho tla u bulela tab e ncha e nang le litokomane. U ka boela ua tsamaea ka khoutu ka ho tobetsa nomoro ea mohala ka temoso ea analyzer. Ho tsamaea ho tsoa komporong e hole hoa khoneha ha u sebelisa SourceTreeRoot lesupa. Mang kapa mang ea thahasellang mokhoa ona oa ts'ebetso ea analyzer a ka tloaelana le karolo e lumellanang
Ho sheba liphetho tsa mohlahlobi
Kaha joale re se re qetile ho tsamaisa le ho hlophisa moaho, ha re shebeng litemoso tse khahlisang tse fumanoang morerong oo re o shebileng.
Tlhokomeliso 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 e hlokometse phoso eo kamora ho fana ka memori ka matla CreateObject, ha mokhelo o hlaha, memori ha e hlakoloe, mme ho dutla memoring.
Tlhokomeliso 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),
....
};
Ke batho ba 'maloa ntle le setsebi sa static analyzer ba ka khonang ho etsa tlhahlobo ena ea ho ela hloko. Mohlala ona oa kopi-paste o nepahetse ka lebaka lena.
Litemoso N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
Ha e le hantle, ho sebelisa phetoho e nang le lebitso le tšoanang sehlopheng sa motheo le ho setloholo hase kamehla phoso. Leha ho le joalo, theknoloji ea lefa ka boeona e nka hore likarolo tsohle tsa sehlopha sa motsoali li teng sehlopheng sa bana. Ka ho phatlalatsa masimo a nang le lebitso le le leng ho mojalefa, re hlahisa pherekano.
Tlhokomeliso N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
A re hlahlobeng ka hloko. Polelo ImageDirection/8 e tla ba leshano haeba setšoantšoDirection e maemong a ho tloha ho -7 ho isa ho 7. Karolo ea bobeli: (ImageDirection / 8) != 3 licheke setšoantšoDirection bakeng sa ho ba ka ntle ho moeli: ho tloha ho -31 ho ea ho -24 le ho tloha 24 ho ea ho 31, ka ho latellana. Ho bonahala ho makatsa ho 'na ho hlahloba linomoro bakeng sa ho kenyeletsoa mofuteng o itseng ka tsela ena, le haeba ho se na phoso karolong ena ea khoutu, ke tla khothaletsa ho ngola maemo ana hape hore a hlake haholoanyane. Sena se ne se tla nolofatsa bophelo ho batho ba neng ba tla bala le ho boloka khoutu ena.
Tlhokomeliso 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;
....
}
....
}
Sekhechana sena sa khoutu ho ka etsahala hore ebe se fumanoe ka ho arohana. Joale, ho ahlola ka maikutlo a setseng, karolo ea khoutu e sa sebetseng e ile ea tlosoa. Leha ho le joalo, ho ntse ho na le ts'ebetso e 'maloa e setseng cursorId, eo le eona e sa utloahaleng haholo.
Tlhokomeliso 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); // <=
}
....
}
Khoutu ena e bonolo haholo ho e lokisa; o hloka feela ho e hlahloba khetlo la boraro sebapala ho pontshi e se nang thuso, kapa o e kenye mmeleng wa polelo e nang le maemo. Ke khothaletsa khetho ea bobeli:
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);
}
}
....
}
Tlhokomeliso 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));
....
}
....
}
U ka tlosa mohala o thata ho bala oa khoutu ka nako e le 'ngoe ebe u rarolla bothata ka ho hlahloba nullptr. Ke khothaletsa ho fetola khoutu ka tsela e latelang:
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);
....
}
....
}
Tlhokomeliso N8
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
Khoutu e shebahala e makatsa haholo. Ho 'na ho bonahala eka ho ne ho e-na le bothata ba ho thaepa boemong boo kapa ha ho ne ho abeloa phetoho ColumnHeaderPressedCurrentState boleng bohata.
fihlela qeto e
Joalo ka ha re bona, ho kopanya analyzer ea PVS-Studio static projeke ea hau ea TeamCity ho bonolo haholo. Ho etsa sena, ho lekane ho ngola faele e le 'ngoe feela e nyane ea tlhophiso. Ho hlahloba khoutu ho tla u lumella ho khetholla mathata hang ka mor'a kopano, e leng ho tla thusa ho a felisa ha ho rarahana le litšenyehelo tsa liphetoho li ntse li le tlaase.
Haeba u batla ho arolelana sehlooho sena le bamameli ba buang Senyesemane, ka kopo sebelisa sehokelo sa phetolelo: Vladislav Stolyarov.
Source: www.habr.com