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.
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.
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.
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:
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.
Walau bagaimanapun, bolehkah penganalisis statik mengambil kira perkara ini? tak tahu.
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:
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.
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.