Faktanya, jika Anda menulis dalam bahasa modern apa pun, tanpa menyadarinya, Anda meneruskannya melalui penganalisis statis. Faktanya adalah bahwa setiap kompilator modern menyediakan sekumpulan kecil peringatan tentang potensi masalah dalam kode. Sebagai contoh, mengkompilasi kode C ++ di Visual Studio, Anda dapat melihat yang berikut ini:
Dalam keluaran ini, kita melihat bahwa variabel var tidak pernah digunakan dimanapun dalam fungsi. Jadi sebenarnya, Anda hampir selalu menggunakan penganalisis kode statis sederhana. Namun, tidak seperti penganalisis profesional seperti Coverity, Klocwork, atau PVS-Studio, peringatan yang diberikan oleh kompilator hanya dapat menunjukkan sejumlah kecil masalah.
Jika Anda tidak tahu pasti apa itu analisis statis dan bagaimana menerapkannya, baca artikel ini untuk mempelajari lebih lanjut tentang metodologi ini.
Mengapa analisis statis diperlukan?
Singkatnya: akselerasi dan penyederhanaan.
Analisis statis memungkinkan Anda menemukan banyak masalah berbeda dalam kode Anda: dari penyalahgunaan konstruksi bahasa hingga kesalahan ketik. Misalnya, alih-alih
auto x = obj.x;
auto y = obj.y;
auto z = obj.z;
Anda menulis kode berikut:
auto x = obj.x;
auto y = obj.y;
auto z = obj.y;
Seperti yang Anda lihat, ada kesalahan ketik di baris terakhir. Misalnya, PVS-Studio mengeluarkan peringatan berikut:
V537 Pertimbangkan untuk meninjau kebenaran penggunaan item 'y'.
Jika Anda ingin memasukkan tangan Anda ke dalam kesalahan ini, coba contoh yang sudah jadi di Compiler Explorer: * klik *.
Dan seperti yang Anda pahami, tidak selalu mungkin untuk segera memperhatikan bagian kode tersebut dan karena itu Anda dapat duduk untuk debugging selama satu jam, bertanya-tanya mengapa semuanya bekerja dengan sangat aneh.
Namun, ini adalah kesalahan yang jelas. Bagaimana jika pengembang menulis kode yang kurang optimal karena dia lupa beberapa kehalusan bahasanya? Atau bahkan mengizinkan perilaku tidak terdefinisi dalam kode? Sayangnya, kasus seperti itu benar-benar biasa dan sebagian besar waktu dihabiskan untuk men-debug kode kerja tertentu yang berisi kesalahan ketik, kesalahan umum, atau perilaku yang tidak ditentukan.
Untuk situasi inilah analisis statis muncul. Ini adalah asisten pengembang yang akan menunjukkan berbagai masalah dalam kode dan menjelaskan dalam dokumentasi mengapa tidak perlu menulis dengan cara ini, apa penyebabnya, dan cara memperbaikinya. Berikut adalah contoh tampilannya: * klik *.
Anda dapat menemukan kesalahan yang lebih menarik yang dapat dideteksi oleh penganalisis di artikel:
- 10 kesalahan teratas dalam proyek C ++ pada tahun 2019
- 10 kesalahan teratas dalam proyek C # tahun 2019
- 10 bug teratas dalam proyek Java tahun 2019
Sekarang, setelah membaca materi ini dan yakin akan kegunaan analisis statis, Anda mungkin ingin mengujinya. Tapi dari mana Anda memulai? Bagaimana cara mengintegrasikan alat baru ke dalam proyek yang sedang berlangsung? Dan bagaimana cara memperkenalkan tim kepadanya? Anda akan menemukan jawaban atas pertanyaan-pertanyaan ini di bawah.
Catatan. Analisis statis tidak menggantikan atau meniadakan hal yang berguna seperti tinjauan kode. Ini melengkapi proses ini dengan membantu untuk memperhatikan dan memperbaiki kesalahan ketik, ketidakakuratan, dan konstruksi berbahaya sebelumnya. Jauh lebih produktif untuk fokus pada algoritme dan pemahaman kode saat meninjau kode, daripada mencari tanda kurung yang salah atau membaca fungsi perbandingan yang membosankan .
0. Mengenal instrumen
Semuanya dimulai dengan versi percobaan. Memang, sulit untuk memutuskan untuk menerapkan sesuatu dalam proses pengembangan jika Anda belum pernah melihat alat tersebut secara langsung sebelumnya. Oleh karena itu, langkah pertama adalah mengunduh versi trial .
Apa yang akan Anda pelajari pada tahap ini:
- Apa cara untuk berinteraksi dengan penganalisis;
- Apakah penganalisis kompatibel dengan lingkungan pengembangan Anda;
- Masalah apa yang ada dalam proyek Anda sekarang.
Setelah Anda menginstal semua yang Anda butuhkan, langkah pertama adalah menjalankan analisis seluruh proyek ( Windows , Linux , macOS ). Dalam kasus PVS-Studio di Visual Studio, Anda akan melihat gambar yang serupa:
Faktanya adalah bahwa penganalisis statis biasanya mengeluarkan sejumlah besar peringatan untuk proyek dengan basis kode yang besar. Tidak perlu memperbaiki semuanya, karena proyek Anda sudah berfungsi, yang berarti masalah ini tidak kritis. Namun, Anda dapat melihat peringatan yang paling menarikdan perbaiki jika perlu. Untuk melakukan ini, Anda perlu memfilter keluaran dan hanya menyisakan pesan yang paling andal. Di plugin PVS-Studio untuk Visual Studio, ini dilakukan dengan memfilter menurut level dan kategori kesalahan. Untuk keluaran paling akurat, biarkan hanya Tinggi dan Umum yang diaktifkan :
Memang, 178 peringatan jauh lebih mudah dilihat daripada beberapa ribu ... Peringatan yang baik sering ditemukan di
tab Sedang dan Rendah , tetapi kategori ini mencakup diagnostik yang memiliki keakuratan lebih rendah (keandalan). Informasi lebih lanjut tentang tingkat peringatan dan opsi untuk bekerja di bawah Windows dapat ditemukan di sini: * klik *.
Setelah berhasil meninjau kesalahan yang paling menarik (dan berhasil memperbaikinya), ada baiknya untuk menyembunyikan peringatan yang tersisa . Ini untuk memastikan bahwa peringatan baru tidak hilang di antara yang lama. Selain itu, penganalisa statis adalah pembantu programmer, bukan daftar bug. :)
1. Otomasi
Setelah bertemu, saatnya untuk mengkonfigurasi plugin dan mengintegrasikannya ke CI. Ini harus dilakukan sebelum programmer mulai menggunakan penganalisis statis. Intinya adalah seorang programmer mungkin lupa untuk mengaktifkan analisis atau tidak mau sama sekali. Untuk melakukan ini, Anda perlu melakukan beberapa verifikasi akhir dari semuanya sehingga kode yang tidak diverifikasi tidak dapat masuk ke cabang pengembangan umum.
Apa yang akan Anda pelajari pada tahap ini:
- Opsi otomatisasi apa yang disediakan alat tersebut;
- Apakah penganalisis kompatibel dengan sistem build Anda?
Karena tidak ada dokumentasi yang sempurna, terkadang Anda harus menulis untuk mendukung . Ini normal dan kami dengan senang hati membantu Anda. :)
Sekarang mari kita turun ke layanan integrasi berkelanjutan (CI). Penganalisis apa pun dapat disematkan di dalamnya tanpa masalah besar. Untuk melakukan ini, Anda perlu membuat tahapan terpisah dalam pipeline, yang biasanya ditemukan setelah uji perakitan dan unit. Ini dilakukan menggunakan berbagai utilitas konsol. Misalnya, PVS-Studio menyediakan utilitas berikut:
- PVS-Studio_Cmd.exe (analisis solusi, proyek C #, C ++ di Windows)
- CLMonitor.exe (pemantauan kompilasi)
- pvs-studio-analyzer (analisis proyek C ++ di Linux / macOS)
- pvs-studio-dotnet (analisis solusi, proyek C # di Linux / macOS)
- pvs-studio.jar (analisis proyek Java)
- PlogConverter (konverter file log)
Untuk mengintegrasikan analisis ke CI, Anda perlu melakukan tiga hal:
- Pasang penganalisis;
- Jalankan analisis;
- Berikan hasil.
Misalnya, untuk menginstal PVS-Studio di Linux (Debian-base), Anda perlu menjalankan perintah berikut:
wget -q -O - https://files.viva64.com/etc/pubkey.txt \
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list \
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
Pada sistem Windows, tidak mungkin untuk menginstal penganalisis dari manajer paket, tetapi dimungkinkan untuk menggunakan penganalisis dari baris perintah:
PVS-Studio_setup.exe /verysilent /suppressmsgboxes
/norestart /nocloseapplications
Anda dapat membaca lebih lanjut tentang menerapkan PVS-Studio pada sistem Windows * di sini *.
Setelah instalasi, Anda perlu menjalankan analisis secara langsung. Namun, disarankan untuk melakukan ini hanya setelah kompilasi dan pengujian telah berlalu. Ini karena analisis statis biasanya membutuhkan waktu dua kali lebih lama dari kompilasi.
Karena metode peluncuran bergantung pada platform dan spesifikasi proyek, saya akan menunjukkan opsi C ++ (Linux) sebagai contoh:
pvs-studio-analyzer analyze -j8 \
-o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w
Perintah pertama akan menganalisis, dan yang kedua akan mengonversi laporan ke format teks, menampilkannya di layar dan mengembalikan kode pengembalian selain 0 jika ada peringatan. Mekanisme ini berguna untuk memblokir rakitan jika ada pesan kesalahan. Namun, Anda selalu dapat menghapus -w flag dan tidak memblokir assembly yang berisi peringatan.
Catatan. Format teks tidak nyaman. Itu hanyalah sebuah contoh. Perhatikan format laporan yang lebih menarik - FullHtml. Ini memungkinkan Anda untuk menavigasi kode Anda.
Anda dapat membaca lebih lanjut tentang menyiapkan analisis pada CI di artikel " PVS-Studio and Continuous Integration " (Windows) atau " Cara menyiapkan PVS-Studio di Travis CI"(Linux).
Oke, Anda menyiapkan penganalisis di server build. Sekarang, jika seseorang telah mengunggah kode yang belum diverifikasi, tahap verifikasi akan gagal dan Anda dapat menemukan masalahnya, tetapi ini sangat tidak nyaman, karena lebih efisien untuk memeriksa proyek tidak setelah bagaimana cabang digabungkan, dan sebelum itu, pada tahap permintaan tarik.
Secara umum, menyiapkan analisis permintaan tarik tidak jauh berbeda dari peluncuran analisis biasa pada CI. Kecuali untuk kebutuhan untuk mendapatkan daftar file yang diubah. Biasanya mereka dapat diperoleh dengan meminta perbedaan antar cabang menggunakan git:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
Sekarang Anda harus meneruskan daftar file ini ke penganalisis. Misalnya, di PVS-Studio ini diimplementasikan menggunakan tanda -S :
pvs-studio-analyzer analyze -j8 \
-o PVS-Studio.log \
-S .pvs-pr.list
Anda dapat mempelajari lebih lanjut tentang analisis permintaan tarik * di sini *. Meskipun CI Anda tidak ada dalam daftar layanan yang ditentukan dalam artikel, bagian umum tentang teori jenis analisis ini akan berguna bagi Anda.
Dengan mengonfigurasi analisis permintaan tarik, Anda dapat memblokir komit yang berisi peringatan, sehingga membuat batas yang tidak dapat dilintasi oleh kode yang belum diverifikasi.
Ini semua baik dan bagus, tapi saya ingin bisa melihat semua peringatan di satu tempat. Tidak hanya dari penganalisis statis, tetapi juga dari pengujian unit atau dari penganalisis dinamis. Ada berbagai layanan dan plugin untuk ini. PVS-Studio, misalnya, memiliki plugin untuk diintegrasikan ke dalam SonarQube .
2. Integrasi pada mesin pengembang
Sekarang saatnya menginstal dan mengkonfigurasi penganalisis untuk penggunaan pengembangan sehari-hari. Pada titik ini, Anda sudah terbiasa dengan sebagian besar cara kerja, jadi ini bisa disebut bagian yang paling mudah.
Sebagai opsi paling sederhana, pengembang dapat menginstal sendiri penganalisis yang diperlukan. Namun, ini akan memakan waktu lama dan mengalihkan mereka dari pengembangan, sehingga Anda dapat mengotomatiskan proses ini menggunakan penginstal dan tanda yang diperlukan. Ada berbagai tanda untuk PVS-Studio untuk penginstalan otomatis . Namun, selalu ada pengelola paket seperti Chocolatey (Windows), Homebrew (macOS) atau lusinan opsi untuk Linux.
Kemudian Anda perlu menginstal plugin yang diperlukan, misalnya, untuk Visual Studio , IDEA ,Pengendara dll.
3. Penggunaan sehari-hari
Pada tahap ini, saatnya menjelaskan beberapa patah kata tentang cara mempercepat kinerja penganalisis dalam penggunaan sehari-hari. Analisis lengkap dari keseluruhan proyek membutuhkan waktu yang sangat lama, tetapi seberapa sering kita mengubah kode sekaligus di seluruh proyek? Hampir tidak ada pemfaktoran ulang skala besar yang akan segera memengaruhi seluruh basis kode. Jumlah file yang diubah pada suatu waktu jarang melebihi sepuluh, jadi masuk akal untuk menganalisisnya. Untuk situasi seperti ini, ada mode analisis tambahan . Jangan khawatir, ini bukan alat lain. Ini adalah mode khusus yang memungkinkan Anda menganalisis hanya file yang diubah dan dependensinya, dan ini terjadi secara otomatis setelah pembuatan, jika Anda bekerja di IDE dengan plugin terpasang.
Jika penganalisis mendeteksi masalah dalam kode yang baru saja diubah, penganalisis akan melaporkannya sendiri. Misalnya, PVS-Studio akan memberi tahu Anda tentang hal ini menggunakan notifikasi: Tidak perlu
dikatakan lagi bahwa memberi tahu pengembang untuk menggunakan alat tersebut tidak cukup. Kita perlu memberi tahu mereka apa itu dan bagaimana itu. Misalnya, berikut adalah artikel tentang memulai cepat untuk PVS-Studio, tetapi Anda dapat menemukan tutorial serupa untuk alat apa pun yang Anda sukai:
- Cara menjalankan PVS-Studio di Windows (C, C ++, C #)
- Cara menjalankan PVS-Studio di Linux dan macOS (C, C ++)
- Cara memulai PVS-Studio Java
Artikel semacam itu memberikan semua informasi yang diperlukan untuk penggunaan sehari-hari dan tidak memakan banyak waktu. :)
Bahkan pada tahap untuk mengetahui alat tersebut, kami menahan banyak peringatan selama salah satu peluncuran pertama. Sayangnya, penganalisis statis tidak sempurna, jadi mereka memberikan kesalahan positif dari waktu ke waktu. Biasanya mudah untuk menekannya, misalnya, di plugin PVS-Studio untuk Visual Studio, cukup dengan mengklik satu tombol:
Namun, Anda tidak hanya dapat menekannya. Misalnya, Anda dapat melaporkan masalah ke dukungan. Jika memungkinkan untuk memperbaiki positif palsu, maka di pembaruan mendatang Anda mungkin memperhatikan bahwa setiap kali ada lebih sedikit positif palsu yang spesifik untuk basis kode Anda.
Setelah integrasi
Jadi kami melalui semua tahapan mengintegrasikan analisis statis ke dalam proses pengembangan. Terlepas dari pentingnya menyiapkan alat semacam itu di CI, tempat terpenting untuk memulai adalah komputer pengembang. Bagaimanapun, penganalisis statis bukanlah hakim yang mengatakan di suatu tempat jauh dari Anda bahwa kode itu tidak berharga. Sebaliknya, itu adalah asisten yang memberi tahu Anda jika Anda lelah dan mengingatkan Anda jika Anda lupa tentang sesuatu.
Namun, tanpa penggunaan rutin, analisis statis tidak mungkin menyederhanakan pengembangan secara signifikan. Bagaimanapun, manfaat terpentingnya bagi pengembang tidak terletak pada menemukan bagian kode yang kompleks dan kontroversial, tetapi pada deteksi dini mereka. Setuju bahwa tidak hanya tidak menyenangkan menemukan masalah ketika pengeditan telah dilakukan untuk pengujian, tetapi juga sangat lama. Analisis statis, bila digunakan secara teratur, melihat setiap perubahan langsung di komputer Anda dan melaporkan tempat yang mencurigakan saat mengerjakan kode.
Dan jika Anda atau kolega Anda masih tidak yakin apakah penganalisis itu layak diterapkan, maka saya sarankan Anda sekarang melanjutkan membaca artikel " Alasan Menerapkan Penganalisis Kode Statis PVS-Studio dalam Proses Pengembangan". Ini membahas kekhawatiran khas pengembang bahwa analisis statis akan memakan waktu mereka, dan seterusnya.
Jika Anda ingin berbagi artikel ini dengan audiens berbahasa Inggris, silakan gunakan tautan terjemahan: Maxim Zvyagintsev. Analisis Statis: Dari Memulai hingga Integrasi .
