Neatkarīgs PVS-Studio apskats (Linux, C++)

Atradām rakstu, ka PVS tomēr ir iemācÄ«jies analizēt Linux vidē, un nolēmu pamēģināt to savos projektos. Un Å”eit ir tas, kas no tā iznāca.


Satelīte

  1. PriekŔrocības
  2. Mīnusi
  3. Secinājumi
  4. Pēcvārds

PriekŔrocības

Ātra atbalsta komanda

Es pieprasÄ«ju izmēģinājuma atslēgu, tajā paŔā dienā to saņēmu.

Pietiekami saprotama dokumentācija

Analizatora palaiÅ”ana izdevās bez Ä«paŔām problēmām. Ir arÄ« palÄ«dzÄ«ba konsoles komandām (lai gan Å”eit ir iebildumi, skat. sadaļu MÄ«nusi).

Mogućība veikt analīzi daudz pavedienos

Analizatoram ir "standarta" opcija -j, kas ļauj veikt analīzi paralēli vairākās uzdevumos. Tas ļoti ietaupa laiku.

Laba vizualizācija

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

VienkārŔa integrācija projektā

Visa dokumentācija ir viņu vietnē, teikÅ”u tikai, ka, ja jÅ«su projekts tiek veidots ar CMake, tad viss ir ļoti vienkārÅ”i.

Labi apraksti diagnostikām

Ja ģenerēt izeju režīmā fullhtml, tad katram ziņojumam ir saite uz diagnostikas aprakstu ar paskaidrojumiem, koda piemēriem un papildu saitēm.

Mīnusi

Analizatora nezināŔana par C++ valodu

Diemžēl, PVS dažreiz kļūdās sintaksē un ģenerē viltus pozitīvus ziņojumus pat tad, ja kods ir pilnīgi korekts.

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ā, atslēgvārds auto var nozÄ«mēt void, tādēļ tas tā arÄ« ir. auto. Bet PVS izdeva Ŕādus ziņojumus:

dynamic_tuple_management.hpp:29:1: kļūda: V591 Funkcijai, kurai nav void atgrieztējs, jāatgriež vērtība.
dynamic_tuple_management.hpp:29:1: kļūda: V2542 Funkcijai ar ne-void atgrieztēju jāatgriež vērtība no visiem izejas ceļiem.

Ļoti lēns tīmekļa vietne

Jā, tÄ«mekļa saskarnē blakus katram ziņojumam ir saite uz atbilstoÅ”o diagnostikas aprakstu ar piemēriem. Bet, noklikŔķinot uz saites, jāgaida diezgan ilgi, dažreiz pat 504 Gateway Time-out.

Valoda

Visi apraksti ir krievu valodā, tas ir lieliski. Bet saites no ziņojuma vienmēr ved uz angļu versiju. Būtu jauki, ja būtu iespējams pārslēgt valodu, lai diagnostikas varētu skatīt uzreiz krieviski. Šādus iespēju es saskarnē neatradu.

Nepatīkami strādāt ar diagnostikas līmeņiem caur konsoli

Sāksim ar to, ka divām izmantotajām komandām (tas ir pvs-studio-analyzer un plog-converter) ir dažādi diagnostikas uzdevumu formāti.

Palīgs pvs-studio-analyzer apgalvo:

-a [MODE], --analysis-mode [MODE]
    MODE nosaka brīdinājumu veidu:
    1 - 64-bit kļūdas;
    2 - rezervēts;
    4 - Vispārējā analīze;
    8 - Mikro-optimizācija;
    16 - Klientu specifiskas prasības;
    32 - MISRA.
    Režīmus var apvienot, pievienojot vērtības
    Noklusējums: 4

Ilgi mēģināju saprast, kur tad ir jāpievieno pievienojot (ā€žadding the valuesā€) atslēgas. Mēģināju uzskaitÄ«t ar komatu:

pvs-studio-analyzer analyze ... -a 1,4,16

Mēģināju rakstī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 bitu maskas! Un jā saskaitīt, nevis pievienojot vērtības. Piemēram, lai iegūtu vispārējo diagnostiku, diagnostiku par mikro-optimizācijām un MISRA, tās jāsaskaita (4 + 8 + 32 = 44):

pvs-studio-analyzer analyze ... -a 44

Bitmasku izmantoÅ”ana lietotāju saskarnēs parasti tiek uzskatÄ«ta par sliktu toni. Viss to varēja saskaitÄ«t arÄ« iekŔēji, bet lietotājam iesniegt karogu kopumu.

Turklāt ir vēl rīks plog-converter, kas ģenerē cilvēkam saprotamu informāciju par statisko analīzi. Tam ir citi jautājumi.

Programmas palīdzība plog-converter ziņo:

-a, --analyzer            Nosaka analīzator(us) un līmeni/līmeņus, kas
                          tiks izmantoti filtrēŔanai, proti,
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Noklusējums: GA:1,2

Å eit parādÄ«jās kaut kādi ā€žlÄ«meņiā€, kas iepriekÅ” nevienā vietā nebija un dokumentācijā es par tiem arÄ« neko neatradu.

Pavisam, neskaidri. Tāpēc es visu iestatīju maksimāli.

Jaunu muļķīgu pārmetumu jūra uz Catch

Divos no trim projektiem, kurus es analizēju, tiek izmantota moduļu testēŔanas bibliotēka Catch2. Un lielākā daļa ziņojumu (!!! 90 no 138 vienā un 297 no 344 otrā !!!) izskatās Ŕādi:

Neatkarīgs PVS-Studio apskats (Linux, C++)

Neizskata daudzplūsmu

Daudz viltus pozitīvo noteikumu par it kā nemainīgām mainīgajām vai bezgalīgiem cikliem, savukārt datu apstrāde notiek no dažādiem pavedieniem, un, ja tā nebūtu, tad moduļu testi nedarbotos.

Neatkarīgs PVS-Studio apskats (Linux, C++)

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

Secinājumi

PVS nenokārtojis nevienu Ä«stu kļūdu manās atvērtajās projektēs Burst un Proxima, kā arÄ« darba projektā, ko es, saprotamu iemeslu dēļ, nevaru uzrādÄ«t. PatiesÄ«bā ir jāņem vērā, ka dažas nepilnÄ«bas jau tika atrastas un labotas iepriekÅ”. Cppcheck un scan-build.

Kopumā iespaids par visiem Ŕiem analīzes rīkiem ir aptuveni vienādi: jā, tie kaut ko atpazīst, dažreiz pat kaut ko svarīgu, bet kopumā kompilatoram pietiek.

Iespējams (un man personīgi tas patīk domāt), ka mūsu komanda izmanto tādas programmatūras izstrādes prakses, kas ļauj ģenerēt minimālu sliktā koda daudzumu. Labāk neradīt problēmas, nekā varonīgi tās pārvarēt.

Tādēļ uzņemos drosmi sniegt dažus padomus par to, kā rakstīt C++ valodā tā, lai nesistītos sev kājās un neiegūtu ar grābekli pa pieri.

Izmantojiet kompilatora diagnostiku maksimāli

Mūsu komanda izmanto (un jums iesaka) Ŕādas kompilācijas opcijas:

-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

Iekļaujiet tās savā projektā, uzzināsiet daudz jauna par savu kodu.

Ievērojiet standartu

Centieties neizmantot platformu atkarÄ«gus rÄ«kus, ja ir standarta analoga, bet ja bez tiem nepietiks, iesaiņojiet tos Ä«paÅ”os blokos zem makro (vai kā citādi) un vienkārÅ”i nepieļaujiet, ka jÅ«su kods tiek kompilēts neatbalstÄ«tajos apstākļos.

Ievērojiet standarta operāciju semantiku

SaskaitīŔana jābÅ«t saskaitīŔanai, reizēŔana — reizēŔanai, funkcijas izsaukums — funkcijas izsaukt, kopēŔana jābÅ«t kopēŔanai, pārvietoÅ”ana — pārvietot, konteineram jābÅ«t iterējamam, iterātors jābÅ«t ar virzÄ«bu ++ un dereferencēŔanu *. Un tā tālāk, un tā tālāk.

Domāju, doma skaidra. Ir pastāvīgi nosacījumi, kas nav obligāti izpildāmi, bet ko gaida redzēt visi jūsu koda lietotāji un lasītāji. Neskatieties, kā pievilt citus, citādi pārsteigsiet sevi.

Rakstiet saderīgu kodu

Vispirms es domāju par standarta bibliotēku. ļoti vēlams, lai jÅ«su klaÅ”u un funkciju saskarnes varētu izmantot kopā ar standarta un citām bibliotēkām (piemēram, Boost).

Neaizdedziniet ieskatīties STL un Boost saskarnēs. Reti izņēmumi tur jūs redzēsiet cienīgu piemērti sekot.

Izmantojiet maksimāli atvērtos rīkus

Tādam paÅ”am statiskajam analÄ«zes rÄ«kam ir vismaz divi atvērti bezmaksas rÄ«ki, kas reÄ£istrējas ā€žreizÄ“ā€ jebkuram projektam ar CMake bÅ«ves sistēmu.

Sīkāk par to var lasīt manā nesenajā publikācijā.

Pēcvārds

Nobeigumā gribu uzsvērt, ka es nesaku, ka nevajadzētu izmantot PVS vai citus statiskos analizatorus. Taču es aicinu padomāt, kādēļ static analizators pastāvīgi atrod jūsu kodā būtiskas kļūdas.

Tas ir tikai sekas. Jāmeklē un jānovērÅ” cēlonis.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster