Ib qho ntawm cov xwm txheej tam sim no rau kev siv PVS-Studio analyzer yog nws kev koom ua ke nrog CI systems. Thiab txawm hais tias kev tshuaj xyuas ntawm PVS-Studio qhov project los ntawm yuav luag txhua qhov kev sib koom ua ke txuas ntxiv tuaj yeem ua rau hauv ob peb cov lus txib, peb txuas ntxiv ua cov txheej txheem no yooj yim dua. PVS-Studio tam sim no muaj kev txhawb nqa rau kev hloov pauv cov zis tso tawm rau hauv ib hom ntawv rau TeamCity - TeamCity Inspections Hom. Cia peb saib seb nws ua haujlwm li cas.
Cov ntaub ntawv hais txog software siv
Cov ntaub ntawv hais txog qhov project tab tom kawm
Cia peb sim ua qhov haujlwm no ntawm qhov piv txwv zoo - cia peb txheeb xyuas qhov project OpenRCT2.
hloov
Txhawm rau txuag sijhawm, Kuv yuav zaum hla txoj kev teeb tsa thiab pib txij lub sijhawm thaum kuv muaj TeamCity server khiav hauv kuv lub computer. Peb yuav tsum tau mus rau: localhost:{chaw nres nkoj teev thaum lub sijhawm teeb tsa} (hauv kuv rooj plaub, localhost: 9090) thiab nkag mus rau cov ntaub ntawv tso cai. Tom qab nkag mus, peb yuav tau txais tos los ntawm:
Nyem rau ntawm pob Tsim Project. Tom ntej no, xaiv Manually thiab sau rau hauv cov teb.
Tom qab nias lub pob tsim, peb txais tos los ntawm lub qhov rais nrog kev teeb tsa.
Wb nias Tsim tsim configuration.
Sau rau hauv cov teb thiab nyem tsim. Peb pom ib lub qhov rais hais kom koj xaiv ib tug version tswj system. Txij li thaum cov peev txheej twb nyob hauv zos, nyem Hla.
Thaum kawg, peb txav mus rau qhov project nqis.
Cia peb ntxiv cov kauj ruam sib dhos, ua qhov nyem no: Tsim cov kauj ruam -> Ntxiv cov kauj ruam tsim.
Ntawm no peb xaiv:
- Khiav hom -> Kab hais kom ua
- Khiav -> Custom Script
Txij li thaum peb yuav ua qhov kev soj ntsuam thaum lub sijhawm ua tiav qhov project, kev sib dhos thiab kev soj ntsuam yuav tsum yog ib kauj ruam, yog li sau rau hauv daim teb Cov Tsab Ntawv Kev Cai:
Peb yuav saib tus kheej cov kauj ruam tom qab. Nws yog ib qho tseem ceeb uas thauj cov khoom ntsuas, sib sau ua ke qhov project, txheeb xyuas nws, tso cov ntawv tshaj tawm thiab formatting nws tsuas yog kaum ib kab ntawm cov lej.
Qhov kawg uas peb yuav tsum tau ua yog teeb tsa ib puag ncig hloov pauv, uas kuv tau piav qhia qee txoj hauv kev los txhim kho lawv cov kev nyeem ntawv. Txhawm rau ua qhov no, cia peb mus rau: Parameters -> Ntxiv qhov tshiab thiab ntxiv peb qhov sib txawv:
Txhua yam koj tau ua yog nias lub pob khiav nyob rau sab xis sab xis. Thaum qhov project tab tom sib sau ua ke thiab txheeb xyuas, kuv yuav qhia koj txog tsab ntawv.
Tsab ntawv ncaj qha
Ua ntej, peb yuav tsum rub tawm qhov tseeb PVS-Studio faib. Rau qhov no peb siv Chocolatey pob tus thawj tswj. Rau cov neeg uas xav paub ntau ntxiv txog qhov no, muaj qhov sib xws
choco install pvs-studio -y
Tom ntej no, cia peb tso tawm CLMonitor qhov project tsim cov khoom siv taug qab.
%CLmon% monitor β-attach
Tom qab ntawd peb yuav tsim qhov project raws li ib puag ncig hloov pauv MSB yog txoj kev mus rau lub version ntawm MSBuild kuv xav tau los tsim
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
Cia peb nkag mus rau tus ID nkag mus thiab daim ntawv tso cai yuam sij rau PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
Tom qab tsim tiav, khiav CLMonitor dua los tsim cov ntaub ntawv ua ntej thiab kev tshuaj xyuas zoo li qub:
%CLmon% analyze -l "c:ptest.plog"
Tom qab ntawd peb yuav siv lwm yam khoom siv los ntawm peb qhov kev faib tawm. PlogConverter converts ib daim ntawv qhia los ntawm ib tug qauv hom mus rau ib tug TeamCity tshwj xeeb hom. Ua tsaug rau qhov no, peb yuav tuaj yeem saib nws ncaj qha rau hauv lub qhov rais tsim.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
Cov kauj ruam kawg yog los tso saib daim ntawv qhia formatted hauv stdout, qhov twg nws yuav raug khaws los ntawm TeamCity parser.
type "C:tempptest.plog_TeamCity.txt"
Cov ntawv sau tag nrho:
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"
Lub sijhawm no, kev sib dhos thiab kev tshuaj xyuas ntawm qhov project tau ua tiav tiav, peb tuaj yeem mus rau lub tab tej yaam num thiab ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΡΠΎΠΌ.
Tam sim no cia peb nyem rau ntawm Kev tshuaj xyuas tag nrhomus saib daim ntawv qhia analyzer:
Cov lus ceeb toom tau muab ua pawg los ntawm cov lej ntsuas kev ntsuas. Txhawm rau taug qab cov lej, koj yuav tsum nyem rau ntawm kab xov tooj nrog cov lus ceeb toom. Nyem rau ntawm lo lus nug cim nyob rau sab xis sab xis yuav qhib koj lub tab tshiab nrog cov ntaub ntawv. Koj tuaj yeem taug kev los ntawm txoj cai los ntawm txhaj rau ntawm kab xov tooj nrog cov lus ceeb toom ntsuas. Kev taw qhia los ntawm lub computer tej thaj chaw deb yog ua tau thaum siv SourceTreeRoot tus cim. Txhua tus neeg uas txaus siab rau hom kev ua haujlwm ntawm lub ntsuas ntsuas no tuaj yeem paub txog lawv tus kheej nrog rau qhov sib thooj
Saib cov ntsuas ntsuas
Tam sim no uas peb tau ua tiav kev xa tawm thiab teeb tsa kev tsim, cia peb saib qee cov lus ceeb toom nthuav dav pom hauv qhov project peb tab tom saib.
Ceeb toom 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;
}
Tus kws tshuaj ntsuam pom qhov yuam kev uas tom qab dynamically faib kev nco hauv CreateObject, thaum muaj kev zam tshwm sim, lub cim xeeb tsis raug tshem tawm, thiab lub cim xeeb xau tshwm sim.
Ceeb toom 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),
....
};
Ob peb tus neeg uas tsis yog tus kws tshuaj ntsuam xyuas zoo li qub tuaj yeem xeem dhau qhov kev ntsuam xyuas saib xyuas. Qhov piv txwv luam-paste no yog qhov zoo rau qhov tseeb vim li no.
Ceeb toom N3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
Tau kawg, siv qhov sib txawv nrog tib lub npe hauv chav kawm hauv paus thiab hauv cov xeeb leej xeeb ntxwv tsis yog ib qho yuam kev. Txawm li cas los xij, thev naus laus zis qub txeeg qub teg nws tus kheej xav tias txhua qhov chaw ntawm cov niam txiv hauv chav kawm muaj nyob hauv cov menyuam kawm ntawv. Los ntawm kev tshaj tawm cov teb nrog tib lub npe hauv cov qub txeeg qub teg, peb qhia tsis meej pem.
Ceeb toom N4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
Cia wb mus saib ntxiv. Kev nthuav qhia ImageDirection/8 yuav cuav yog tias duabDirection yog nyob rau hauv qhov ntau ntawm -7 mus rau 7. Qhov thib ob: (imageDirection / 8) != 3 kuaj duabDirection rau sab nraum qhov ntau: los ntawm -31 txog -24 thiab los ntawm 24 mus rau 31, feem. Nws zoo nkaus li coj txawv txawv rau kuv txhawm rau txheeb xyuas cov lej rau kev suav nrog qee yam hauv txoj kev no thiab, txawm tias tsis muaj qhov yuam kev hauv daim ntawv no, kuv xav kom rov sau cov xwm txheej no kom meej meej. Qhov no yuav ua rau lub neej yooj yim dua rau cov neeg uas yuav nyeem thiab tuav txoj cai no.
Ceeb toom 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;
....
}
....
}
Cov kab lus no feem ntau yuav tau txais los ntawm decompilation. Tom qab ntawd, txiav txim los ntawm cov lus sab laug, ib feem ntawm cov cai tsis ua haujlwm raug tshem tawm. Txawm li cas los xij, tseem muaj ob peb txoj haujlwm tseem tshuav cursorId, uas kuj tsis muaj kev nkag siab ntau.
Ceeb toom 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); // <=
}
....
}
Cov cai no yooj yim heev los kho; koj tsuas yog yuav tsum tau kuaj nws thib peb neeg uas ua ntawv mus rau ib tug null pointer, los yog ntxiv rau lub cev ntawm cov nqe lus conditional. Kuv xav qhia qhov kev xaiv thib ob:
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);
}
}
....
}
Ceeb toom 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));
....
}
....
}
Koj tuaj yeem tshem tawm ntawm txoj kab nyuaj-rau-nyeem ntawv ntawm cov lej hauv ib qho poob thiab daws qhov teeb meem nrog kev kuaj xyuas nullptr. Kuv xav kom hloov cov cai raws li hauv qab no:
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);
....
}
....
}
Ceeb toom N8
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
Cov cai zoo li coj txawv txawv. Nws zoo nkaus li kuv tias muaj ib qho typo nyob rau hauv qhov xwm txheej lossis thaum rov muab qhov sib txawv ColumnHeaderPressedCurrentState qhov tseem ceeb cuav.
xaus
Raws li peb tuaj yeem pom, kev sib koom ua ke PVS-Studio static analyzer rau hauv koj qhov haujlwm TeamCity yog qhov yooj yim heev. Txhawm rau ua qhov no, nws txaus los sau ib daim ntawv me me xwb. Kev tshuaj xyuas cov cai yuav tso cai rau koj txheeb xyuas cov teeb meem tam sim ntawd tom qab kev sib dhos, uas yuav pab tshem tawm lawv thaum qhov nyuaj thiab cov nqi hloov pauv tseem tsawg.
Yog tias koj xav qhia cov kab lus no nrog cov neeg hais lus Askiv, thov siv qhov txuas txhais lus: Vladislav Stolyarov.
Tau qhov twg los: www.hab.com