Neatkarīgs PVS-Studio pārskats (Linux, C++)

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.


saturs

  1. Plusi
  2. MÄ«nusi
  3. Rezultāti
  4. Pēcvārds

Plusi

Atsaucīgs atbalsts

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.

Laba vizualizācija

Daudz dažādu izvades formātu, sākot no teksta līdz mazam tīmekļa uzgalim. Tīmekļa saskarne ir ērta, kodolīga, ar padomiem blakus koda rindām un saitēm uz diagnostikas aprakstiem.

Viegla integrācija montāžā

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.

MÄ«nusi

Analizatora nezināŔana par C++ valodu

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:

Neatkarīgs PVS-Studio pārskats (Linux, C++)

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.

Neatkarīgs PVS-Studio pārskats (Linux, C++)

Tomēr vai statiskais analizators to pat var ņemt vērā? Nezinu.

Rezultāti

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:

-Werror

-Wall
-Wextra
-Wpedantic

-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo

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.

Vairāk par to varat lasīt manā nesenajā publikācijā.

Pēcvārds

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.

Avots: www.habr.com

Pievieno komentāru