Malayang pagsusuri ng PVS-Studio (Linux, C++)

Nakakita ako ng publikasyon na natutunan ng PVS na pag-aralan sa ilalim ng Linux, at nagpasya akong subukan ito sa sarili kong mga proyekto. At ito ang lumabas dito.


nilalaman

  1. Pros
  2. Cons
  3. Mga resulta ng
  4. afterword

Pros

Tumutugon sa suporta

Humiling ako ng trial key at ipinadala nila ito sa akin nang araw ding iyon.

Medyo malinaw na dokumentasyon

Nagawa naming ilunsad ang analyzer nang walang anumang problema. Ang tulong para sa mga utos ng console ay magagamit din (bagaman mayroong ilang mga reklamo dito, tingnan ang seksyon Cons).

Posibilidad ng multi-threaded analysis

Ang analyzer ay may "standard" na opsyon -j, na nagpapahintulot sa pagsusuri na maisagawa nang magkatulad sa ilang mga gawain. Makakatipid ito ng maraming oras.

Magandang visualization

Maraming iba't ibang mga format ng output, mula sa teksto hanggang sa isang maliit na web muzzle. Ang web interface ay maginhawa, maigsi, na may mga pahiwatig sa tabi ng mga linya sa code at mga link sa mga diagnostic na paglalarawan.

Madaling pagsasama sa pagpupulong

Ang lahat ng dokumentasyon ay nasa kanilang website, masasabi ko lamang na kung ang iyong proyekto ay binuo gamit ang CMake, kung gayon ang lahat ay napaka-simple.

Magandang paglalarawan ng diagnostic

Kung bumuo ka ng output sa mode fullhtml, pagkatapos ang bawat mensahe ay may link sa isang diagnostic na paglalarawan, na may mga paliwanag, mga halimbawa ng code at karagdagang mga link.

Cons

Kamangmangan ng C++ na wika ng analyzer

Sa kasamaang palad, ang PVS kung minsan ay gumagawa ng mga error sa syntax at bumubuo ng mga maling positibong mensahe kapag ang code ay ganap na tama.

Halimbawa, mayroong isang function na nagbabalik 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));
}

Oo ang pangunahing salita auto Maaaring ibig sabihin void, para yan kotse. Ngunit ginawa ng PVS ang mga sumusunod na mensahe:

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.

Napakabagal ng site

Oo, sa web interface sa tabi ng bawat mensahe mayroong isang link sa kaukulang paglalarawan ng diagnostic na may mga halimbawa. Ngunit kapag nag-click ka sa isang link, kailangan mong maghintay ng mahabang panahon, at kung minsan ito ay nangyayari 504 Gateway Time-out.

Wika

Ang lahat ng mga paglalarawan ay nasa Russian, na mahusay. Ngunit ang mga link mula sa ulat ay palaging humahantong sa Ingles na bersyon. Magiging mainam na mailipat ang wika upang makita mo kaagad ang mga diagnostic sa Russian. Wala akong nakitang ganoong opsyon sa interface.

Hindi maginhawang magtrabaho sa mga antas ng diagnostic sa pamamagitan ng console

Magsimula tayo sa katotohanan na ginamit ng dalawang utos (ito pvs-studio-analyzer ΠΈ plog-converter) iba't ibang mga format para sa pagtukoy ng mga diagnostic.

Tulong para sa pvs-studio-analyzer nagbabasa:

-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

Matagal akong nag-isip kung saan ako pupunta idagdag ("pagdaragdag ng mga halaga") na key. Sinubukan kong ilista ang mga ito na pinaghihiwalay ng mga kuwit:

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

Sinubukan kong irehistro ang susi nang maraming beses:

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

At saka ko lang napagtanto na medyo mga maskara pala ito! At kailangan mo buodAt hindi idagdag mga kahulugan. Halimbawa, upang makakuha ng mga pangkalahatang diagnostic, diagnostic para sa mga micro-optimization at MISRA, kailangan mong buuin ang mga ito (4 + 8 + 32 = 44):

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

Ang paggamit ng mga bitmask sa mga interface ng gumagamit ay karaniwang masamang anyo. Ang lahat ng ito ay maaaring ibubuod sa loob, at isang hanay ng mga flag ay maaaring itakda para sa gumagamit.

Bilang karagdagan, mayroon ding utility plog-converter, na bumubuo ng impormasyon ng static analysis na nababasa ng tao. May iba pa siyang problema.

Tulong para sa programa plog-converter mga ulat:

-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

Lumitaw dito ang ilang "mga antas" na wala pa noon, at wala rin akong nakitang anuman tungkol sa mga ito sa dokumentasyon.

Sa pangkalahatan, hindi ito malinaw. Iyon ang dahilan kung bakit itinakda ko ang lahat sa maximum.

Isang grupo ng mga hangal na pagmumura sa Catch

Dalawa sa tatlong proyektong sinuri ko ay gumagamit ng unit testing library Catch2. At ang malaking bahagi ng mga mensahe (!!! 90 sa 138 sa isa at 297 sa 344 sa isa!!!) ay mayroong sumusunod na anyo:

Malayang pagsusuri ng PVS-Studio (Linux, C++)

Hindi isinasaalang-alang ang multithreading

Maraming mga maling positibo tungkol sa diumano'y hindi nagbabagong mga variable o walang katapusang mga loop, habang ang pagtatrabaho sa mga variable na ito ay nangyayari mula sa iba't ibang mga thread, at kung hindi ito ganoon, hindi gagana ang mga unit test.

Malayang pagsusuri ng PVS-Studio (Linux, C++)

Gayunpaman, maaari bang isaalang-alang ito ng isang static analyzer? hindi ko alam.

Mga resulta ng

Walang nakitang anumang totoong bug ang PVS sa aking mga open source na proyekto Pagputok ΠΈ Susunod, pati na rin sa isang gumaganang draft, na, para sa malinaw na mga kadahilanan, hindi ko maipakita. Totoo, nararapat na tandaan na ang ilang mga pagkukulang ay nahuli at naitama nang mas maaga sa paggamit Cppcheck ΠΈ scan-build.

Sa pangkalahatan, ang impresyon mula sa lahat ng mga analyzer na ito ay humigit-kumulang pareho: oo, nakakakuha sila ng isang bagay, kung minsan kahit na isang bagay na mahalaga, ngunit sa pangkalahatan ang compiler ay sapat na.

Posible (at personal kong gustong isipin) na ang aming koponan ay gumagamit ng mga kasanayan sa pagbuo ng software na nagbibigay-daan sa amin na bumuo ng isang minimum na halaga ng bastos na code. Mas mainam na huwag lumikha ng mga problema kaysa sa magiting na pagtagumpayan ang mga ito.

Kaya naman, may kalayaan akong magbigay ng ilang payo kung paano magsulat sa C++ sa paraang hindi mabaril ang mga paa ng sinuman o matamaan ang sinuman sa noo gamit ang isang rake.

Sulitin ang mga diagnostic ng compiler

Ginagamit ng aming team (at pinapayuhan ka) ng mga sumusunod na opsyon sa compilation:

-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

Paganahin ang mga ito sa iyong proyekto at matuto ng maraming tungkol sa iyong code.

Manatili sa pamantayan

Subukang huwag gumamit ng mga bagay na umaasa sa platform kung mayroong mga karaniwang analogue, at kung talagang hindi mo magagawa nang wala ang mga ito, balutin ang mga ito sa mga espesyal na bloke para sa mga macro (o iba pa) at huwag hayaang ma-compile ang iyong code sa ilalim ng hindi suportadong mga kondisyon.

Manatili sa karaniwang semantika ng operasyon

Ang pagdaragdag ay dapat na karagdagan, ang multiplikasyon ay dapat na multiplikasyon, ang function na tawag ay dapat na function na tawag, ang kopya ay dapat na kopya, ang carry ay dapat dalhin, ang lalagyan ay dapat na iterable, ang iterator ay dapat may promosyon ++ at dereferencing *. At iba pa.

Sa tingin ko ay malinaw ang ideya. May mga itinatag na convention na hindi nagbubuklod, ngunit inaasahan ng lahat ng mga user at mambabasa ng iyong code na makita. Huwag mong subukang dayain ang iba, kung hindi, daigin mo ang iyong sarili.

Sumulat ng katugmang code

Una sa lahat, ang ibig kong sabihin ay ang karaniwang aklatan. Lubhang kanais-nais na ang mga interface ng iyong mga klase at function ay maaaring gamitin sa mga pamantayan at iba pang mga aklatan (halimbawa, Boost).

Huwag mag-atubiling tingnan ang mga interface ng STL at Boost. Sa mga pambihirang eksepsiyon, makakakita ka ng isang karapat-dapat na huwaran doon.

Sulitin ang mga open source na tool

Para sa parehong static na pagsusuri, mayroong hindi bababa sa dalawang bukas na libreng tool na maaaring ikonekta nang isang beses lamang sa anumang proyekto gamit ang CMake build system.

Maaari mong basahin ang higit pa tungkol dito sa aking kamakailang publikasyon.

afterword

Sa wakas, nais kong bigyang-diin na hindi ako nagsusulong na huwag gumamit ng PVS o anumang iba pang mga static analyzer. Ngunit hinihikayat kita na isipin kung paano nangyari na ang static analyzer ay patuloy na nakakahanap ng mga makabuluhang error sa iyong code.

Ito ay isang kahihinatnan lamang. Kailangan nating hanapin at alisin ang dahilan.

Pinagmulan: www.habr.com

Magdagdag ng komento