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.
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.
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.
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:
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.
Madankollu, analizzatur statiku jista 'saħansitra jqis dan? Ma nafx.
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:
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.
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.