Óháð úttekt á PVS-Studio (Linux, C++)

Ég sá rit sem PVS hafði lært að greina undir Linux og ákvað að prófa það á mínum eigin verkefnum. Og þetta er það sem kom út úr því.


efni

  1. Kostir
  2. Gallar
  3. Niðurstöður
  4. Eftirsögn

Kostir

Móttækilegur stuðningur

Ég bað um prufulykil og þeir sendu mér hann sama dag.

Nokkuð skýr skjöl

Okkur tókst að ræsa greiningartækið án vandræða. Hjálp fyrir stjórnborðsskipanir er einnig fáanleg (þó að það séu nokkrar kvartanir hér, sjá kafla Gallar).

Möguleiki á fjölþráða greiningu

Greiningartækið er með „venjulegan“ valmöguleika -j, sem gerir kleift að framkvæma greiningu samhliða nokkrum verkefnum. Þetta sparar mikinn tíma.

Góð sjónmynd

Mörg mismunandi úttakssnið, allt frá texta yfir í lítið veftrýni. Vefviðmótið er þægilegt, hnitmiðað, með vísbendingum við hliðina á línum í kóðanum og tenglum á greiningarlýsingar.

Auðveld samþætting í samsetningu

Öll skjölin eru á vefsíðunni þeirra, ég get aðeins sagt að ef verkefnið þitt er byggt með CMake, þá er allt mjög einfalt.

Góðar greiningarlýsingar

Ef þú býrð til framleiðsla í ham fullhtml, þá hefur hvert skeyti tengil á greiningarlýsingu, með skýringum, kóðadæmum og viðbótartenglum.

Gallar

Fáfræði greiningartækisins á C++ tungumálinu

Því miður gerir PVS stundum setningafræðivillur og býr til falsk jákvæð skilaboð þegar kóðinn er alveg réttur.

Til dæmis er fall sem skilar 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á er lykilorðið auto Getur þýtt void, til þess er það bíll. En PVS framleiddi eftirfarandi skilaboð:

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.

Mjög hæg síða

Já, í vefviðmótinu við hvert skeyti er hlekkur á samsvarandi greiningarlýsingu með dæmum. En þegar þú smellir á tengil þarftu að bíða frekar lengi og stundum gerist það 504 Gateway tími.

Tungumál

Allar lýsingar eru á rússnesku, sem er frábært. En tenglar úr skýrslunni leiða alltaf í ensku útgáfuna. Það væri gaman að geta skipt um tungumál svo hægt sé að skoða greiningar strax á rússnesku. Ég fann ekki slíkan möguleika í viðmótinu.

Það er óþægilegt að vinna með greiningarstig í gegnum stjórnborðið

Við skulum byrja á því að skipanirnar tvær sem notaðar eru (þetta pvs-studio-analyzer и plog-converter) mismunandi snið til að tilgreina greiningar.

Hjálp fyrir pvs-studio-analyzer stendur:

-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

Ég var lengi að reyna að finna út hvert ég ætti að fara bæta við ("bæta gildunum við") lyklum. Ég reyndi að skrá þær aðskildar með kommum:

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

Ég reyndi að skrá lykilinn nokkrum sinnum:

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

Og þá fyrst fattaði ég að þetta voru bitagrímur! Og þú þarft draga samanOg ekki bæta við merkingar. Til dæmis, til að fá almenna greiningu, greiningu fyrir ör-hagræðingar og MISRA, þarftu að draga þær saman (4 + 8 + 32 = 44):

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

Notkun bitamaska ​​í notendaviðmóti er almennt slæmt form. Allt þetta væri hægt að draga saman innbyrðis og setja fánasett fyrir notandann.

Að auki er einnig gagnsemi plog-converter, sem býr til mannlæsilegar upplýsingar um stöðugreiningar. Hún á við önnur vandamál að etja.

Hjálp fyrir forritið plog-converter skýrslur:

-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

Nokkur „stig“ birtust hér sem voru ekki þar áður og ég fann heldur ekki neitt um þau í skjölunum.

Almennt séð er það ekki ljóst. Þess vegna setti ég allt í hámark.

Fullt af heimskulegum blótum á Catch

Tvö af þremur verkefnum sem ég greindi nota einingaprófunarsafn Catch2. Og bróðurparturinn af skilaboðum (!!! 90 af 138 í öðru og 297 af 344 í hinu!!!) hafa eftirfarandi form:

Óháð úttekt á PVS-Studio (Linux, C++)

Tekur ekki tillit til multithreading

Það eru margar rangar jákvæðar um meintar óbreyttar breytur eða endalausar lykkjur, á meðan vinna með þessar breytur á sér stað úr mismunandi þráðum, og ef svo væri ekki, þá myndu einingarpróf ekki virka.

Óháð úttekt á PVS-Studio (Linux, C++)

Hins vegar getur kyrrstöðugreiningartæki jafnvel tekið tillit til þessa? Veit ekki.

Niðurstöður

PVS fann engar raunverulegar villur í opnum uppspretta verkefnum mínum springa и Næst, svo og í vinnudrögum, sem ég get af eðlilegum ástæðum ekki lagt fram. True, það er þess virði að hafa í huga að sumir gallar hafa þegar verið veiddur og leiðrétt fyrr með því að nota Cppcheck и scan-build.

Almennt séð er tilfinningin frá öllum þessum greiningartækjum um það bil sú sama: já, þeir grípa eitthvað, stundum jafnvel eitthvað mikilvægt, en í heildina er þýðandinn nóg.

Það er mögulegt (og mér finnst það persónulega gott) að teymið okkar notar hugbúnaðarþróunaraðferðir sem gera okkur kleift að búa til lágmarks magn af skítakóða. Það er betra að búa ekki til vandamál en að sigrast á þeim á hetjulegan hátt.

Þess vegna tek ég mér það bessaleyfi að gefa ráð um hvernig á að skrifa í C++ á þann hátt að skjóta ekki fæturna af neinum eða slá neinn í ennið með hrífu.

Nýttu þýðandagreininguna sem best

Teymið okkar notar (og ráðleggur þér að) eftirfarandi safnvalkosti:

-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

Virkjaðu þau í verkefninu þínu og lærðu mikið um kóðann þinn.

Haltu þig við staðalinn

Reyndu að nota ekki vettvangsháða hluti ef það eru staðlaðar hliðstæður, og ef þú getur alls ekki verið án þeirra, pakkaðu þeim inn í sérstakar blokkir fyrir fjölvi (eða eitthvað annað) og einfaldlega ekki láta kóðann þinn vera settur saman við óstuddar aðstæður.

Haltu þig við staðlaða merkingarfræði

Samlagning verður að vera samlagning, margföldun verður að vera margföldun, fallkall verður að vera fallkall, afrit verður að vera afrit, bera verður að vera bera, ílát verður að vera endurtekið, endurtekning verður að vera með kynningu ++ og frávísun *. Og svo framvegis og svo framvegis.

Ég held að hugmyndin sé skýr. Það eru staðfestar samþykktir sem eru ekki bindandi, en allir notendur og lesendur kóðans búast við að sjá. Ekki reyna að yfirstíga aðra, annars muntu framhjá sjálfum þér.

Skrifaðu samhæfan kóða

Í fyrsta lagi á ég við staðlaða bókasafnið. Það er mjög æskilegt að hægt sé að nota viðmót flokka og aðgerða með stöðluðum og öðrum bókasöfnum (til dæmis Boost).

Ekki hika við að kíkja á STL og Boost viðmótin. Með sjaldgæfum undantekningum muntu sjá þar verðuga fyrirmynd.

Nýttu þér opinn hugbúnað

Fyrir sömu kyrrstöðugreiningu eru að minnsta kosti tvö opin ókeypis verkfæri sem hægt er að tengja aðeins einu sinni við hvaða verkefni sem er með CMake byggingarkerfinu.

Þú getur lesið meira um þetta í nýlegu riti mínu.

Eftirsögn

Að lokum vil ég undirstrika að ég er ekki að mælast til þess að nota ekki PVS eða önnur kyrrstöðugreiningartæki. En ég hvet þig til að hugsa um hvernig það gerðist að kyrrstöðugreiningartækið finnur stöðugt verulegar villur í kóðanum þínum.

Þetta er bara afleiðing. Við þurfum að leita og útrýma orsökinni.

Heimild: www.habr.com

Bæta við athugasemd