Tinjauan independen PVS-Studio (Linux, C++)

Aku weruh publikasi sing PVS wis sinau kanggo njelasno ing Linux, lan mutusaké kanggo nyoba ing proyek dhewe. Lan iki sing metu saka iku.


Isi

  1. Плюсы
  2. Минусы
  3. Hasil
  4. Afterword

Плюсы

Dhukungan responsif

Aku njaluk kunci uji coba lan dikirim menyang aku ing dina sing padha.

Dokumentasi sing cukup cetha

Kita bisa miwiti analisa tanpa masalah. Bantuan kanggo perintah console uga kasedhiya (sanajan ana sawetara keluhan ing kene, deleng bagean Минусы).

Kamungkinan analisis multi-threaded

Analyzer duwe pilihan "standar". -j, ngidini analisis ditindakake kanthi paralel ing sawetara tugas. Iki ngirit wektu akeh.

Visualisasi apik

Akeh macem-macem format output, saka teks menyang moncong web cilik. Antarmuka web trep, ringkes, kanthi pitunjuk ing jejere baris ing kode lan pranala menyang deskripsi diagnostik.

Gampang integrasi menyang perakitan

Kabeh dokumentasi ana ing situs web, aku mung bisa ujar manawa proyek sampeyan dibangun nggunakake CMake, mula kabeh gampang banget.

Katrangan diagnostik sing apik

Yen sampeyan ngasilake output ing mode fullhtml, banjur saben pesen duwe pranala menyang gambaran diagnostik, karo panjelasan, conto kode lan pranala tambahan.

Минусы

Ora ngerti basa C ++ dening penganalisis

Sayange, PVS kadhangkala nggawe kesalahan sintaks lan ngasilake pesen positif palsu nalika kode kasebut bener.

Contone, ana fungsi sing bali 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));
}

Ya, tembung kunci auto Bisa tegese void, iku kanggo apa otomatis. Nanging PVS ngasilake pesen ing ngisor iki:

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.

Situs alon banget

Ya, ing antarmuka web ing jejere saben pesen ana link menyang deskripsi diagnostik sing cocog karo conto. Nanging nalika sampeyan ngeklik link, sampeyan kudu ngenteni cukup suwe, lan kadhangkala kedadeyan kasebut 504 Gateway Wektu entek.

Basa

Kabeh deskripsi ana ing Rusia, sing apik banget. Nanging pranala saka laporan tansah mimpin kanggo versi Inggris. Luwih becik bisa ngalih basa supaya sampeyan bisa langsung ndeleng diagnostik ing basa Rusia. Aku ora nemu pilihan kuwi ing antarmuka.

Ora trep kanggo nggarap level diagnostik liwat konsol

Ayo dadi miwiti karo kasunyatan sing loro printah digunakake (iki pvs-studio-analyzer и plog-converter) macem-macem format kanggo nemtokake diagnostik.

Bantuan kanggo pvs-studio-analyzer maos:

-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

Suwe-suwe aku njajal arep menyang ngendi nambah ("nambahake nilai") tombol. Aku nyoba kanggo dhaptar sing dipisahake karo koma:

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

Aku nyoba ndhaptar kunci kaping pirang-pirang:

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

Lan mung banjur aku ngerti yen iki topeng dicokot! Lan sampeyan kudu nyimpulake, lan ora nambah tegesipun. Contone, kanggo entuk diagnostik umum, diagnostik kanggo micro-optimizations lan MISRA, sampeyan kudu nyimpulake (4 + 8 + 32 = 44):

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

Nggunakake bitmasks ing antarmuka pangguna umume ala. Kabeh iki bisa diringkes sacara internal, lan sakumpulan gendera bisa disetel kanggo pangguna.

Kajaba iku, ana uga sarana plog-converter, sing ngasilake informasi analisis statis sing bisa diwaca manungsa. Dheweke duwe masalah liyane.

Bantuan kanggo program plog-converter laporan:

-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

Sawetara "tingkat" katon ing kene sing ora ana sadurunge, lan aku uga ora nemu apa-apa bab mau ing dokumentasi.

Umumé, ora jelas. Mulane aku nyetel kabeh kanthi maksimal.

A Bunch saka bodho sumpah ing Catch

Loro saka telung proyèk aku analisa nggunakake perpustakaan testing unit Catch2. Lan pesen sing paling gedhe (!!! 90 saka 138 ing siji lan 297 saka 344 ing liyane!!!) duwe wangun ing ngisor iki:

Tinjauan independen PVS-Studio (Linux, C++)

Ora nganggep multithreading

Ana akeh positip palsu babagan variabel sing mesthine ora owah utawa puteran tanpa wates, nalika nggarap variabel kasebut dumadi saka benang sing beda-beda, lan yen ora, tes unit ora bakal bisa digunakake.

Tinjauan independen PVS-Studio (Linux, C++)

Nanging, apa ana penganalisa statis bisa nganggep iki? ora ngerti.

Hasil

PVS ora nemokake bug nyata ing proyek open source bledosan и Sabanjure, uga ing draf kerja, sing, amarga alasan sing jelas, aku ora bisa nampilake. Bener, kudu eling yen sawetara kekurangan wis kejiret lan didandani sadurunge nggunakake Cppcheck и scan-build.

Umumé, kesan saka kabeh penganalisa iki kira-kira padha: ya, padha nyekel apa-apa, kadhangkala ana sing penting, nanging sakabèhé compiler cukup.

Bisa uga (lan aku seneng mikir kaya ngono) tim kita nggunakake praktik pangembangan piranti lunak sing ngidini kita ngasilake kode paling sithik. Luwih becik ora nggawe masalah tinimbang ngatasi kanthi heroik.

Mulane, aku njupuk kamardikan kanggo menehi sawetara saran carane nulis ing C ++ ing kuwi cara sing ora njupuk mati sikil sapa utawa nggebug sapa ing bathuk karo rake.

Nggawe paling diagnostik compiler

Tim kita nggunakake (lan menehi saran kanggo) opsi kompilasi ing ngisor iki:

-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

Aktifake ing proyek sampeyan lan sinau akeh babagan kode sampeyan.

Kelet kanggo standar

Coba aja nggunakake barang sing gumantung ing platform yen ana analog standar, lan yen sampeyan ora bisa nindakake tanpa, bungkus blok khusus kanggo makro (utawa liya) lan aja nganti kode sampeyan disusun ing kahanan sing ora didukung.

Kelet kanggo semantik operasi standar

Penambahan kudu ditambah, perkalian kudu perkalian, fungsi panggilan kudu fungsi panggilan, salinan kudu salinan, nggawa kudu nggawa, wadah kudu iterable, iterator kudu promosi. ++ lan dereferencing *. Lan sateruse.

Aku idea wis cetha. Ana konvènsi mantep sing ora naleni, nanging kabeh pangguna lan pembaca kode sampeyan ngarepake. Aja nyoba ngapusi wong liya, yen ora, sampeyan bakal ngalahake awake dhewe.

Tulis kode sing cocog

Kaping pisanan, maksudku perpustakaan standar. Apike banget yen antarmuka kelas lan fungsi sampeyan bisa digunakake karo perpustakaan standar lan liyane (contone, Boost).

Bebas bae kanggo ndeleng ing antarmuka STL lan Boost. Kanthi pangecualian langka, sampeyan bakal weruh model peran sing pantes ing kana.

Ngoptimalake alat sumber terbuka

Kanggo analisis statis sing padha, paling ora ana rong alat gratis sing bisa disambungake mung sapisan menyang proyek apa wae kanthi sistem mbangun CMake.

Sampeyan bisa maca liyane babagan iki ing publikasi anyarku.

Afterword

Pungkasan, aku pengin nandheske manawa aku ora nganjurake supaya ora nggunakake PVS utawa analisa statis liyane. Nanging aku ngajak sampeyan mikir babagan kedadean sing analisa statis terus-terusan nemokake kesalahan sing signifikan ing kode sampeyan.

Iki mung akibat. Kita kudu nggoleki lan ngilangi sababe.

Source: www.habr.com

Add a comment