Reviżjoni indipendenti ta' PVS-Studio (Linux, C++)

Rajt pubblikazzjoni li PVS kien tgħallem janalizza taħt il-Linux, u ddeċidejt li nipprovaha fuq il-proġetti tiegħi stess. U dan huwa dak li ħareġ minnha.


Kontenut

  1. Pros
  2. Cons
  3. Riżultati ta '
  4. Wara kelma

Pros

Appoġġ li jirrispondu

Tlabt ċavetta ta’ prova u bagħtuli l-istess jum.

Dokumentazzjoni pjuttost ċara

Irnexxielna nniedu l-analizzatur mingħajr problemi. Għajnuna għall-kmandi tal-console hija wkoll disponibbli (għalkemm hawn xi ilmenti, ara t-taqsima Cons).

Possibbiltà ta 'analiżi multi-threaded

L-analizzatur għandu għażla "standard". -j, li jippermetti li l-analiżi titwettaq b'mod parallel f'diversi kompiti. Dan jiffranka ħafna ħin.

Viżwalizzazzjoni tajba

Ħafna formati ta 'output differenti, minn test għal geddum żgħir tal-web. L-interface tal-web hija konvenjenti, konċiża, b'ħjiel ħdejn il-linji fil-kodiċi u links għal deskrizzjonijiet dijanjostiċi.

Integrazzjoni faċli fl-assemblaġġ

Id-dokumentazzjoni kollha tinsab fuq il-websajt tagħhom, nista 'ngħid biss li jekk il-proġett tiegħek jinbena bl-użu ta' CMake, allura kollox huwa sempliċi ħafna.

Deskrizzjonijiet dijanjostiċi tajbin

Jekk tiġġenera output fil-mod fullhtml, imbagħad kull messaġġ ikollu link għal deskrizzjoni dijanjostika, bi spjegazzjonijiet, eżempji ta' kodiċi u links addizzjonali.

Cons

Injoranza tal-lingwa C++ mill-analizzatur

Sfortunatament, PVS kultant jagħmel żbalji sintassi u jiġġenera messaġġi pożittivi foloz meta l-kodiċi huwa kompletament korrett.

Per eżempju, hemm funzjoni li tirritorna 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));
}

Iva hija l-kelma ewlenija auto Jista' jfisser void, dan huwa għalxiex auto. Iżda PVS ipproduċa l-messaġġi li ġejjin:

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.

Sit bil-mod ħafna

Iva, fl-interface tal-web ħdejn kull messaġġ hemm link għad-deskrizzjoni dijanjostika korrispondenti b'eżempji. Imma meta tikklikkja fuq link, trid tistenna żmien pjuttost twil, u xi kultant jiġri 504 Gateway Timeout.

Lingwa

Id-deskrizzjonijiet kollha huma bir-Russu, li huwa kbir. Iżda links mir-rapport dejjem iwasslu għall-verżjoni bl-Ingliż. Ikun sabiħ li tkun tista' taqleb il-lingwa sabiex tkun tista' tara d-dijanjosi immedjatament bir-Russu. Ma sibtx għażla bħal din fl-interface.

Huwa inkonvenjenti li taħdem b'livelli dijanjostiċi permezz tal-console

Nibdew bil-fatt li ż-żewġ kmandi użati (dan pvs-studio-analyzer и plog-converter) formati differenti għall-ispeċifikazzjoni dijanjostika.

Għajnuna għal pvs-studio-analyzer jaqra:

-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ħamilt żmien twil nipprova nifhem fejn għandi mmur żid (“iżżid il-valuri”) ċwievet. Ippruvajt insemmihom separati b'virgoli:

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

Ippruvajt nirreġistra ċ-ċavetta bosta drabi:

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

U allura biss indunajt li dawn kienu maskri daqsxejn! U għandek bżonn sommarjuimma le żid tifsiriet. Pereżempju, biex tikseb dijanjostiċi ġenerali, dijanjostiċi għal mikro-ottimizzazzjonijiet u MISRA, għandek bżonn tiġborhom fil-qosor (4 + 8 + 32 = 44):

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

L-użu ta 'bitmasks fl-interfaces tal-utent huwa ġeneralment forma ħażina. Dan kollu jista 'jinġabar fil-qosor internament, u sett ta' bnadar jista 'jiġi stabbilit għall-utent.

Barra minn hekk, hemm ukoll utilità plog-converter, li tiġġenera informazzjoni statika li tinqara mill-bniedem. Għandha problemi oħra.

Għajnuna għall-programm plog-converter rapporti:

-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

Xi "livelli" dehru hawn li ma kinux hemm qabel, u jien ma sibt xejn dwarhom lanqas fid-dokumentazzjoni.

B'mod ġenerali, mhuwiex ċar. Huwa għalhekk li waqqaf kollox għall-massimu.

Mazz ta 'ġurament stupid fuq Catch

Tnejn mit-tliet proġetti li analizzajt jużaw librerija tal-ittestjar tal-unità Qabda2. U l-akbar sehem tal-messaġġi (!!! 90 minn 138 f'wieħed u 297 minn 344 fl-ieħor!!!) għandhom il-forma li ġejja:

Reviżjoni indipendenti ta' PVS-Studio (Linux, C++)

Ma jqisx il-multithreading

Hemm ħafna pożittivi foloz dwar varjabbli li suppost ma jinbidlux jew loops bla tarf, filwaqt li x-xogħol ma 'dawn il-varjabbli jseħħ minn ħjut differenti, u kieku dan ma kienx hekk, allura testijiet tal-unità ma jaħdmux.

Reviżjoni indipendenti ta' PVS-Studio (Linux, C++)

Madankollu, analizzatur statiku jista 'saħansitra jqis dan? Ma nafx.

Riżultati ta '

PVS ma sab ebda bug reali fil-proġetti tiegħi open source Tifqigħ и Li jmiss, kif ukoll f'abbozz ta' ħidma, li, għal raġunijiet ovvji, ma nistax nippreżenta. Veru, ta 'min iżomm f'moħħu li xi nuqqasijiet diġà ġew maqbuda u kkoreġuti qabel bl-użu Cppcheck и scan-build.

B'mod ġenerali, l-impressjoni minn dawn l-analizzaturi kollha hija bejn wieħed u ieħor l-istess: iva, jaqbdu xi ħaġa, xi kultant anke xi ħaġa importanti, iżda b'mod ġenerali l-kompilatur huwa biżżejjed.

Huwa possibbli (u jien personalment inħobb naħseb hekk) li t-tim tagħna juża prattiki ta 'żvilupp ta' softwer li jippermettulna niġġeneraw ammont minimu ta 'kodiċi shitty. Huwa aħjar li ma toħloqx problemi milli tegħlebhom b'mod erojku.

Għalhekk, nieħu l-libertà li nagħti xi pariri dwar kif tikteb f'C++ b'tali mod li ma nispara lil ħadd minn riġlejn jew tolqot lil xi ħadd f'forehead b'rake.

Agħmel l-aħjar mid-dijanjostika tal-kompilatur

It-tim tagħna juża (u jagħtik parir biex) l-għażliet ta’ kumpilazzjoni li ġejjin:

-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

Ippermettihom fil-proġett tiegħek u titgħallem ħafna dwar il-kodiċi tiegħek.

Waħħal mal-istandard

Ipprova ma tużax affarijiet li jiddependu mill-pjattaforma jekk ikun hemm analogi standard, u jekk assolutament ma tistax tgħaddi mingħajrhom, wraphom fi blokki speċjali għal macros (jew xi ħaġa oħra) u sempliċement tħallix il-kodiċi tiegħek jiġi kkompilat taħt kundizzjonijiet mhux appoġġjati.

Żomm mas-semantika tal-operat standard

Iż-żieda trid tkun żieda, multiplikazzjoni trid tkun multiplikazzjoni, sejħa tal-funzjoni għandha tkun sejħa tal-funzjoni, kopja għandha tkun kopja, ġarr għandu jkun ġarr, kontenitur għandu jkun iterable, iteratur għandu jkollu promozzjoni ++ u d-dereferenzi *. U l-bqija u l-bqija.

Naħseb li l-idea hija ċara. Hemm konvenzjonijiet stabbiliti li mhumiex vinkolanti, iżda li l-utenti u l-qarrejja kollha tal-kodiċi tiegħek jistennew li jaraw. Tippruvax tegħleb lil ħaddieħor, inkella tixgħel lilek innifsek.

Ikteb kodiċi kompatibbli

L-ewwelnett, irrid infisser il-librerija standard. Huwa mixtieq ħafna li l-interfaces tal-klassijiet u l-funzjonijiet tiegħek jistgħu jintużaw ma 'libreriji standard u oħrajn (per eżempju, Boost).

Ħossok liberu li tagħti ħarsa lejn l-interfaces STL u Boost. B'eċċezzjonijiet rari, se tara mudell denju hemmhekk.

Agħmel l-aħjar użu mill-għodod open source

Għall-istess analiżi statika, hemm mill-inqas żewġ għodod miftuħa ħielsa li jistgħu jiġu konnessi darba biss ma 'kwalunkwe proġett bis-sistema tal-bini CMake.

Tista' taqra aktar dwar dan fil-pubblikazzjoni riċenti tiegħi.

Wara kelma

Fl-aħħar nett, nixtieq nenfasizza li mhux qed nirrakkomanda li ma nużax PVS jew xi analizzaturi statiċi oħra. Imma nħeġġeġ biex taħseb dwar kif ġara li l-analizzatur statiku kontinwament isib żbalji sinifikanti fil-kodiċi tiegħek.

Din hija biss konsegwenza. Irridu nfittxu u neliminaw il-kawża.

Sors: www.habr.com

Żid kumment