Pashë një postim që thoshte se PVS më në fund kishte mësuar të analizonte nën Linux, dhe vendosa ta provoj në projektet e mia. Ja çfarë arrita.
Përmbajtja
Mbështetje e përgjegjshme
Kërkova një çelës provimi, dhe më të njëjtën ditë ma dërguan.
Dokumentacion mjaft i kuptueshëm
Ekipi arriti ta nisë analizatorin pa probleme të mëdha. Po ashtu ka ndihmë për komandat në konsolë (edhe pse ka disa vërejtje, shih seksionin ).
Mundësia për analizë shumëprocesore
Analizatori ka një opsion "standard" -j, që lejon të kryhen analiza paralelisht në disa detyra. Kjo kursen shumë kohë.
Visualizim i mirë
Shumë formate të ndryshme të daljes, nga teksti deri te një ndërfaqe e vogël në web. .
Integrim i thjeshtë në ndërtim
E gjithë dokumentacioni është në faqen e tyre, do të them vetëm se nëse projekti juaj ndërtohet me CMake, gjithçka është shumë e thjeshtë.
Përshkrime të mira të diagnostikave
Nëse gjeneroni daljen në mënyrë fullhtml, atëherë çdo mesazh ka një lidhje për përshkrimin e diagnostikës, me shpjegime, shembuj kodi dhe lidhje të tjera.
Mungesa e njohjes së gjuhës C++ nga analizatori
Fatkeqësisht, PVS ndonjëherë gabon në sintaksë dhe gjeneron mesazhe false pozitive për kodin krejtësisht të saktë.
P.sh., ka një funksion që kthen 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));
}Po, fjala kyç auto mund të nënkuptojë void, për atë është auto. Por PVS lëshoi këto mesazhe:
dynamic_tuple_management.hpp:29:1: error: V591 Funksioni jo-void duhet të kthejë një vlerë.
dynamic_tuple_management.hpp:29:1: error: V2542 Funksioni me një tip kthejë jo-void duhet të kthejë një vlerë nga të gjitha rrugët e daljes.Faqja shumë e ngadaltë
Po, në ndërfaqen e web-it pranë çdo mesazhi ka një lidhje për përshkrimin përkatës të diagnostikës me shembuj. Por kur klikoni në lidhje, duhet të prisni mjaft gjatë, dhe ndonjëherë ndodh edhe .
Gjuha
Të gjitha përshkrimet janë në rusisht, kjo është shkëlqyer. Por lidhjet nga raporti gjithmonë çojnë në versionin anglisht. Do të ishte mirë të kishte mundësinë për të kaluar gjuhën, për të shikuar diagnostikat gjithashtu në rusisht. Nuk kam gjetur një mundësi të tillë në ndërfaqe.
E papërshtatshme për të punuar me nivelet e diagnostikave përmes konsolës
Nisim nga ajo se dy ekipet e përdorura kanë forma të ndryshme të caktimit të diagnostikave. pvs-studio-analyzer dhe plog-converter)
Përgjigja për pvs-studio-analyzer thotë:
-a [MODE], --analysis-mode [MODE]
MODE përcakton llojin e paralajmërimeve:
1 - gabime 64-bit;
2 - të rezervuara;
4 - Analiza e Përgjithshme;
8 - Mikro-optimizime;
16 - Kërkesat Specifike të Klientëve;
32 - MISRA.
Modet mund të kombinohen duke shtuar vlerat
Default: 4Kam përpirë kohë për të kuptuar se ku duhet shtuar ("adding the values") çelësat. Kam provuar t'i rendit ato me presje:
pvs-studio-analyzer analyze ... -a 1,4,16Kam provuar të shkruaj çelësin disa herë:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Dhe vetëm pastaj e kuptova se janë maska bitore! Dhe duhet të shuma, e jo shtuar vlerat. Për shembull, për të marrë diagnostikimet e përgjithshme, diagnostikimet për mikro-optimizimet dhe MISRA, duhet t'i pohojmë ato (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44Përdorimi i maskave bitore në ndërfaqet e përdoruesit shpesh është një stil i keq. Të gjitha këto mund të ishin përmbledhur brenda dhe t'u ofroheshin përdoruesit një grup flagjsh.
Për më tepër, ka gjithashtu një utilitar plog-converter, i cili gjeneron informacion të lexueshëm për analizën statike. Ai ka ndikime të tjera.
Përgjigja për programin plog-converter tregon:
-a, --analyzer Përcakton analistët dhe nivellet që do të
përdoren për filtrimin, pra.
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Default: GA:1,2Këtu janë shfaqur disa "nivele", të cilat më parë nuk kishin qenë asgjëkundi, dhe në dokumentacionin nuk kam gjetur asnjë informacion për to.
Në përgjithësi, është e paqartë. Prandaj, unë gjithçka e tia vendosja në maksimum.
Një mori të fjalëve të pavlera në Catch
Në dy nga tre projektet që kam analizuar, përdoret biblioteka e testeve modulare . Dhe pjesa më e madhe e mesazheve (!!! 90 nga 138 në një dhe 297 nga 344 në tjetrin !!!) kanë këtë formë:

Nuk merr parasysh shumëprekësinë
Ka shumë alarme false për variablat që supozohet se janë të pandryshueshëm ose ciklet e pafund, megjithatë, puna me këto variabla kryhet nga copa të ndryshme, dhe nëse do të kishte ndodhur ndryshe, testet modulare nuk do të kishin funksionuar.

Megjithatë, a mund ta konsideronte një analist statik këtë? Nuk e di.
PVS nuk gjeti asnjë gabim të vërtetë në projektet e mia të hapura dhe , si dhe në një projekt të punës, të cilin, për arsye të kuptueshme, nuk mund ta paraqes. Megjithatë, duhet të merret parasysh se disa gabime tashmë ishin kapur dhe korrigjuar më parë me ndihmën e dhe .
Në përgjithësi, përshtypja nga të gjitha këto analizatorë është përafërsisht e njëjtë: po, ata kapin diçka, ndonjëherë madje diçka të rëndësishme, por në përgjithësi kompajleri mjafton.
Ndoshta (dhe personalisht më pëlqen ta mendoj kështu), ekipi ynë përdor praktika të tilla zhvillimi software, të cilat lejojnë të gjenerojnë sa më pak kod të dobët. Më mirë të mos krijosh probleme, sesa të kalosh heroikisht përmes tyre.
Prandaj, marr guximin të jap disa këshilla se si të shkruani në gjuhën C++ në mënyrë që të mos i lëndoni askënd dhe të mos i merrni goditje me kallash nga duar.
Përdorni diagnostikimin e kompajlerit në maksimum.
Ekipi ynë përdor (dhe ju sugjeron) opsionet e mëposhtme të kompajlimit:
-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-promoPërfshini ato në projektin tuaj, do të mësoni shumë për kodin tuaj.
Kryeni standardin.
Tentoni të mos përdorni gjëra varësie nga platforma, nëse ka disa analogë standarde, dhe nëse s'do të mund të shmangni ato fare, rretheni ato në blloqe speciale nën makro (ose ndryshe) dhe thjesht mos lejoni të kompilohet kodi juaj në kushte të papajtueshme.
Kryeni semantikën standarde të operacioneve.
Shumëzimi duhet të jetë shumëzim, shumimi - shumim, thirrja e funksionit - thirrje funksioni, kopjimi duhet të kopjojë, transferimi - të transferojë, kontejneri duhet të jetë i iterueshëm, dhe iteratori duhet të ketë përparim ++ dhe dereferencim. *. Dhe kështu me radhë, dhe kështu me radhë.
Mendoj se mesazhi është i qartë. Ka marrëveshje të vendosura, të cilat nuk janë të detyrueshme për t'u zbatuar, por që të gjithë përdoruesit dhe lexuesit e kodit tuaj presin të shohin. Mos u përpiqni të mashtroni të tjerët, pasi mund të mashtroni veten.
Shkruani kod të përputhshëm.
Së pari, kam parasysh bibliotekën standarde. Është shumë e dëshirueshme që ndërfaqet e klasave dhe funksioneve tuaja të mund të përdoren me bibliotekat standarde dhe të tjera (për shembull, Boost).
Mos ngurroni të shikoni në ndërfaqet e STL dhe Boost. Me disa përjashtime, aty do të shihni një shembull të merituar për t'u ndjekur.
Përdorni sa më shumë mjetet e hapura.
Për të njëjtin analizë statike, ekzistojnë të paktën dy mjete të hapura dhe falas, të cilat lidhen një herë me çdo projekt me sistemin e ndërtimit CMake.
.
Së fundmi, dua të theksoj se nuk po inkurajoj zvogëlimin e përdorimit të PVS ose ndonjë analizues tjetër statik. Por po inkurajoj të mendojmë se si ndodhi që analizuesi statik vazhdimisht gjen në kodin tuaj gabime të konsiderueshme.
Kjo është vetëm pasojë. Duhet të kërkojmë dhe të eliminojmë shkakun.
Burimi: habr.com
