Visa dokumentacija yra jų svetainėje, galiu tik pasakyti, kad jei jūsų projektas yra sukurtas naudojant CMake, tada viskas yra labai paprasta.
Geri diagnostikos aprašymai
Jei generuojate išvestį režimu fullhtml, tada kiekviename pranešime yra nuoroda į diagnostikos aprašymą su paaiškinimais, kodų pavyzdžiais ir papildomomis nuorodomis.
Deja, PVS kartais daro sintaksės klaidų ir generuoja klaidingus teigiamus pranešimus, kai kodas yra visiškai teisingas.
Pavyzdžiui, yra funkcija, kuri grąžina 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));
}
Taip yra pagrindinis žodis auto Gali reikšti void, tam jis ir skirtas automatinis. Tačiau PVS pateikė šiuos pranešimus:
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.
Labai lėta svetainė
Taip, žiniatinklio sąsajoje prie kiekvieno pranešimo yra nuoroda į atitinkamą diagnostikos aprašymą su pavyzdžiais. Tačiau paspaudus nuorodą tenka laukti gana ilgai, o kartais taip nutinka 504 Tinklas neveikia.
Kalba
Visi aprašymai yra rusų kalba, tai puiku. Tačiau ataskaitos nuorodos visada veda į anglišką versiją. Būtų gerai, kad būtų galima perjungti kalbą, kad iš karto būtų galima peržiūrėti diagnostiką rusiškai. Tokios parinkties sąsajoje neradau.
Dirbti su diagnostikos lygiais per pultą nepatogu
Pradėkime nuo to, kad buvo naudojamos dvi komandos (tai pvs-studio-analyzer и plog-converter) skirtingi diagnostikos nurodymo formatai.
Pagalba už pvs-studio-analyzer skaito:
-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
Aš ilgai bandžiau išsiaiškinti, kur eiti pridėti („pridėti reikšmes“) klavišus. Bandžiau juos išvardyti atskiriant kableliais:
pvs-studio-analyzer analyze ... -a 1,4,16
Kelis kartus bandžiau užregistruoti raktą:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16
Ir tik tada supratau, kad tai bitutės! Ir tau reikia apibendrintiIr ne pridėti reikšmės. Pavyzdžiui, norėdami gauti bendrą diagnostiką, mikrooptimizavimo diagnostiką ir MISRA, turite juos susumuoti (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44
Bitkaukių naudojimas vartotojo sąsajose paprastai yra blogos formos. Visa tai galima būtų apibendrinti viduje, o vartotojui būtų galima nustatyti vėliavėlių rinkinį.
Be to, yra ir komunalinė priemonė plog-converter, kuri generuoja žmogaus skaitomą statinės analizės informaciją. Ji turi kitų problemų.
Pagalba programai plog-converter ataskaitos:
-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
Čia atsirado kažkokie „lygiai“, kurių anksčiau nebuvo, ir dokumentacijoje apie juos taip pat nieko neradau.
Apskritai tai nėra aišku. Todėl viską nustatau maksimaliai.
Krūva kvailų keiksmažodžių Catch
Du iš trijų mano analizuotų projektų naudoja vienetų testavimo biblioteką „Catch2“. O liūto dalis žinučių (!!! 90 iš 138 vienoje ir 297 iš 344 kitoje!!!) yra tokios formos:
Neatsižvelgiama į daugiasriegius ryšius
Yra daug klaidingų teigiamų teiginių apie tariamai nesikeičiančius kintamuosius arba nesibaigiančius ciklus, o darbas su šiais kintamaisiais vyksta iš skirtingų gijų, o jei taip nebūtų, vienetiniai testai neveiks.
Tačiau ar statinis analizatorius gali į tai atsižvelgti? Nežinau.
PVS mano atvirojo kodo projektuose nerado jokių tikrų klaidų Trūkimo и "Proxima", taip pat darbo juodraštyje, kurio dėl akivaizdžių priežasčių negaliu pateikti. Tiesa, verta nepamiršti, kad kai kurie trūkumai jau buvo pastebėti ir ištaisyti anksčiau naudojant Cppcheck и scan-build.
Apskritai įspūdis iš visų šių analizatorių yra maždaug toks pat: taip, jie kažką pagauna, kartais net kažką svarbaus, bet apskritai kompiliatoriaus pakanka.
Gali būti (ir aš asmeniškai mėgstu taip manyti), kad mūsų komanda taiko programinės įrangos kūrimo praktiką, leidžiančią mums sukurti minimalų šlykštaus kodo kiekį. Geriau nekurti problemų, nei herojiškai jas įveikti.
Todėl pasiimu laisvę duoti keletą patarimų, kaip C++ rašyti taip, kad niekam nenušautų kojos ir niekam netrenktų grėbliu į kaktą.
Išnaudokite visas kompiliatoriaus diagnostikos galimybes
Mūsų komanda naudoja (ir jums pataria) šias kompiliavimo parinktis:
Įgalinkite juos savo projekte ir sužinokite daug apie savo kodą.
Laikykitės standarto
Stenkitės nenaudoti nuo platformos priklausančių dalykų, jei yra standartinių analogų, o jei visiškai negalite be jų, suvyniokite juos į specialius blokus makrokomandoms (ar dar kažkam) ir tiesiog neleiskite savo kodui kompiliuoti nepalaikomomis sąlygomis.
Laikykitės standartinės operacijos semantikos
Sudėjimas turi būti sudėjimas, daugyba turi būti daugyba, funkcijos iškvietimas turi būti funkcijos iškvietimas, kopijavimas turi būti kopijavimas, nešiojimas turi būti nešiojamas, konteineris turi būti kartojamas, iteratorius turi turėti reklamą ++ ir nuorodų panaikinimas *. Ir taip toliau.
Manau, kad mintis aiški. Yra nustatytos sutartys, kurios nėra privalomos, bet kurias tikisi matyti visi jūsų kodo vartotojai ir skaitytojai. Nemėginkite pergudrauti kitų, kitaip pergausite save.
Parašykite suderinamą kodą
Visų pirma, turiu omenyje standartinę biblioteką. Labai pageidautina, kad jūsų klasių ir funkcijų sąsajos būtų naudojamos su standartinėmis ir kitomis bibliotekomis (pavyzdžiui, „Boost“).
Nedvejodami pažiūrėkite į STL ir Boost sąsajas. Išskyrus retas išimtis, ten pamatysite vertą pavyzdį.
Išnaudokite visas atvirojo kodo įrankių galimybes
Tai pačiai statinei analizei yra bent du atviri nemokami įrankiai, kuriuos galima tik vieną kartą prijungti prie bet kurio projekto naudojant CMake kūrimo sistemą.
Pabaigai noriu pabrėžti, kad aš nesiūlau nenaudoti PVS ar kitų statinių analizatorių. Bet aš raginu pagalvoti, kaip atsitiko, kad statinis analizatorius nuolat randa reikšmingų klaidų jūsų kode.
Tai tik pasekmė. Turime ieškoti ir pašalinti priežastis.