Kajian bebas PVS-Studio (Linux, C++)

Saya melihat penerbitan yang telah dipelajari oleh PVS untuk dianalisis di bawah Linux, dan memutuskan untuk mencubanya pada projek saya sendiri. Dan inilah yang terhasil daripadanya.


Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. Kelebihan
  2. Kekurangan
  3. Keputusan
  4. afterword

Kelebihan

Sokongan responsif

Saya meminta kunci percubaan dan mereka menghantarnya kepada saya pada hari yang sama.

Dokumentasi yang cukup jelas

Kami berjaya melancarkan penganalisis tanpa sebarang masalah. Bantuan untuk arahan konsol juga tersedia (walaupun terdapat beberapa aduan di sini, lihat bahagian Kekurangan).

Kemungkinan analisis berbilang benang

Penganalisis mempunyai pilihan "standard". -j, membolehkan analisis dijalankan secara selari dalam beberapa tugas. Ini menjimatkan banyak masa.

Visualisasi yang baik

Banyak format output yang berbeza, daripada teks kepada muncung web kecil. Antara muka web adalah mudah, ringkas, dengan petunjuk di sebelah baris dalam kod dan pautan ke penerangan diagnostik.

Penyepaduan mudah ke dalam pemasangan

Semua dokumentasi ada di laman web mereka, saya hanya boleh mengatakan bahawa jika projek anda dibina menggunakan CMake, maka semuanya sangat mudah.

Penerangan diagnostik yang baik

Jika anda menjana output dalam mod fullhtml, maka setiap mesej mempunyai pautan ke penerangan diagnostik, dengan penjelasan, contoh kod dan pautan tambahan.

Kekurangan

Kejahilan bahasa C++ oleh penganalisis

Malangnya, PVS kadangkala membuat ralat sintaks dan menghasilkan mesej positif palsu apabila kod itu betul sepenuhnya.

Sebagai contoh, terdapat fungsi yang kembali 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 adalah kata kuncinya auto Boleh bermaksud void, itulah gunanya auto. Tetapi PVS menghasilkan mesej berikut:

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.

Tapak yang sangat perlahan

Ya, dalam antara muka web di sebelah setiap mesej terdapat pautan ke penerangan diagnostik yang sepadan dengan contoh. Tetapi apabila anda mengklik pada pautan, anda perlu menunggu agak lama, dan kadang-kadang ia berlaku Waktu Keluar 504 Gateway.

Bahasa

Semua penerangan adalah dalam bahasa Rusia, yang bagus. Tetapi pautan daripada laporan sentiasa membawa kepada versi bahasa Inggeris. Alangkah baiknya jika anda boleh menukar bahasa supaya anda boleh melihat diagnostik dengan segera dalam bahasa Rusia. Saya tidak menemui pilihan sedemikian dalam antara muka.

Adalah menyusahkan untuk bekerja dengan tahap diagnostik melalui konsol

Mari kita mulakan dengan fakta bahawa dua arahan yang digunakan (ini pvs-studio-analyzer ΠΈ plog-converter) format yang berbeza untuk menentukan diagnostik.

Bantuan untuk 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

Saya menghabiskan masa yang lama untuk memikirkan ke mana hendak pergi tambah kekunci (β€œmenambah nilai”). Saya cuba menyenaraikannya dipisahkan dengan koma:

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

Saya cuba mendaftarkan kunci beberapa kali:

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

Dan barulah saya sedar bahawa ini adalah topeng kecil! Dan anda perlukan rumuskanDan tidak tambah makna. Contohnya, untuk mendapatkan diagnostik umum, diagnostik untuk pengoptimuman mikro dan MISRA, anda perlu menjumlahkannya (4 + 8 + 32 = 44):

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

Menggunakan bitmasks dalam antara muka pengguna secara amnya adalah bentuk yang tidak baik. Semua ini boleh diringkaskan secara dalaman, dan satu set bendera boleh ditetapkan untuk pengguna.

Di samping itu, terdapat juga utiliti plog-converter, yang menjana maklumat analisis statik yang boleh dibaca manusia. Dia ada masalah lain.

Bantuan untuk 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

Beberapa "tahap" muncul di sini yang tidak ada sebelum ini, dan saya juga tidak menemui apa-apa tentangnya dalam dokumentasi.

Secara umum, ia tidak jelas. Itulah sebabnya saya menetapkan segala-galanya kepada maksimum.

Sekumpulan makian bodoh pada Catch

Dua daripada tiga projek yang saya analisis menggunakan perpustakaan ujian unit Catch2. Dan bahagian terbesar mesej (!!! 90 daripada 138 dalam satu dan 297 daripada 344 dalam yang lain!!!) mempunyai bentuk berikut:

Kajian bebas PVS-Studio (Linux, C++)

Tidak mengambil kira multithreading

Terdapat banyak positif palsu tentang pembolehubah yang kononnya tidak berubah atau gelung tidak berkesudahan, manakala kerja dengan pembolehubah ini berlaku daripada urutan yang berbeza, dan jika ini tidak begitu, maka ujian unit tidak akan berfungsi.

Kajian bebas PVS-Studio (Linux, C++)

Walau bagaimanapun, bolehkah penganalisis statik mengambil kira perkara ini? tak tahu.

Keputusan

PVS tidak menemui sebarang pepijat sebenar dalam projek sumber terbuka saya Pecah ΠΈ Proxima, serta dalam draf kerja, yang, atas sebab-sebab yang jelas, saya tidak dapat membentangkan. Benar, perlu diingat bahawa beberapa kekurangan telah ditangkap dan diperbetulkan lebih awal menggunakan Cppcheck ΠΈ scan-build.

Secara umum, tanggapan daripada semua penganalisis ini adalah lebih kurang sama: ya, mereka menangkap sesuatu, kadang-kadang juga sesuatu yang penting, tetapi secara keseluruhan pengkompil sudah mencukupi.

Ada kemungkinan (dan saya secara peribadi suka berfikir begitu) bahawa pasukan kami menggunakan amalan pembangunan perisian yang membolehkan kami menjana jumlah minimum kod buruk. Adalah lebih baik untuk tidak mencipta masalah daripada mengatasinya dengan berani.

Oleh itu, saya mengambil kebebasan untuk memberi nasihat tentang cara menulis dalam C++ dengan cara yang tidak menembak kaki sesiapa atau memukul sesiapa di dahi dengan garu.

Manfaatkan sepenuhnya diagnostik pengkompil

Pasukan kami menggunakan (dan menasihati anda untuk) pilihan kompilasi berikut:

-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

Dayakan mereka dalam projek anda dan belajar banyak tentang kod anda.

Berpegang pada standard

Cuba untuk tidak menggunakan perkara yang bergantung kepada platform jika terdapat analog standard, dan jika anda benar-benar tidak boleh melakukannya tanpanya, bungkusnya dalam blok khas untuk makro (atau sesuatu yang lain) dan jangan biarkan kod anda disusun dalam keadaan yang tidak disokong.

Berpegang kepada semantik operasi standard

Penambahan mesti penambahan, pendaraban mesti pendaraban, fungsi panggilan mesti fungsi panggilan, salinan mesti salinan, bawa mesti dibawa, bekas mesti boleh diulang, iterator mesti ada promosi ++ dan penyahrujukan *. Dan seterusnya dan seterusnya.

Saya rasa idea itu jelas. Terdapat konvensyen yang ditetapkan yang tidak mengikat, tetapi semua pengguna dan pembaca kod anda mengharapkan untuk melihat. Jangan cuba menipu orang lain, jika tidak, anda akan menipu diri sendiri.

Tulis kod yang serasi

Pertama sekali, saya maksudkan perpustakaan standard. Adalah sangat diingini bahawa antara muka kelas dan fungsi anda boleh digunakan dengan perpustakaan standard dan lain-lain (contohnya, Boost).

Sila lihat antara muka STL dan Boost. Dengan pengecualian yang jarang berlaku, anda akan melihat model peranan yang layak di sana.

Manfaatkan sepenuhnya alatan sumber terbuka

Untuk analisis statik yang sama, terdapat sekurang-kurangnya dua alat percuma terbuka yang boleh disambungkan sekali sahaja kepada mana-mana projek dengan sistem binaan CMake.

Anda boleh membaca lebih lanjut mengenai ini dalam penerbitan saya baru-baru ini.

afterword

Akhir sekali, saya ingin menekankan bahawa saya tidak menganjurkan untuk tidak menggunakan PVS atau mana-mana penganalisis statik lain. Tetapi saya menggalakkan anda untuk memikirkan bagaimana ia berlaku bahawa penganalisis statik sentiasa menemui ralat yang ketara dalam kod anda.

Ini hanya akibat. Kita perlu mencari dan menghapuskan puncanya.

Sumber: www.habr.com

Tambah komen