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

Pashë një botim që PVS kishte mësuar ta analizonte nën Linux dhe vendosa ta provoja në projektet e mia. Dhe kjo është ajo që doli prej saj.


Përmbajtje

  1. Rekuizitë
  2. Cons
  3. Rezultatet e
  4. pasthënje

Rekuizitë

Mbështetje e përgjegjshme

Kërkova një çelës prove dhe ma dërguan po atë ditë.

Dokumentacion mjaft i qartë

Ne arritëm të nisnim analizuesin pa asnjë problem. Ndihma për komandat e konsolës është gjithashtu e disponueshme (megjithëse ka disa ankesa këtu, shihni seksionin Cons).

Mundësia e analizës me shumë fije

Analizatori ka një opsion "standard". -j, duke lejuar që analiza të kryhet paralelisht në disa detyra. Kjo kursen shumë kohë.

Vizualizimi i mirë

Shumë formate të ndryshme të daljes, nga teksti në një surrat të vogël në internet. Ndërfaqja e internetit është e përshtatshme, koncize, me sugjerime pranë rreshtave në kod dhe lidhje me përshkrimet diagnostikuese.

Integrim i lehtë në asamble

I gjithë dokumentacioni është në faqen e tyre të internetit, mund të them vetëm se nëse projekti juaj është ndërtuar duke përdorur CMake, atëherë gjithçka është shumë e thjeshtë.

Përshkrime të mira diagnostikuese

Nëse gjeneroni dalje në modalitet fullhtml, atëherë çdo mesazh ka një lidhje me një përshkrim diagnostik, me shpjegime, shembuj kodesh dhe lidhje shtesë.

Cons

Mosnjohja e gjuhës C++ nga ana e analizuesit

Fatkeqësisht, PVS ndonjëherë bën gabime sintaksore dhe gjeneron mesazhe false pozitive kur kodi është plotësisht i saktë.

Për shembull, ekziston një funksion që kthehet 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 është fjala kyçe auto Mund të thotë void, për këtë është auto. Por PVS prodhoi mesazhet e mëposhtme:

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.

Faqe shumë e ngadaltë

Po, në ndërfaqen e internetit pranë çdo mesazhi ka një lidhje me përshkrimin përkatës diagnostikues me shembuj. Por kur klikoni në një lidhje, duhet të prisni një kohë mjaft të gjatë dhe ndonjëherë ndodh 504 Gateway Time-out.

Gjuhë

Të gjitha përshkrimet janë në Rusisht, gjë që është e mrekullueshme. Por lidhjet nga raporti çojnë gjithmonë në versionin anglisht. Do të ishte mirë të jeni në gjendje të ndërroni gjuhën në mënyrë që të mund të shikoni menjëherë diagnostikimin në Rusisht. Unë nuk gjeta një opsion të tillë në ndërfaqe.

Është e papërshtatshme të punosh me nivele diagnostikuese përmes tastierës

Le të fillojmë me faktin se dy komandat e përdorura (kjo pvs-studio-analyzer и plog-converter) formate të ndryshme për specifikimin e diagnostifikimit.

Ndihmë për pvs-studio-analyzer lexon:

-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

Kam kaluar një kohë të gjatë duke u përpjekur të kuptoj se ku të shkoj shto (“shtimi i vlerave”) çelësat. Unë u përpoqa t'i rendit ato të ndara me presje:

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

Unë u përpoqa të regjistroja çelësin disa herë:

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

Dhe vetëm atëherë kuptova se këto ishin maska! Dhe ju duhet PërmbledhjeDhe jo shto kuptimet. Për shembull, për të marrë diagnostifikime të përgjithshme, diagnostifikime për mikro-optimizimet dhe MISRA, duhet t'i përmblidhni ato (4 + 8 + 32 = 44):

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

Përdorimi i bitmasks në ndërfaqet e përdoruesit është përgjithësisht një formë e keqe. E gjithë kjo mund të përmblidhet brenda, dhe një grup flamujsh mund të vendoset për përdoruesin.

Përveç kësaj, ekziston edhe një shërbim plog-converter, i cili gjeneron informacione të analizës statike të lexueshme nga njeriu. Ajo ka probleme të tjera.

Ndihmë për programin plog-converter raporton:

-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

Këtu u shfaqën disa "nivele" që nuk ishin më parë, dhe unë nuk gjeta asgjë për to as në dokumentacion.

Në përgjithësi, nuk është e qartë. Për këtë arsye kam vendosur gjithçka në maksimum.

Një tufë sharjesh marrëzish në Catch

Dy nga tre projektet që analizova përdorin një bibliotekë testimi të njësive Catch2. Dhe pjesa më e madhe e mesazheve (!!! 90 nga 138 në njërën dhe 297 nga 344 në tjetrën!!!) kanë formën e mëposhtme:

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

Nuk merr parasysh multithreading

Ka shumë false pozitive rreth variablave të supozuar të pandryshueshëm ose sythe të pafund, ndërsa puna me këto variabla ndodh nga fije të ndryshme, dhe nëse nuk do të ishte kështu, atëherë testet e njësive nuk do të funksiononin.

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

Sidoqoftë, a mund ta marrë këtë parasysh edhe një analizues statik? nuk e di.

Rezultatet e

PVS nuk gjeti ndonjë defekt të vërtetë në projektet e mia me burim të hapur Burst и Tjetra, si dhe në një draft pune, të cilin për arsye të dukshme nuk mund ta paraqes. Vërtetë, ia vlen të kihet parasysh se disa mangësi tashmë janë kapur dhe korrigjuar më herët duke përdorur Kontrollo Cpp и scan-build.

Në përgjithësi, përshtypja nga të gjithë këta analizues është afërsisht e njëjtë: po, ata kapin diçka, ndonjëherë edhe diçka të rëndësishme, por në përgjithësi përpiluesi është i mjaftueshëm.

Është e mundur (dhe mua personalisht më pëlqen të mendoj kështu) që ekipi ynë të përdorë praktika të zhvillimit të softuerit që na lejojnë të gjenerojmë një sasi minimale kodi të ndyrë. Është më mirë të mos krijoni probleme sesa t'i kapërceni ato heroikisht.

Prandaj, marr guximin të jap disa këshilla se si të shkruash në C++ në mënyrë të tillë që të mos i shkrepësh këmbët askujt apo të godasësh askënd në ballë me grabujë.

Përfitoni sa më shumë nga diagnostikimi i përpiluesit

Ekipi ynë përdor (dhe ju këshillon) opsionet e mëposhtme të përpilimit:

-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

Aktivizojini ato në projektin tuaj dhe mësoni shumë për kodin tuaj.

Rrini në standard

Mundohuni të mos përdorni gjëra të varura nga platforma nëse ka analoge standarde, dhe nëse absolutisht nuk mund të bëni pa to, mbështillini ato në blloqe speciale për makro (ose diçka tjetër) dhe thjesht mos lejoni që kodi juaj të përpilohet në kushte të pambështetura.

Përmbajuni semantikës standarde të funksionimit

Mbledhja duhet të jetë mbledhje, shumëzimi duhet të jetë shumëzimi, thirrja e funksionit duhet të jetë thirrja e funksionit, kopja duhet të jetë kopje, bartja duhet të jetë e bartur, kontejneri duhet të jetë i përsëritshëm, përsëritësi duhet të ketë promovim ++ dhe mosreferencimi *. Dhe kështu me radhë e kështu me radhë.

Mendoj se ideja është e qartë. Ka konventa të vendosura që nuk janë të detyrueshme, por që të gjithë përdoruesit dhe lexuesit e kodit tuaj presin t'i shohin. Mos u mundoni të mashtroni të tjerët, përndryshe do të mashtroni veten.

Shkruani kodin e përputhshëm

Para së gjithash, 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ë hidhni një sy në ndërfaqet STL dhe Boost. Me përjashtime të rralla, atje do të shihni një model të denjë.

Përfitoni sa më shumë nga mjetet me burim të hapur

Për të njëjtën analizë statike, ekzistojnë të paktën dy mjete të hapura falas që mund të lidhen vetëm një herë me çdo projekt me sistemin e ndërtimit CMake.

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

pasthënje

Së fundi, do të doja të theksoja se nuk jam duke mbrojtur që të mos përdoret PVS ose ndonjë analizues tjetër statik. Por ju inkurajoj të mendoni se si ndodhi që analizuesi statik gjen vazhdimisht gabime të rëndësishme në kodin tuaj.

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

Burimi: www.habr.com

Shto një koment