Es redzÄju publikÄciju, kuru PVS bija iemÄcÄ«jies analizÄt, izmantojot Linux, un nolÄmu to izmÄÄ£inÄt savos projektos. Un tas ir tas, kas no tÄ iznÄca.
Es pieprasÄ«ju izmÄÄ£inÄjuma atslÄgu, un viÅi man to nosÅ«tÄ«ja tajÄ paÅ”Ä dienÄ.
Diezgan skaidra dokumentÄcija
Mums izdevÄs palaist analizatoru bez problÄmÄm. Ir pieejama arÄ« palÄ«dzÄ«ba konsoles komandÄm (lai gan Å”eit ir dažas sÅ«dzÄ«bas, skatiet sadaļu MÄ«nusi).
Daudzpavedienu analÄ«zes iespÄja
Analizatoram ir "standarta" opcija -j, kas ļauj paralÄli veikt analÄ«zi vairÄkos uzdevumos. Tas ietaupa daudz laika.
Visa dokumentÄcija ir viÅu mÄjaslapÄ, varu teikt tikai to, ka, ja tavs projekts ir veidots izmantojot CMake, tad viss ir ļoti vienkÄrÅ”i.
Labi diagnostikas apraksti
Ja Ä£enerÄjat izvadi režīmÄ fullhtml, tad katram ziÅojumam ir saite uz diagnostikas aprakstu ar paskaidrojumiem, kodu piemÄriem un papildu saitÄm.
DiemžÄl PVS dažreiz pieļauj sintakses kļūdas un Ä£enerÄ kļūdaini pozitÄ«vus ziÅojumus, kad kods ir pilnÄ«gi pareizs.
PiemÄram, ir funkcija, kas atgriež void:
template <typename T>
auto copy (const void * source, void * destination)
->
std::enable_if_t
<
std::is_copy_constructible<T>::value
>
{
new (destination) T(*static_cast<const T *>(source));
}
JÄ ir atslÄgas vÄrds auto Var nozÄ«mÄt void, tam tas ir paredzÄts auto. Bet PVS sagatavoja Å”Ädus ziÅojumus:
dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.
Ä»oti lÄna vietne
JÄ, tÄ«mekļa saskarnÄ pie katra ziÅojuma ir saite uz atbilstoÅ”o diagnostikas aprakstu ar piemÄriem. Bet, noklikŔķinot uz saites, ir jÄgaida diezgan ilgi, un dažreiz tas notiek 504 VÄrtejas taimauts.
Valoda
Visi apraksti ir krievu valodÄ, kas ir lieliski. TaÄu saites no ziÅojuma vienmÄr ved uz versiju angļu valodÄ. BÅ«tu jauki, ja varÄtu pÄrslÄgt valodu, lai uzreiz varÄtu apskatÄ«t diagnostiku krievu valodÄ. InterfeisÄ tÄdu opciju neatradu.
Ir neÄrti strÄdÄt ar diagnostikas lÄ«meÅiem, izmantojot konsoli
SÄksim ar faktu, ka tika izmantotas divas komandas (Ŕī pvs-studio-analyzer Šø plog-converter) dažÄdi diagnostikas norÄdÄ«Å”anas formÄti.
Palīdzība priekŔ pvs-studio-analyzer skan:
-a [MODE], --analysis-mode [MODE]
MODE defines the type of warnings:
1 - 64-bit errors;
2 - reserved;
4 - General Analysis;
8 - Micro-optimizations;
16 - Customers Specific Requests;
32 - MISRA.
Modes can be combined by adding the values
Default: 4
Es pavadÄ«ju ilgu laiku, mÄÄ£inot izdomÄt, kur doties pievienot (āvÄrtÄ«bu pievienoÅ”anaā). Es mÄÄ£inÄju tos uzskaitÄ«t, atdalot tos ar komatiem:
pvs-studio-analyzer analyze ... -a 1,4,16
Es mÄÄ£inÄju reÄ£istrÄt atslÄgu vairÄkas reizes:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16
Un tikai tad es sapratu, ka tÄs ir mazliet maskas! Un tev vajag rezumÄUn ne pievienot nozÄ«mes. PiemÄram, lai iegÅ«tu vispÄrÄ«gu diagnostiku, mikrooptimizÄciju diagnostiku un MISRA, tie ir jÄapkopo (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44
Bitmasku izmantoÅ”ana lietotÄja saskarnÄs parasti ir slikta forma. To visu varÄtu apkopot iekÅ”Äji, un lietotÄjam varÄtu iestatÄ«t karodziÅu kopu.
TurklÄt ir arÄ« lietderÄ«ba plog-converter, kas Ä£enerÄ cilvÄkiem lasÄmu statiskÄs analÄ«zes informÄciju. ViÅai ir citas problÄmas.
PalÄ«dzÄ«ba programmai plog-converter ziÅojumi:
-a, --analyzer Specifies analyzer(s) and level(s) to be
used for filtering, i.e.
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Default: GA:1,2
Å eit parÄdÄ«jÄs daži ālÄ«meÅiā, kuru iepriekÅ” nebija, un arÄ« dokumentÄcijÄ par tiem neko neatradu.
KopumÄ tas nav skaidrs. TÄpÄc es visu noliku uz maksimumu.
Daudz stulbu bļaustÄ«Å”anÄs uz Catch
Divos no trim manis analizÄtajiem projektiem tiek izmantota vienÄ«bu testÄÅ”anas bibliotÄka Catch2. Un lauvas tiesai ziÅojumu (!!! 90 no 138 vienÄ un 297 no 344 otrÄ!!!) ir Å”Äda forma:
NeÅem vÄrÄ daudzpavedienu
Ir daudz viltus pozitÄ«vu par it kÄ nemainÄ«giem mainÄ«gajiem vai bezgalÄ«gÄm cilpÄm, savukÄrt darbs ar Å”iem mainÄ«gajiem notiek no dažÄdiem pavedieniem, un, ja tas tÄ nebÅ«tu, tad vienÄ«bu testi nedarbotos.
TomÄr vai statiskais analizators to pat var Åemt vÄrÄ? Nezinu.
PVS neatrada nekÄdas reÄlas kļūdas manos atvÄrtÄ pirmkoda projektos Burst Šø Proxima, kÄ arÄ« darba projektÄ, kuru acÄ«mredzamu iemeslu dÄļ nevaru iesniegt. Tiesa, ir vÄrts paturÄt prÄtÄ, ka dažas nepilnÄ«bas jau ir konstatÄtas un novÄrstas, izmantojot agrÄk Cppcheck Šø scan-build.
KopumÄ iespaids no visiem Å”iem analizatoriem ir aptuveni vienÄds: jÄ, viÅi kaut ko tver, dažreiz pat kaut ko svarÄ«gu, bet kopumÄ ar kompilatoru pietiek.
IespÄjams (un man personÄ«gi tÄ patÄ«k domÄt), ka mÅ«su komanda izmanto programmatÅ«ras izstrÄdes praksi, kas ļauj mums Ä£enerÄt minimÄlu sÅ«da koda daudzumu. LabÄk neradÄ«t problÄmas, nekÄ varonÄ«gi tÄs pÄrvarÄt.
TÄpÄc es atļauÅ”os sniegt dažus padomus, kÄ rakstÄ«t C++ tÄ, lai nevienam nenoÅ”autu kÄjas un ar grÄbekli neiesist pa pieri.
Izmantojiet visas kompilatora diagnostikas iespÄjas
MÅ«su komanda izmanto (un iesaka jums) Å”Ädas apkopoÅ”anas iespÄjas:
IespÄjojiet tos savÄ projektÄ un uzziniet daudz par savu kodu.
Pieturieties pie standarta
Centieties neizmantot no platformas atkarÄ«gas lietas, ja ir standarta analogi, un, ja jÅ«s absolÅ«ti nevarat iztikt bez tiem, ietiniet tos Ä«paÅ”os blokos makro (vai kaut kam citam) un vienkÄrÅ”i neļaujiet savam kodam kompilÄt neatbalstÄ«tos apstÄkļos.
Pieturieties pie standarta darbības semantikas
SaskaitÄ«Å”anai ir jÄbÅ«t saskaitÄ«Å”anai, reizinÄÅ”anai ir reizinÄÅ”anai, funkcijas izsaukumam ir jÄbÅ«t funkcijas izsaukumam, kopijai ir jÄbÅ«t kopÄtai, pÄrnÄsÄÅ”anai ir jÄpÄrnÄsÄ, konteineram jÄbÅ«t atkÄrtojamam, iteratoram ir jÄbÅ«t veicinÄÅ”anai ++ un atsauces atcelÅ”ana *. Un tÄ tÄlÄk, un tÄ tÄlÄk.
DomÄju, ka doma ir skaidra. PastÄv noteiktas konvencijas, kas nav saistoÅ”as, bet kuras sagaida visi jÅ«su koda lietotÄji un lasÄ«tÄji. NemÄÄ£iniet pÄrspÄt citus, pretÄjÄ gadÄ«jumÄ jÅ«s pÄrspÄsit sevi.
Uzrakstiet saderīgu kodu
PirmkÄrt, es domÄju standarta bibliotÄku. Ir ļoti vÄlams, lai jÅ«su klaÅ”u un funkciju saskarnes varÄtu izmantot ar standarta un citÄm bibliotÄkÄm (piemÄram, Boost).
JÅ«tieties brÄ«vi apskatÄ«t STL un Boost saskarnes. Ar retiem izÅÄmumiem jÅ«s tur redzÄsiet cienÄ«gu paraugu.
Izmantojiet atvÄrtÄ pirmkoda rÄ«kus
Vienai un tai paÅ”ai statiskai analÄ«zei ir vismaz divi atvÄrti bezmaksas rÄ«ki, kurus var tikai vienu reizi savienot ar jebkuru projektu, izmantojot CMake veidoÅ”anas sistÄmu.
Visbeidzot, es vÄlos uzsvÄrt, ka es neaicinu neizmantot PVS vai citus statiskos analizatorus. Bet es aicinu jÅ«s padomÄt par to, kÄ tas notika, ka statiskais analizators pastÄvÄ«gi atrod bÅ«tiskas kļūdas jÅ«su kodÄ.
TÄs ir tikai sekas. Mums ir jÄmeklÄ un jÄnovÄrÅ” cÄlonis.