Ny iray amin'ireo toe-javatra ankehitriny indrindra amin'ny fampiasana ny PVS-Studio analyzer dia ny fampidirana azy amin'ny rafitra CI. Ary na dia azo amboarina amin'ny baiko vitsivitsy monja aza ny famakafakana ny tetikasa PVS-Studio avy amin'ny rafitra fampidirana mitohy rehetra, dia manohy manao izany fomba izany ho mora kokoa izahay. PVS-Studio izao dia manana fanohanana amin'ny famadihana ny vokatra analyse ho endrika ho an'ny TeamCity - TeamCity Inspections Type. Andeha hojerentsika ny fomba fiasa.
Fampahafantarana momba ny rindrambaiko ampiasaina
Fampahafantarana momba ny tetikasa ianarana
Andao andramana ity fampiasa ity amin'ny ohatra azo ampiharina - andao hamakafaka ny tetikasa OpenRCT2.
fanitsiana
Mba hitsitsiana fotoana dia mety handalo ny fizotran'ny fametrahana aho ary manomboka amin'ny fotoana ananako ny mpizara TeamCity mandeha amin'ny solosainako. Mila mandeha any amin'ny: localhost:{serana voatondro nandritra ny dingana fametrahana} (raha ny ahy, localhost:9090) ary ampidiro ny angon-drakitra fahazoan-dΓ lana. Aorian'ny fidirana dia hiarahaba antsika:
Tsindrio ny bokotra Create Project. Manaraka, mifidiana Manually ary fenoy ny saha.
Rehefa avy nanindry ny bokotra mamorona, miarahaba antsika amin'ny varavarankely misy filaharana.
Aleo tsindrio Mamorona fanamboarana fananganana.
Fenoy ny saha dia tsindrio mamorona. Mahita varavarankely mangataka anao hisafidy rafitra fanaraha-maso dikan-teny izahay. Satria efa hita eo an-toerana ny loharano, tsindrio Skip.
Farany, mandroso mankany amin'ny firafitry ny tetikasa isika.
Andeha isika hanampy dingana fivoriambe, hanaovana ity tsindrio ity: Dingana fananganana -> Ampio dingana fananganana.
Eto isika misafidy:
- Karazana mpihazakazaka -> Command Line
- Run -> Custom Script
Koa satria hanao famakafakana isika mandritra ny fanangonana tetikasa, ny fivoriambe sy ny fanadihadiana dia tokony ho dingana iray, ka fenoy ny saha Custom Script:
Hojerentsika ny dingana tsirairay avy. Zava-dehibe ny famenoana ny mpandinika, ny fanangonana ny tetikasa, ny famakafakana azy, ny famoahana ny tatitra ary ny fandrafetana azy dia tsy misy afa-tsy andalana iraika ambin'ny folo.
Ny zavatra farany tokony hataontsika dia ny mametraka ny fari-piainan'ny tontolo iainana, izay nosoratako ny fomba sasany hanatsarana ny fahaiza-mamaky azy ireo. Mba hanaovana izany, andao hiroso amin'ny: Parameter -> Manampia paramètre vaovao ary ampio variables telo:
Ny hany ataonao dia ny manindry ny bokotra Run eo amin'ny zoro ambony havanana. Raha angonina sy anadihadiana ny tetikasa dia holazaiko aminao ny momba ny script.
script mivantana
Voalohany, mila misintona ny fizarana PVS-Studio farany isika. Amin'izany dia mampiasa ny mpitantana fonosana Chocolatey izahay. Ho an'ireo izay te-hahafantatra bebe kokoa momba izany dia misy ny mifanandrify aminy
choco install pvs-studio -y
Manaraka, andao hanomboka ny tetikasa CLMonitor manorina fitaovana fanaraha-maso.
%CLmon% monitor β-attach
Avy eo dia hanangana ny tetikasa ho toy ny fiovan'ny tontolo iainana MSB dia ny lalana mankany amin'ny version of MSBuild izay ilaiko amboarina
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
Andao hiditra ny fidirana sy ny fanalahidin'ny fahazoan-dΓ lana ho an'ny PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
Rehefa vita ny fananganana dia avereno indray ny CLMonitor hamorona rakitra efa voaomana sy famakafakana static:
%CLmon% analyze -l "c:ptest.plog"
Avy eo dia hampiasa fitaovana hafa avy amin'ny fizaranay izahay. PlogConverter dia mamadika tatitra avy amin'ny endrika mahazatra ho endrika manokana TeamCity. Noho izany dia ho afaka hijery azy mivantana amin'ny varavarankely fananganana isika.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
Ny dingana farany dia ny fampisehoana ny tatitra voalamina ao stdout, izay horaisin'ny mpizara TeamCity.
type "C:tempptest.plog_TeamCity.txt"
Kaody script feno:
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"
Mandritra izany fotoana izany dia vita soa aman-tsara ny fivoriambe sy ny famakafakana ny tetikasa, afaka mandeha any amin'ny tabilao isika Projects ary ataovy azo antoka izany.
Andeha isika tsindrio eo Fanaraha-maso Totalhandeha hijery ny tatitra analyzer:
Ny fampitandremana dia navondrona araka ny laharan'ny fitsipika momba ny diagnostika. Raha te hivezivezy amin'ny kaody ianao dia mila manindry ny laharan'ny tsipika miaraka amin'ny fampitandremana. Ny fipihana ny marika fanontaniana eo amin'ny zoro ambony havanana dia hanokatra tabilao vaovao misy antontan-taratasy ho anao. Azonao atao ihany koa ny mivezivezy amin'ny kaody amin'ny fipihana ny laharan'ny tsipika miaraka amin'ny fampitandremana analyzer. Ny fitetezana avy amin'ny solosaina lavitra dia azo atao rehefa mampiasa SourceTreeRoot marika. Na iza na iza liana amin'ity fomba fiasan'ny mpandinika ity dia afaka mahafantatra ny fizarana mifandraika amin'izany
Mijery ny valin'ny mpandinika
Ankehitriny rehefa vita ny fametrahana sy ny fanamboarana ny fananganana, andeha hojerentsika ireo fampitandremana mahaliana hita ao amin'ny tetikasa izay hojerentsika.
Fampitandremana 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;
}
Ny analyse dia nahatsikaritra lesoka izay taorian'ny nametrahana ny fitadidiana amin'ny fomba mavitrika CreateObject, rehefa misy maningana, dia tsy voafafa ny fitadidiana, ary misy fitadidiana mipoitra.
Fampitandremana 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),
....
};
Vitsy ny olona afa-tsy ny mpanadihady static no afaka nandalo an'io fitsapana fitandremana io. Ity ohatra kopia-mametaka ity dia tsara noho io antony io indrindra.
Fampitandremana N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
Mazava ho azy fa tsy fahadisoana foana ny fampiasana fari-piainana mitovy anarana amin'ny kilasy fototra sy amin'ny taranaka. Na izany aza, ny teknΓ΄lΓ΄jian'ny lova dia mihevitra fa ny sehatra rehetra amin'ny kilasin'ny ray aman-dreny dia misy ao amin'ny kilasin'ny ankizy. Amin'ny fanambarana saha misy anarana mitovy amin'ny mpandova dia miteraka fisafotofotoana izahay.
Fampitandremana N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
Andeha hojerentsika akaiky. maneho Hevitra saryDirection/8 ho diso raha imageDirection eo amin'ny -7 ka hatramin'ny 7. Fizarana faharoa: (saryDirection / 8) != 3 taratasim-bola imageDirection ho any ivelan'ny faritra: manomboka amin'ny -31 ka hatramin'ny -24 ary avy amin'ny 24 ka hatramin'ny 31. Toa hafahafa amiko ny manamarina ny isa ho fampidirana amin'ny sehatra iray amin'ity fomba ity ary, na dia tsy misy hadisoana aza amin'ity fehezan-dalΓ na ity, dia manoro hevitra aho ny hanoratra indray ireo fepetra ireo mba ho mazava kokoa. Izany dia hanamora kokoa ny fiainana ho an'ireo izay mamaky sy mitazona ity code ity.
Fampitandremana 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;
....
}
....
}
Ity sombin-kaody ity dia azo inoana fa azo tamin'ny famongorana. Avy eo, raha jerena ny fanehoan-kevitra navela dia nesorina ny ampahany amin'ny code tsy miasa. Na izany aza, mbola misy hetsika roa tavela cursorId, izay tsy dia misy dikany loatra koa.
Fampitandremana 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); // <=
}
....
}
Mora ny manitsy ity kaody ity; mila manamarina azy fanintelony fotsiny ianao mpilalao amin'ny tondro tsy misy dikany, na ampio amin'ny vatan'ny fanambarana misy fepetra. Manoro ny safidy faharoa aho:
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);
}
}
....
}
Fampitandremana 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));
....
}
....
}
Azonao atao ny manala ny kaody sarotra vakiana amin'ny fotoana iray ary mamaha ny olana amin'ny fanamarinana nullptr. Manoro hevitra aho hanova ny kaody toy izao:
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);
....
}
....
}
Fampitandremana N8
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
Toa hafahafa ny kaody. Amiko dia nisy typo na teo amin'ny toe-javatra na tamin'ny fotoana namerenana ny fari-piainana ColumnHeaderPressedCurrentState hevitra diso.
famaranana
Araka ny hitantsika, ny fampidirana ny PVS-Studio static analyzer amin'ny tetikasa TeamCity dia tsotra. Mba hanaovana izany dia ampy ny manoratra rakitra fanamafisana kely fotsiny. Ny fanamarinana ny kaody dia ahafahanao mamantatra ny olana avy hatrany aorian'ny fivoriambe, izay hanampy amin'ny fanafoanana azy ireo raha mbola ambany ny fahasarotana sy ny vidin'ny fanovana.
Raha te hizara ity lahatsoratra ity amin'ny mpihaino miteny anglisy ianao dia ampiasao ny rohy fandikana: Vladislav Stolyarov.
Source: www.habr.com