Rishikimi i pavarur i PVS-Studio (Linux, C++)

Pashë një publikim se PVS ka mësuar të analizojë nën Linux dhe vendosa ta provoj në projektet e mia. Ja çfarë doli.


Përmbajtja

  1. Përfitimet
  2. Kundrat
  3. Përfundimet
  4. Pasthënie

Përfitimet

Përgjigje e shpejtë nga mbështetja

Kërkova një çelës provë dhe më dërguan atë të njëjtën ditë.

Dokumentacion i qartë

Arritëm ta fillojmë analizuesin pa probleme të mëdha. Ka gjithashtu ndihmë për komandat e konsolës (megjithëse ka vërejtje, shih seksionin Kundrat).

Mundësia e analizës me shumë threlda

Analizuesi ka një opsion "standard" -j, që lejon analizën të bëhet paralelisht në disa detyra. Kjo kursen shumë kohë.

Vizualizim i mirë

Shumë formate të ndryshme dalëse, nga tekstualët deri në një ndërfaqe të vogël në web. Ndërfaqja web është komode, e qartë, me sugjerime pranë rreshtave në kod dhe lidhje për përshkrime diagnostikash..

Integrim i thjeshtë në ndërtim

Të gjitha dokumentacioni është në faqen e tyre, do të them vetëm se nëse projekti juaj ndërtohet me ndihmën e CMake, gjithçka është shumë e thjeshtë.

Përshkrime të mira të diagnostikave

Nëse gjeneroni daljen në modin fullhtml, çdo mesazh ka një lidhje për përshkrimin e diagnozës, me shpjegime, shembuj kodi dhe lidhje shtesë.

Kundrat

Mosnjohja nga analizatori i gjuhës C++

Fatkeqësisht, PVS ndonjëherë gabon në sintaksë dhe gjeneron mesazhe fals pozitiv në kodin krejtësisht të saktë.

Për shembull, ka një funksion që kthen void:

template 
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çe auto mund të nënkuptojë void, për këtë arsye është auto. Por PVS dha 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ë lloj kthimi jo-void duhet të kthejë një vlerë nga të gjitha rrugët dalëse.

Një website shumë i ngadalshëm

Po, në ndërfaqen e uebit përkrah çdo mesazhi ka një lidhje përshkrimi diagnostikues me shembuj. Por kur klikon në lidhje, pritet mjaft gjatë, dhe ndonjëherë ndodh që 504 Gateway Time-out.

Gjuha

Të gjitha përshkrimet janë në rusisht, që është e shkëlqyer. Por lidhjet nga raporti gjithmonë çojnë në versionin në anglisht. Do të ishte mirë të kishte mundësinë për të ndryshuar gjuhën, në mënyrë që të shiheshin diagnostikimet menjëherë në rusisht. Nuk e kam gjetur një mundësi të tillë në ndërfaqe.

Është e pakëndshme të punosh me nivelet e diagnostikave përmes konsolës.

Le të fillojmë me faktin se dy komandat e përdorura (kjo është pvs-studio-analyzer dhe plog-converter) kanë formate të ndryshme të caktimit të diagnostikave.

Ndihma për pvs-studio-analyzer thotë:

-a [MODE], --analysis-mode [MODE]
    MODE përcakton llojin e paralajmërimeve:
    1 - gabime 64-bit;
    2 - të rezervuar;
    4 - Analiza e Përgjithshme;
    8 - Mikro-optimizations;
    16 - Kërkesat e Klientëve të Spesifikuara;
    32 - MISRA.
    Modet mund të kombinohen duke shtuar vlerat
    Default: 4

Kam provuar për një kohë të gjatë të kuptoj se ku duhet të shtohem («adding the values») çelësat. Kam provuar t'i rendisja me vija:

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

Kam provuar të shkruaj çelësin disa herë:

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

Dhe vetëm më pas e kuptova se këto janë maska bitore! Dhe duhet të përmbledh, jo të shtohem vlerat. Për shembull, për të marrë diagnostikat e përgjithshme, diagnostikat për mikrooptimizations dhe MISRA, duhen përmbledhur (4 + 8 + 32 = 44):

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

Përdorimi i maskave të bitëve në ndërfaqet e përdoruesit zakonisht është një sjellje e keqe. Të gjitha këto mund të përmblidhen dhe brenda, dhe përdoruesit t’u jepet një grup flags.

Për më tepër, ka një utilitar plog-converter, i cili gjeneron informacion të lexueshëm për analizën statike. Ka ndërlikime të tjera.

Ndihma për programin plog-converter raporton:

-a, --analyzer            Specifikon analizuesit dhe nivelët që do të
                          përdoren për filtrimin, p.sh.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Default: GA:1,2

Këtu janë shfaqur disa "nivelë", të cilët nuk kanë ekzistuar më parë, dhe në dokumentacion nuk kam gjetur asgjë për ta.

Në tërësi, është e paqartë. Prandaj, vendosa gjithçka në maksimum.

Një mori sharjesh të padobishme në Catch

Në dy nga tre projektet që kam analizuar, përdoret biblioteka e testimit modular Catch2. Dhe shumica e mesazheve (!!! 90 nga 138 në një dhe 297 nga 344 në tjetrin !!!) kanë këtë formë:

Rishikimi i pavarur i PVS-Studio (Linux, C++)

Nuk merr parasysh shumëthëtësinë

Janë shumë false pozitive mbi variablat e supozuara të pandryshueshme ose ciklet e pafund, ndërkohë që punimi me këto variabla ndodh nga thread të ndryshëm, dhe nëse do të ishte ndryshe, testet modulare nuk do të funksiononin.

Rishikimi i pavarur i PVS-Studio (Linux, C++)

Megjithatë, a mund ta marrë parasysh një analizues statik diçka të tillë? Nuk e di.

Përfundimet

PVS nuk gjeti asnjë gabim të vërtetë në projektet e mia të hapura Burst dhe Proxima, si dhe në projektin aktiv, të cilin nuk mund ta paraqes për arsyet e kuptueshme. Sidoqoftë, duhet të kemi parasysh se disa probleme tashmë janë identifikuar dhe rregulluar më parë me ndihmën e Cppcheck dhe scan-build.

Në përgjithësi, përshtypja nga të gjithë këta analizues është më pak e njëjtë: po, ata kapin diçka, ndonjëherë madje diçka të rëndësishme, por përgjithësisht kompajleret janë të mjaftueshëm.

Ndoshta (dhe mua më pëlqen ta mendoj kështu), ekipi ynë përdor praktika zhvillimi të softuerit që lejojnë të gjenerohet sasia minimale e kodit të dobët. Është më mirë të mos krijosh probleme sesa t'i zgjidhësh ato me heroizëm.

Prandaj, marrë guximin të jap disa këshilla se si të shkruash në gjuhën C++ në mënyrë që të mos godasësh askënd dhe të mos marrësh goditje me gërshërat në ballë.

Shfrytëzoni diagnostikën e kompilatorit në maksimum

Ekipa jonë përdor (dhe ju rekomandon) opsionet e mëposhtme të kompilimit:

-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

Përfshini ato në projektin tuaj, do të mësoni shumë rreth kodit tuaj.

Respektojeni standardin

Provoni të mos përdorni gjëra të varura nga platforma nëse ka analoge standarde; nëse nuk mund të shmangni ato, mbështillini ato në blloqe speciale të makros dhe thjesht mos lejoni që kodi juaj të kompilojë në kushte të papërkrahura.

Respektojeni semantikën standarde të operacioneve

Shumëzimi duhet të jetë shumëzim, shumimi - shumim, thirrja e funksionit - thirrje funksioni, kopjimi duhet të kopjojë, shndërrimi - t'i kalojë, kontejneri duhet të jetë i iterueshëm, iteratori duhet të ketë avansim ++ dhe dekodim *. Dhe kështu me radhë.

Mendoj, ideja është e qartë. Ka marrëveshje të konsoliduara që nuk janë të detyrueshme, por që të gjithë përdoruesit dhe lexuesit e kodit tuaj presin t'i shohin. Mos u përpiqni të mashtroni të tjerët, sepse mund ta mashtroni veten.

Shkruani kod të përputhshëm

Para së gjithash, kam parasysh bibliotekën standarde. Është shumë e dëshirueshme që interfecet e klasave dhe funksioneve tuaja të mund të përdoren me bibliotekat standarde dhe ato të tjera (p.sh., Boost).

Mos hezitoni të shikoni në interfecet e STL dhe Boost. Me përjashtim të rasteve të pakta, atje do të shihni një shembull të denjë për t'u ndjekur.

Përdorni maksimalisht mjetet e hapura

Për të njëjtën analizë statike, ekzistojnë të paktën dy mjete të hapura falas, të cilat lidhen pa problem me çdo projekt me sistemin e ndërtimit CMake.

Mund të lexoni më shumë rreth kësaj në publikimin tim të fundit..

Pasthënie

Në fund, do të theksoj se nuk po inkurajoj mos përdorimin e PVS-së apo ndonjë analizues tjetër statik. Por po inkurajoj të mendoni si ka ndodhur që analizuesi statik gjen vazhdimisht gabime të rëndësishme në kodin tuaj.

Ky është vetëm një pasojë. Duhet të kërkojmë dhe ta eliminojmë shkakun.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster