Jag sÄg en publikation som PVS hade lÀrt sig att analysera under Linux och bestÀmde mig för att prova den pÄ mina egna projekt. Och det hÀr Àr vad som kom ut ur det.
InnehÄll
Responsiv support
Jag begÀrde en testnyckel och de skickade den till mig samma dag.
Ganska tydlig dokumentation
Vi lyckades starta analysatorn utan problem. HjÀlp för konsolkommandon Àr ocksÄ tillgÀnglig (Àven om det finns nÄgra klagomÄl hÀr, se avsnittet ).
Möjlighet till flertrÄdig analys
Analysatorn har ett "standard"-alternativ -j, vilket gör att analyser kan utföras parallellt i flera uppgifter. Detta sparar mycket tid.
Bra visualisering
MÄnga olika utdataformat, frÄn text till ett litet nÀtmunkorg. .
Enkel integration i monteringen
All dokumentation finns pÄ deras hemsida, jag kan bara sÀga att om ditt projekt Àr byggt med CMake sÄ Àr allt vÀldigt enkelt.
Bra diagnostiska beskrivningar
Om du genererar utdata i lÀge fullhtml, dÄ har varje meddelande en lÀnk till en diagnostisk beskrivning, med förklaringar, kodexempel och ytterligare lÀnkar.
Analysatorns okunskap om C++-sprÄket
TyvÀrr gör PVS ibland syntaxfel och genererar falska positiva meddelanden nÀr koden Àr helt korrekt.
Det finns till exempel en funktion som returnerar 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));
}Ja, nyckelord auto Kan betyda void, det Àr vad det Àr till för bil. Men PVS producerade följande meddelanden:
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.Mycket lÄngsam sida
Ja, i webbgrÀnssnittet bredvid varje meddelande finns en lÀnk till motsvarande diagnostiska beskrivning med exempel. Men nÀr man klickar pÄ en lÀnk fÄr man vÀnta ganska lÀnge, och ibland hÀnder det .
sprÄk
Alla beskrivningar Àr pÄ ryska, vilket Àr bra. Men lÀnkar frÄn rapporten leder alltid till den engelska versionen. Det skulle vara trevligt att kunna byta sprÄk sÄ att du kan se diagnostik direkt pÄ ryska. Jag hittade inte ett sÄdant alternativ i grÀnssnittet.
Det Àr obekvÀmt att arbeta med diagnostiska nivÄer via konsolen
LÄt oss börja med det faktum att de tvÄ kommandona som anvÀnds (detta pvs-studio-analyzer О plog-converter) olika format för att specificera diagnostik.
HjÀlp för pvs-studio-analyzer lyder:
-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: 4Jag tillbringade lĂ„ng tid med att försöka komma pĂ„ vart jag skulle gĂ„ lĂ€gga till (âatt lĂ€gga till vĂ€rdenaâ) nycklar. Jag försökte lista dem separerade med kommatecken:
pvs-studio-analyzer analyze ... -a 1,4,16Jag försökte registrera nyckeln flera gÄnger:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Och först dÄ insÄg jag att det hÀr var bitmasker! Och du behöver summeraOch inte lÀgga till betydelser. Till exempel, för att fÄ allmÀn diagnostik, diagnostik för mikrooptimeringar och MISRA, mÄste du summera dem (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44Att anvÀnda bitmasker i anvÀndargrÀnssnitt Àr i allmÀnhet dÄlig form. Allt detta kan sammanfattas internt och en uppsÀttning flaggor kan stÀllas in för anvÀndaren.
Dessutom finns det ocksÄ ett verktyg plog-converter, som genererar statisk analysinformation som kan lÀsas av mÀnniskor. Hon har andra problem.
HjÀlp till programmet plog-converter rapporterar:
-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,2NÄgra "nivÄer" dök upp hÀr som inte fanns dÀr tidigare, och jag hittade inget om dem i dokumentationen heller.
I allmÀnhet Àr det inte klart. DÀrför satte jag allt till max.
Ett gÀng dumma svordomar pÄ Catch
TvÄ av de tre projekt jag analyserade anvÀnder ett enhetstestningsbibliotek . Och lejonparten av meddelanden (!!! 90 av 138 i det ena och 297 av 344 i det andra!!!) har följande form:

Tar inte hÀnsyn till multithreading
Det finns mÄnga falska positiva resultat om förmodat oförÀnderliga variabler eller Àndlösa loopar, medan arbete med dessa variabler sker frÄn olika trÄdar, och om det inte vore sÄ skulle enhetstester inte fungera.

Men kan en statisk analysator ens ta hÀnsyn till detta? Vet inte.
PVS hittade inga riktiga buggar i mina projekt med öppen kÀllkod О , samt i ett arbetsutkast, som jag av naturliga skÀl inte kan lÀgga fram. Det Àr sant att det Àr vÀrt att komma ihÄg att vissa brister redan har fÄngats och korrigerats tidigare О .
I allmÀnhet Àr intrycket frÄn alla dessa analysatorer ungefÀr detsamma: ja, de fÄngar nÄgot, ibland till och med nÄgot viktigt, men totalt sett rÀcker kompilatorn.
Det Àr möjligt (och jag personligen gillar att tro det) att vÄrt team anvÀnder metoder för mjukvaruutveckling som tillÄter oss att generera en minimal mÀngd taskig kod. Det Àr bÀttre att inte skapa problem Àn att heroiskt övervinna dem.
DÀrför tar jag mig friheten att ge nÄgra rÄd om hur man skriver i C++ pÄ ett sÄdant sÀtt att man inte skjuter nÄgons ben eller slÄr nÄgon i pannan med en kratta.
FĂ„ ut det mesta av kompilatordiagnostik
VÄrt team anvÀnder (och rÄder dig att) följande sammanstÀllningsalternativ:
-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-promoAktivera dem i ditt projekt och lÀr dig mycket om din kod.
HÄll dig till standarden
Försök att inte anvÀnda plattformsberoende saker om det finns standardanaloger, och om du absolut inte klarar dig utan dem, linda in dem i speciella block för makron (eller nÄgot annat) och lÄt helt enkelt inte din kod kompileras under förhÄllanden som inte stöds.
HÄll dig till standardoperationssemantik
Addition mÄste vara addition, multiplikation mÄste vara multiplikation, funktionsanrop mÄste vara funktionsanrop, kopia mÄste vara copy, carry mÄste vara carry, container mÄste vara iterabel, iterator mÄste ha marknadsföring ++ och dÀrifrÄn *. Och sÄ vidare.
Jag tror att tanken Àr klar. Det finns etablerade konventioner som inte Àr bindande, men som alla anvÀndare och lÀsare av din kod förvÀntar sig att se. Försök inte överlista andra, annars kommer du att överlista dig sjÀlv.
Skriv kompatibel kod
Först och frÀmst menar jag standardbiblioteket. Det Àr mycket önskvÀrt att grÀnssnitten för dina klasser och funktioner kan anvÀndas med standardbibliotek och andra bibliotek (till exempel Boost).
Ta gÀrna en titt pÄ STL- och Boost-grÀnssnitten. Med sÀllsynta undantag kommer du att se en vÀrdig förebild dÀr.
FÄ ut det mesta av verktyg med öppen kÀllkod
För samma statiska analys finns det minst tvÄ öppna gratisverktyg som bara kan kopplas en gÄng till vilket projekt som helst med CMake-byggsystemet.
.
Slutligen vill jag betona att jag inte föresprÄkar att inte anvÀnda PVS eller nÄgon annan statisk analysator. Men jag uppmuntrar dig att tÀnka pÄ hur det gick till att den statiska analysatorn hela tiden hittar betydande fel i din kod.
Detta Àr bara en konsekvens. Vi mÄste leta efter och eliminera orsaken.
KĂ€lla: will.com
