PVS-Studion riippumaton arvostelu (Linux, C++)

Näin julkaisun, jota PVS oli oppinut analysoimaan Linuxissa, ja päätin kokeilla sitä omissa projekteissani. Ja tämä on mitä siitä tuli.


Pitoisuus

  1. Pros
  2. Miinukset
  3. Tulokset
  4. loppusanat

Pros

Responsiivinen tuki

Pyysin kokeiluavainta ja he lähettivät sen minulle samana päivänä.

Melko selkeä dokumentaatio

Onnistuimme käynnistämään analysaattorin ilman ongelmia. Ohjeita konsolikomentoille on myös saatavilla (vaikka täällä on joitain valituksia, katso kohta Miinukset).

Mahdollisuus monisäikeiseen analyysiin

Analysaattorissa on "vakio"-vaihtoehto -j, mikä mahdollistaa analyysin suorittamisen rinnakkain useissa tehtävissä. Tämä säästää paljon aikaa.

Hyvä visualisointi

Useita eri tulostusmuotoja tekstistä pieneen verkkokuotoon. Verkkokäyttöliittymä on kätevä, ytimekäs, koodin rivien vieressä on vihjeitä ja linkkejä diagnostisiin kuvauksiin.

Helppo integrointi kokoonpanoon

Kaikki dokumentaatio on heidän verkkosivustollaan, voin vain sanoa, että jos projektisi on rakennettu CMakella, kaikki on hyvin yksinkertaista.

Hyvät diagnostiset kuvaukset

Jos luot tulosteen tilassa fullhtml, jokaisessa viestissä on linkki diagnostiseen kuvaukseen, jossa on selityksiä, koodiesimerkkejä ja lisälinkkejä.

Miinukset

Analysaattorin tietämättömyys C++-kielestä

Valitettavasti PVS tekee joskus syntaksivirheitä ja tuottaa vääriä positiivisia viestejä, kun koodi on täysin oikea.

Esimerkiksi on funktio, joka palauttaa 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));
}

Kyllä, avainsana auto Voi tarkoittaa void, sitä varten se on auto. Mutta PVS tuotti seuraavat viestit:

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.

Erittäin hidas sivusto

Kyllä, web-käyttöliittymässä jokaisen viestin vieressä on linkki vastaavaan diagnoosikuvaukseen esimerkeineen. Mutta kun napsautat linkkiä, sinun on odotettava melko kauan, ja joskus niin tapahtuu 504 Yhdyskäytävän aikakatkaisu.

Kieli

Kaikki kuvaukset ovat venäjäksi, mikä on hienoa. Mutta linkit raportista johtavat aina englanninkieliseen versioon. Olisi kiva saada kieli vaihdettua niin, että diagnostiikkaa voi katsoa heti venäjäksi. En löytänyt käyttöliittymästä sellaista vaihtoehtoa.

On hankalaa työskennellä diagnostisten tasojen kanssa konsolin kautta

Aloitetaan siitä, että kaksi komentoa käyttivät (tämä pvs-studio-analyzer и plog-converter) eri muotoja diagnostiikan määrittämiseen.

Apua varten pvs-studio-analyzer lukee:

-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

Yritin pitkään miettiä minne mennä lisätä ("arvojen lisääminen") -näppäimiä. Yritin luetella ne pilkuilla eroteltuina:

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

Yritin rekisteröidä avaimen useita kertoja:

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

Ja vasta sitten tajusin, että nämä olivat vähän naamioita! Ja sinä tarvitset YhteenvetonaEikä lisätä merkityksiä. Esimerkiksi saadaksesi yleisdiagnostiikkaa, mikrooptimointien diagnostiikkaa ja MISRAa, sinun on tehtävä ne yhteenvetona (4 + 8 + 32 = 44):

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

Bittimaskien käyttö käyttöliittymissä on yleensä huonolaatuista. Kaikki tämä voitaisiin tiivistää sisäisesti, ja käyttäjälle voitaisiin asettaa lippuja.

Lisäksi on myös apuohjelma plog-converter, joka tuottaa ihmisen luettavaa staattista analyysitietoa. Hänellä on muita ongelmia.

Apua ohjelmaan plog-converter raportit:

-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

Täällä ilmestyi joitain "tasoja", joita ei ollut aiemmin, enkä löytänyt niistä mitään dokumentaatiostakaan.

Yleisesti ottaen se ei ole selvää. Siksi asetan kaiken maksimiin.

Joukko typerää kiroilua Catchille

Kahdessa kolmesta analysoimastani projektista käytetään yksikkötestauskirjastoa Catch2. Ja leijonanosa viesteistä (!!! 90/138 yhdessä ja 297/344 toisessa!!!) on seuraavanlaista muotoa:

PVS-Studion riippumaton arvostelu (Linux, C++)

Ei ota huomioon monisäikeisyyttä

Oletettavasti muuttumattomista muuttujista tai loputtomista silmukoista on monia vääriä positiivisia, kun taas näiden muuttujien kanssa työskentely tapahtuu eri säikeistä, ja jos näin ei olisi, yksikkötestit eivät toimisi.

PVS-Studion riippumaton arvostelu (Linux, C++)

Mutta voiko staattinen analysaattori edes ottaa tämän huomioon? En tiedä.

Tulokset

PVS ei löytänyt todellisia bugeja avoimen lähdekoodin projekteistani Burst и Seuraava, sekä työluonnoksessa, jota en ilmeisistä syistä voi esittää. Totta, kannattaa pitää mielessä, että joitain puutteita on havaittu ja korjattu jo aiemmin käytössä Cppcheck и scan-build.

Yleisesti ottaen vaikutelma kaikista näistä analysaattoreista on suunnilleen sama: kyllä, ne saavat jotain, joskus jopa jotain tärkeää, mutta kaiken kaikkiaan kääntäjä riittää.

On mahdollista (ja minä henkilökohtaisesti pidän niin), että tiimimme käyttää ohjelmistokehityskäytäntöjä, joiden avulla voimme luoda vähimmäismäärän paskaa koodia. On parempi olla luomatta ongelmia kuin voittaa ne sankarillisesti.

Siksi otan vapauden antaa neuvoja, kuinka kirjoittaa C++:lla niin, etten ampuisi kenenkään jalkoja tai lyö ketään otsaan haravalla.

Ota kaikki irti kääntäjän diagnostiikasta

Tiimimme käyttää (ja neuvoo sinua) seuraavia kokoamisvaihtoehtoja:

-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

Ota ne käyttöön projektissasi ja opi paljon koodistasi.

Pysy standardissa

Yritä olla käyttämättä alustariippuvaisia ​​​​asioita, jos on olemassa vakioanalogeja, ja jos et todellakaan voi tulla ilman niitä, kääri ne erityisiin lohkoihin makroja (tai jotain muuta) varten ja älä yksinkertaisesti anna koodin kääntää tukemattomissa olosuhteissa.

Pysy vakiotoiminnon semantiikassa

Yhteyden on oltava yhteenlasku, kertolasku on kerrottava, funktiokutsun on oltava funktiokutsu, kopiointi on kopioitava, siirto on oltava mukana, säilön on oltava iteroitavissa, iteraattorissa on oltava mainos ++ ja viittausten poistaminen *. Ja niin edelleen.

Mielestäni ajatus on selvä. On olemassa vakiintuneita käytäntöjä, jotka eivät ole sitovia, mutta jotka kaikki koodisi käyttäjät ja lukijat odottavat näkevänsä. Älä yritä huijata muita, muuten petät itsesi.

Kirjoita yhteensopiva koodi

Ensinnäkin tarkoitan tavallista kirjastoa. On erittäin toivottavaa, että luokkien ja funktioiden rajapintoja voidaan käyttää vakio- ja muiden kirjastojen (esim. Boost) kanssa.

Voit vapaasti katsoa STL- ja Boost-liitäntöjä. Harvoja poikkeuksia lukuun ottamatta näet siellä arvokkaan roolimallin.

Hyödynnä avoimen lähdekoodin työkaluja

Samaa staattista analyysiä varten on olemassa ainakin kaksi avointa ilmaista työkalua, jotka voidaan liittää vain kerran mihin tahansa projektiin CMake-rakennusjärjestelmän avulla.

Voit lukea tästä lisää tuoreesta julkaisustani.

loppusanat

Lopuksi haluan korostaa, että en kannata olla käyttämättä PVS:ää tai muita staattisia analysaattoreita. Mutta kehotan sinua miettimään, kuinka kävi niin, että staattinen analysaattori löytää jatkuvasti merkittäviä virheitä koodistasi.

Tämä on vain seuraus. Meidän on etsittävä ja poistettava syy.

Lähde: will.com

Lisää kommentti