Jag sÄg ett inlÀgg om att PVS faktiskt har lÀrt sig att analysera under Linux, och jag bestÀmde mig för att prova pÄ mina projekt. Och sÄ hÀr blev resultatet.
InnehÄll
Responsiv support
Jag begÀrde en provnyckel, och samma dag fick jag den.
TillrÀckligt tydlig dokumentation
Analysatorn kunde startas utan större problem. Det finns ocksÄ hjÀlp för kommandoradsalternativ (Àven om det finns vissa klagomÄl, se avsnittet ).
Möjlighet till flertrÄdad analys
Analysatorn har ett "standard" alternativ -j, vilket möjliggör analys parallellt i flera uppgifter. Detta sparar mycket tid.
Bra visualisering
MÄnga olika utdataformat, frÄn text till en liten webbgrÀnssnitt. .
Enkel integration i bygget
All dokumentation finns pÄ deras webbplats. Jag kan bara sÀga att om ditt projekt byggs med hjÀlp av CMake Àr det vÀldigt enkelt.
Bra beskrivningar av diagnostik
Om du genererar utdata i lÀget fullhtml, sÄ har varje meddelande en lÀnk till beskrivningen av diagnostiken, med förklaringar, kodexempel och ytterligare lÀnkar.
Okunskap hos analysatorn om C++-sprÄket
TyvÀrr gör PVS ibland syntaktiska fel och genererar falska positiva meddelanden för helt korrekt kod.
Till exempel, det finns 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, nyckelordet auto kan betyda void, sÄ Àr det auto. Men PVS gav 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 seg webbplats
Ja, i webbgrÀnssnittet finns det en lÀnk vid varje meddelande som gÄr till motsvarande beskrivning av diagnostik med exempel. Men vid klick pÄ lÀnken fÄr man vÀnta ganska lÀnge, och ibland hÀnder det att det Àr .
SprÄk
Alla beskrivningar finns pÄ ryska, vilket Àr bra. Men lÀnkarna i rapporten leder alltid till den engelska versionen. Det vore bra att ha möjlighet att vÀxla sprÄk sÄ att man kan se diagnostiken direkt pÄ ryska. Jag har inte hittat en sÄdan möjlighet i grÀnssnittet.
Det Àr besvÀrligt att arbeta med diagnosnivÄer genom konsolen
LÄt oss börja med att de tvÄ anvÀnda kommandona (detta pvs-studio-analyzer och plog-converter) har olika format för diagnostik.
HĂ€nvisning till pvs-studio-analyzer anger:
-a [MODE], --analysis-mode [MODE]
MODE definierar typen av varningar:
1 - 64-bitarsfel;
2 - reserverad;
4 - AllmÀn analys;
8 - Mikrooptimeringar;
16 - Specifika kundförfrÄgningar;
32 - MISRA.
LÀgen kan kombineras genom att lÀgga till vÀrdena
Standard: 4Jag försökte lÀnge förstÄ var jag behövde lÀgga till ('adding the values') nycklar. Jag försökte lista separerat med kommatecken:
pvs-studio-analyzer analyze ... -a 1,4,16Jag försökte ange nyckeln flera gÄnger:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Och först dÄ insÄg jag att det var bitmasker! Och jag behövde summera, inte lÀgga till vÀrdena. Till exempel, för att fÄ allmÀnna diagnostik, diagnostik för mikrooptimeringar och MISRA, behövde jag summera dem (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44Att anvÀnda bitmasker i anvÀndargrÀnssnitt Àr som regel dÄlig stil. Allt detta kunde summeras internt, och anvÀndaren kunde fÄ ett uppsÀttning flaggor.
Dessutom finns det en annan verktyg plog-converter, som genererar mÀnskligt lÀsbar information om statisk analys. Den har andra egenheter.
HĂ€nvisning till programmet plog-converter anger:
-a, --analyzer Anger analysator(er) och nivÄ(er) som ska
anvÀndas för filtrering, dvs.
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Standard: GA:1,2HÀr har det dykt upp nÄgra "nivÄer" som tidigare inte funnits nÄgonstans, och jag hittade inget i dokumentationen om dem heller.
Det Àr överlag oklart. DÀrför satte jag allt pÄ max.
Mycket meningslös kritik pÄ Catch
I tvÄ av tre projekt som jag analyserade anvÀnds testbiblioteket . Och en stor del av meddelandena (!!! 90 av 138 i det ena och 297 av 344 i det andra !!!) ser ut sÄ hÀr:

Tar inte hÀnsyn till flertrÄdighet
MÄnga falska positiva trÀffar om pÄstÄtt oförÀnderliga variabler eller oÀndliga loopar, medan arbetet med dessa variabler sker frÄn olika trÄdar, och om det inte vore sÄ skulle enhetstesterna inte triggas.

FrÄgan Àr om en statisk analysator kan beakta detta? Jag vet inte.
PVS hittade inga verkliga fel i mina öppna projekt och , samt i ett arbetsprojekt som jag av uppenbara skÀl inte kan presentera. Det Àr dock vÀrt att notera att vissa brister redan hade fÄngats och ÄtgÀrdats tidigare med hjÀlp av och .
Sammanfattningsvis Àr intrycket av alla dessa analysatorer i stort sett detsamma: ja, de fÄngar nÄgot, ibland till och med nÄgot viktigt, men i stort sett rÀcker en kompilator.
Kanske (och personligen Àr jag glad att tÀnka sÄ) anvÀnder vÄrt team utvecklingspraxis som gör att vi genererar minimiantal skÀmtkod. BÀttre att inte skapa problem Àn att heroiskt övervinna dem.
SÄ jag vÄgar ge nÄgra rÄd om hur man skriver i C++ utan att skjuta sig sjÀlv i foten och undvika att slÄ sig i pannan med krattor.
AnvÀnd kompilatordiagnoser maximalt
VÄrt team anvÀnder (och rekommenderar er) följande kompilationsalternativ:
-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-promoInkludera dem i ert projekt, sÄ lÀr ni er mycket nytt om er kod.
HÄll er till standarden
Försök att inte anvÀnda plattformsberoende saker om det finns standardalternativ, och om ni inte kan undvika dem helt, svep in dem i speciella block under makron (eller pÄ nÄgot annat sÀtt) och se till att er kod inte kan kompileras i oförutsedda förhÄllanden.
HÄll er till standardsemantiken för operationer
Addition ska vara addition, multiplikation ska vara multiplikation, funktionsanrop ska vara funktionsanrop, kopiering ska kopiera, flytt ska flytta, containern ska vara itererbar, iteratorn ska ha förflyttning ++ och avreferering. *. Och sÄ vidare, och sÄ vidare.
Jag tror att poÀngen Àr förstÄdd. Det finns etablerade konventioner som inte Àr obligatoriska att följa, men som alla anvÀndare och lÀsare av er kod förvÀntar sig att se. Försök inte att överlista andra, för dÄ kommer ni att överlista er sjÀlva.
Skriv kompatibel kod
Först och frÀmst menar jag standardbiblioteket. Det Àr mycket önskvÀrt att grÀnssnitten för era klasser och funktioner kan anvÀndas med standard- och andra bibliotek (till exempel Boost).
Tveka inte att titta pÄ grÀnssnitten i STL och Boost. Med sÀllsynta undantag kommer ni dÀr att se vÀrdiga exempel att efterlikna.
AnvÀnd öppna verktyg maximalt
För samma statiska analys finns det minst tvÄ öppna gratisverktyg som kopplar upp sig mot vilket projekt som helst med CMake-byggsystemet.
.
Till sist vill jag understryka att jag inte uppmanar till att inte anvÀnda PVS eller nÄgra andra statiska analyssystem. Men jag uppmanar till att tÀnka pÄ hur det kan ha hÀnt att den statiska analysatorn stÀndigt hittar betydande fel i din kod.
Detta Àr bara en följd. Man mÄste söka efter och ÄtgÀrda orsaken.
KĂ€lla: habr.com
