Tinjauan bebas tina PVS-Studio (Linux, C++)

Kuring nempo hiji publikasi nu PVS kungsi diajar nganalisis dina Linux Ubuntu, sarta mutuskeun pikeun nyobaan dina proyék kuring sorangan. Sareng ieu anu kaluar tina éta.


eusi

  1. Плюсы
  2. Минусы
  3. hasil
  4. afterword

Плюсы

Rojongan responsif

Kuring naroskeun konci percobaan sareng aranjeunna dikirim ka kuring dina dinten anu sami.

Dokuméntasi anu cukup jelas

Kami junun ngaluncurkeun analisa tanpa masalah. Pitulung pikeun paréntah konsol ogé sayogi (sanaos aya sababaraha keluhan di dieu, tingali bagian Минусы).

Kamungkinan analisis multi-threaded

Analis gaduh pilihan "standar". -j, ngamungkinkeun analisa dilaksanakeun sacara paralel dina sababaraha pancén. Ieu ngaheéat loba waktu.

Visualisasi anu saé

Seueur format kaluaran anu béda-béda, tina téks dugi ka muzzle wéb leutik. Antarbeungeut wéb merenah, singket, sareng petunjuk di gigireun garis dina kode sareng tautan kana déskripsi diagnostik.

integrasi gampang kana assembly nu

Sadaya dokuméntasi aya dina halaman wébna, kuring ngan ukur tiasa nyebatkeun yén upami proyék anjeun diwangun nganggo CMake, maka sadayana saderhana pisan.

déskripsi diagnostik alus

Upami anjeun ngahasilkeun kaluaran dina modeu fullhtml, teras unggal pesen gaduh tautan ka pedaran diagnostik, kalayan panjelasan, conto kode sareng tautan tambahan.

Минусы

Jahiliah tina basa C ++ ku analyzer

Hanjakalna, PVS kadang nyieun kasalahan sintaksis sareng ngahasilkeun pesen positip palsu nalika kodena leres pisan.

Contona, aya hiji fungsi nu mulih 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));
}

Sumuhun kecap konci auto Bisa hartosna void, éta naon éta pikeun otomatis. Tapi PVS ngahasilkeun pesen di handap ieu:

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 pisan slow

Leres, dina antarmuka wéb di gigireun unggal pesen aya tautan kana pedaran diagnostik anu saluyu sareng conto. Tapi mun anjeun klik link, anjeun kudu antosan rada lila, sarta kadangkala kajadian 504 Gateway Waktos-kaluar.

basa

Sadaya déskripsi aya dina basa Rusia, anu saé. Tapi Tumbu ti laporan salawasna ngakibatkeun versi Inggris. Éta langkung saé upami tiasa ngalihkeun basa supados anjeun tiasa langsung ningali diagnostik dina basa Rusia. Abdi henteu mendakan pilihan sapertos kitu dina antarmuka.

Teu pikaresepeun pikeun damel sareng tingkat diagnostik liwat konsol

Hayu urang mimitian ku kanyataan yén dua paréntah anu dianggo (ieu pvs-studio-analyzer и plog-converter) format béda pikeun nangtukeun diagnostics.

Pitulung pikeun pvs-studio-analyzer berbunyi:

-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

Kuring nyéépkeun waktos anu lami-lami nyobian terang dimana angkat nambahan ("nambahkeun nilai") konci. Kuring nyobian daptar aranjeunna dipisahkeun ku koma:

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

Kuring nyobian ngadaptarkeun konci sababaraha kali:

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

Sareng kuring sadar yén ieu mangrupikeun masker bit! Sareng anjeun peryogi nyimpulkeunteu nambahan hartina. Contona, pikeun meunangkeun diagnostics umum, diagnostics pikeun micro-optimizations na MISRA, anjeun kudu jumlah aranjeunna nepi (4 + 8 + 32 = 44):

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

Ngagunakeun bitmasks dina interfaces pamaké umumna bentuk goréng. Sadaya ieu tiasa diringkeskeun sacara internal, sareng sakumpulan bandéra tiasa disetél pikeun pangguna.

Sajaba ti éta, aya ogé utiliti plog-converter, nu ngahasilkeun informasi analisis statik bisa dibaca manusa. Manéhna boga masalah séjén.

Pitulung pikeun 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

Sababaraha "tingkat" muncul di dieu anu henteu aya sateuacanna, sareng kuring henteu mendakan nanaon ngeunaan éta dina dokuméntasi.

Sacara umum, teu jelas. Éta sababna kuring nyetél sadayana maksimal.

Kebat sumpah bodo on Catch

Dua tina tilu proyék kuring dianalisis ngagunakeun perpustakaan unit nguji Catch2. Sareng pesen anu ageung (!!! 90 ti 138 dina hiji sareng 297 tina 344 dina anu sanés!!!) gaduh bentuk ieu:

Tinjauan bebas tina PVS-Studio (Linux, C++)

Teu tumut kana akun multithreading

Aya loba positip palsu ngeunaan variabel konon unchanged atawa puteran sajajalan, bari gawé bareng variabel ieu lumangsung ti threads béda, sarta lamun ieu teu kitu, teras Unit tés moal jalan.

Tinjauan bebas tina PVS-Studio (Linux, C++)

Nanging, naha analisa statik tiasa nganggap ieu? teu nyaho.

hasil

PVS henteu mendakan bug nyata dina proyék open source kuring peupeus и Teras, ogé dina draf kerja, anu, kusabab alesan anu jelas, kuring henteu tiasa nampilkeun. Leres, éta kedah émut yén sababaraha kalemahan parantos kapendak sareng dilereskeun sateuacana dianggo Cppcheck и scan-build.

Sacara umum, kesan tina sadaya analisa ieu kira-kira sami: enya, aranjeunna nyekel hiji hal, sakapeung malah hal anu penting, tapi sacara umum kompiler cukup.

Ieu mungkin (sareng kuring pribadi resep mikir kitu) yén tim kami nganggo prakték pamekaran parangkat lunak anu ngamungkinkeun urang ngahasilkeun jumlah minimum kode shitty. Éta langkung saé henteu nyiptakeun masalah tibatan sacara heroik ngatasina.

Kituna, abdi nyandak kamerdikaan masihan sababaraha saran ngeunaan cara nulis dina C ++ dina cara sapertos teu némbak suku saha urang kaluar atawa pencét saha dina dahi kalawan rake a.

Ngamangpaatkeun diagnostik compiler

Tim kami nganggo (sareng mamatahan anjeun) pilihan kompilasi ieu:

-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

Aktipkeun aranjeunna dina proyék anjeun sareng diajar seueur ngeunaan kode anjeun.

Lengket kana standar

Coba teu nganggo hal-hal anu gumantung kana platform upami aya analog standar, sareng upami anjeun leres-leres henteu tiasa ngalakukeun tanpa aranjeunna, bungkus aranjeunna dina blok khusus pikeun makro (atanapi anu sanés) sareng ngan saukur ulah ngantepkeun kode anjeun disusun dina kaayaan anu henteu didukung.

Lengket kana semantik operasi baku

Panambahan kudu ditambah, multiplikasi kudu multiplikasi, fungsi panggero kudu fungsi panggero, salinan kudu salinan, mawa kudu mawa, wadah kudu iterable, iterator kudu promosi. ++ sarta dereferencing *. Jeung saterusna jeung saterusna.

Jigana gagasan jelas. Aya konvénsi ngadegkeun nu teu ngariung, tapi yén sakabéh pamaké sarta pamiarsa kode anjeun nyangka ningali. Tong nyoba-nyoba ngolo-ngolo batur, mun teu kitu maneh bakalan nyilakakeun diri sorangan.

Tulis kodeu cocog

Anu mimiti, kuring hartosna perpustakaan standar. Hal ieu kacida desirable yén interfaces tina kelas jeung fungsi Anjeun bisa dipaké jeung standar jeung perpustakaan séjén (contona, Boost).

Ngarasa Luncat nyandak katingal dina STL na naekeun interfaces. Kalayan pengecualian anu jarang, anjeun bakal ningali panutan anu pantes di dinya.

Maksimalkeun alat open source

Pikeun analisa statik anu sami, sahenteuna aya dua alat gratis anu kabuka anu tiasa dihubungkeun ngan sakali kana proyék naon waé sareng sistem ngawangun CMake.

Anjeun tiasa maca langkung seueur ngeunaan ieu dina publikasi panganyarna kuring.

afterword

Tungtungna, abdi hoyong ngantebkeun yén kuring teu nyokong teu make PVS atawa analisa statik lianna. Tapi kuring ajak anjeun mikir ngeunaan kumaha kajadian yén analis statik terus-terusan mendakan kasalahan anu signifikan dina kode anjeun.

Ieu ngan konsekuensi. Urang kedah milarian sareng ngaleungitkeun panyababna.

sumber: www.habr.com

Tambahkeun komentar