Analisis statis - mulai dari pengenalan hingga integrasi

Bosan dengan peninjauan atau debugging kode yang tiada habisnya, terkadang Anda berpikir tentang cara menyederhanakan hidup Anda. Dan setelah mencari sedikit, atau secara tidak sengaja menemukannya, Anda dapat melihat ungkapan ajaib: β€œAnalisis statis”. Mari kita lihat apa itu dan bagaimana hal itu dapat berinteraksi dengan proyek Anda.

Analisis statis - mulai dari pengenalan hingga integrasi
Faktanya, jika Anda menulis dalam bahasa modern apa pun, tanpa menyadarinya, Anda menjalankannya melalui penganalisis statis. Faktanya adalah bahwa setiap kompiler modern memberikan, meskipun kecil, serangkaian peringatan tentang potensi masalah dalam kode. Misalnya, saat mengkompilasi kode C++ di Visual Studio Anda mungkin melihat yang berikut:

Analisis statis - mulai dari pengenalan hingga integrasi
Dalam output ini kita melihat variabel itu adalah tidak pernah digunakan di mana pun dalam fungsi tersebut. Jadi kenyataannya, Anda hampir selalu menggunakan penganalisis kode statis sederhana. Namun, tidak seperti penganalisis profesional seperti Coverity, Klocwork atau PVS-Studio, peringatan yang diberikan oleh kompiler mungkin hanya menunjukkan sejumlah kecil masalah.

Jika Anda belum mengetahui secara pasti apa itu analisis statis dan bagaimana cara mengimplementasikannya, membaca artikel iniuntuk mempelajari lebih lanjut tentang metodologi ini.

Mengapa Anda memerlukan analisis statis?

Singkatnya: akselerasi dan penyederhanaan.

Analisis statis memungkinkan Anda menemukan banyak masalah berbeda dalam kode: mulai dari penggunaan konstruksi bahasa yang salah hingga kesalahan ketik. Misalnya, sebagai ganti

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.x;

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 mengatasi kesalahan ini, coba contoh yang sudah jadi di Compiler Explorer: *menangis*.

Dan seperti yang Anda pahami, tidak selalu mungkin untuk langsung memperhatikan bagian kode tersebut, dan karena itu, Anda dapat melakukan debug selama berjam-jam, bertanya-tanya mengapa semuanya bekerja begitu aneh.

Namun, ini jelas merupakan sebuah kesalahan. Bagaimana jika pengembang menulis kode suboptimal karena dia lupa beberapa seluk-beluk bahasanya? Atau bahkan mengizinkannya dalam kode perilaku tidak terdefinisi? Sayangnya, kasus seperti ini merupakan hal yang lumrah dan sebagian besar waktu dihabiskan untuk men-debug kode kerja tertentu yang mengandung kesalahan ketik, kesalahan umum, atau perilaku tidak terdefinisi.

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 seperti ini, apa akibatnya dan bagaimana cara memperbaikinya. Berikut ini contoh tampilannya: *menangis*.

Anda dapat menemukan kesalahan yang lebih menarik yang dapat dideteksi oleh penganalisis di artikel:

Sekarang setelah Anda membaca materi ini dan yakin akan manfaat analisis statis, Anda mungkin ingin mencobanya. Tapi harus mulai dari mana? Bagaimana cara mengintegrasikan alat baru ke dalam proyek Anda saat ini? Dan bagaimana cara memperkenalkan tim kepadanya? Anda akan menemukan jawaban atas pertanyaan-pertanyaan di bawah ini.

Catatan. Analisis statis tidak menggantikan atau membatalkan hal yang berguna seperti tinjauan kode. Ini melengkapi proses ini, membantu memperhatikan dan memperbaiki kesalahan ketik, ketidakakuratan, dan desain berbahaya terlebih dahulu. Jauh lebih produktif untuk fokus pada tinjauan kode pada algoritme dan kejelasan kode, daripada mencari tanda kurung atau tanda kurung yang salah tempat. membaca fungsi perbandingan yang membosankan.

0. Mengenal alat tersebut

Semuanya dimulai dengan versi uji coba. Memang sulit untuk memutuskan untuk mengimplementasikan sesuatu ke dalam proses pengembangan jika Anda belum pernah melihat alat tersebut secara langsung sebelumnya. Oleh karena itu, hal pertama yang harus Anda lakukan adalah mengunduh versi percobaan.

Apa yang akan Anda pelajari pada tahap ini:

  • Apa saja cara berinteraksi dengan penganalisis;
  • Apakah penganalisis tersebut kompatibel dengan lingkungan pengembangan Anda?
  • Masalah apa yang ada pada proyek Anda saat ini?

Setelah Anda menginstal semua yang Anda perlukan, hal pertama yang harus Anda lakukan adalah menjalankan analisis keseluruhan proyek (Windows, Linux, MacOS). Dalam kasus PVS-Studio di Visual Studio Anda akan melihat gambar serupa (dapat diklik):

Analisis statis - mulai dari pengenalan hingga integrasi
Faktanya adalah penganalisis statis biasanya mengeluarkan sejumlah besar peringatan untuk proyek dengan basis kode yang besar. Tidak perlu memperbaiki semuanya, karena proyek Anda sudah berjalan, yang berarti masalah ini tidak kritis. Namun, kamu Anda dapat melihat peringatan yang paling menarik dan memperbaikinya jika perlu. Untuk melakukan ini, Anda perlu memfilter keluaran dan hanya meninggalkan pesan yang paling dapat diandalkan. Di plugin PVS-Studio untuk Visual Studio, ini dilakukan dengan memfilter berdasarkan tingkat kesalahan dan kategori. Untuk hasil yang paling akurat, sisakan saja High ΠΈ Umum (juga dapat diklik):

Analisis statis - mulai dari pengenalan hingga integrasi
Memang benar, 178 peringatan jauh lebih mudah dilihat daripada beberapa ribu...

Di tab Medium ΠΈ Rendah Seringkali ada peringatan yang baik, tetapi kategori ini mencakup diagnostik yang kurang akurat (reliabilitas). Informasi lebih lanjut tentang tingkat peringatan dan opsi untuk bekerja pada Windows dapat ditemukan di sini: *menangis*.

Setelah berhasil meninjau kesalahan yang paling menarik (dan berhasil memperbaikinya) sangatlah berharga menekan peringatan yang tersisa. Hal ini diperlukan agar peringatan-peringatan baru tidak hilang di antara peringatan-peringatan lama. Selain itu, penganalisis statis adalah asisten pemrogram, dan bukan daftar bug. πŸ™‚

1. Layanan

Setelah berkenalan, saatnya mengkonfigurasi plugin dan mengintegrasikannya ke CI. Ini harus dilakukan sebelum pemrogram mulai menggunakan penganalisis statis. Faktanya adalah programmer mungkin lupa mengaktifkan analisis atau tidak ingin melakukannya sama sekali. Untuk melakukan ini, Anda perlu melakukan pemeriksaan akhir terhadap semuanya sehingga kode yang belum diuji tidak dapat masuk ke cabang pengembangan umum.

Apa yang akan Anda pelajari pada tahap ini:

  • Opsi otomatisasi apa yang disediakan alat ini;
  • Apakah alat analisa ini kompatibel dengan sistem perakitan Anda?

Karena tidak ada dokumentasi yang sempurna, terkadang Anda harus menulisnya mendukung. Ini normal dan kami dengan senang hati membantu Anda. πŸ™‚

Sekarang mari beralih ke layanan integrasi berkelanjutan (CI). Penganalisis apa pun dapat diterapkan ke dalamnya tanpa masalah serius. Untuk melakukan ini, Anda perlu membuat tahapan terpisah dalam pipeline, yang biasanya terletak setelah pengujian build dan unit. Ini dilakukan dengan menggunakan berbagai utilitas konsol. Misalnya, PVS-Studio menyediakan utilitas berikut:

Untuk mengintegrasikan analisis ke dalam CI, Anda perlu melakukan tiga hal:

  • Instal penganalisis;
  • Jalankan analisis;
  • Memberikan hasil.

Misalnya, untuk menginstal PVS-Studio di Linux (berbasis Debian), 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 yang menjalankan Windows, tidak ada cara untuk menginstal penganalisis dari manajer paket, namun dimungkinkan untuk menerapkan penganalisis dari baris perintah:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Anda dapat membaca lebih lanjut tentang penerapan PVS-Studio pada sistem yang menjalankan Windows *di sini*.

Setelah instalasi, Anda perlu menjalankan analisis secara langsung. Namun, disarankan untuk melakukan ini hanya setelah kompilasi dan pengujian selesai. Ini karena analisis statis biasanya membutuhkan waktu dua kali lebih lama dibandingkan kompilasi.

Karena metode peluncuran bergantung pada platform dan fitur proyek, saya akan menunjukkan opsi untuk 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 melakukan analisis, dan perintah kedua amplopmengubah laporan menjadi format teks, menampilkannya di layar dan mengembalikan kode pengembalian selain 0 jika ada peringatan. Mekanisme seperti ini dapat dengan mudah digunakan untuk memblokir build ketika ada pesan kesalahan. Namun, Anda selalu dapat menghapus bendera tersebut -w dan jangan memblokir rakitan yang berisi peringatan.

Catatan. Format teksnya tidak nyaman. Ini diberikan hanya sebagai contoh. Perhatikan format laporan yang lebih menarik - FullHtml. Ini memungkinkan Anda menavigasi kode.

Anda dapat membaca lebih lanjut tentang menyiapkan analisis pada CI di artikel "PVS-Studio dan Integrasi Berkelanjutan" (Windows) atau "Cara mengatur PVS-Studio di Travis CI" (Linux).

Oke, Anda telah mengonfigurasi penganalisis di server build. Sekarang, jika seseorang mengunggah kode yang belum diuji, tahap verifikasi akan gagal, dan Anda akan dapat mendeteksi masalahnya, namun ini sangat tidak nyaman, karena lebih efisien untuk memeriksa proyek bukan setelah cabang digabungkan, tetapi sebelumnya, pada tahap pull request.

Secara umum, menyiapkan analisis pull request tidak jauh berbeda dengan meluncurkan analisis pada CI biasanya. Kecuali kebutuhan untuk mendapatkan daftar file yang diubah. Ini biasanya dapat diperoleh dengan menanyakan perbedaan antar cabang menggunakan git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Sekarang Anda perlu meneruskan daftar file ini ke penganalisis sebagai masukan. Misalnya, di PVS-Studio hal ini diimplementasikan menggunakan flag -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Anda dapat mengetahui lebih lanjut tentang menganalisis permintaan tarik *di sini*. Meskipun CI Anda tidak ada dalam daftar layanan yang disebutkan dalam artikel, bagian umum yang membahas teori jenis analisis ini akan berguna bagi Anda.

Dengan menyiapkan analisis permintaan tarik, Anda dapat memblokir penerapan yang berisi peringatan, sehingga menciptakan batas yang tidak dapat dilintasi oleh kode yang belum diuji.

Ini semua tentu saja 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, punya plugin untuk integrasi ke 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, sehingga ini bisa disebut bagian yang paling mudah.

Sebagai opsi paling sederhana, pengembang dapat menginstal sendiri penganalisis yang diperlukan. Namun, ini akan memakan banyak waktu dan mengalihkan perhatian mereka dari pengembangan, sehingga Anda dapat mengotomatiskan proses ini menggunakan penginstal dan flag yang diperlukan. Untuk PVS-Studio ada bermacam-macam bendera untuk instalasi otomatis. Namun, selalu ada pengelola paket, misalnya Chocolatey (Windows), Homebrew (macOS) atau lusinan opsi untuk Linux.

Maka Anda perlu menginstal plugin yang diperlukan, misalnya untuk Visual Studio, IDEA, Pengendara dan sebagainya

3. Penggunaan sehari-hari

Pada tahap ini, saatnya menjelaskan beberapa patah kata tentang cara mempercepat penganalisis dalam penggunaan sehari-hari. Analisis lengkap terhadap keseluruhan proyek membutuhkan banyak waktu, tetapi seberapa sering kita mengubah kode seluruh proyek sekaligus? Kecil kemungkinannya akan terjadi pemfaktoran ulang dalam skala besar sehingga akan langsung memengaruhi seluruh basis kode. Jumlah file yang diubah dalam satu waktu jarang melebihi selusin, jadi masuk akal untuk menganalisisnya. Untuk situasi seperti itu 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 dibuat jika Anda bekerja di IDE dengan plugin terpasang.

Jika penganalisis mendeteksi masalah pada kode yang baru saja diubah, penganalisis akan melaporkannya secara independen. Misalnya, PVS-Studio akan memberi tahu Anda tentang hal ini menggunakan peringatan:

Analisis statis - mulai dari pengenalan hingga integrasi
Tentu saja, memberi tahu pengembang untuk menggunakan alat ini tidaklah cukup. Kita perlu memberi tahu mereka apa itu dan bagaimana caranya. Di sini, misalnya, ada artikel tentang memulai cepat untuk PVS-Studio, tetapi Anda dapat menemukan tutorial serupa untuk alat apa pun yang Anda sukai:

Artikel-artikel tersebut memberikan semua informasi yang diperlukan untuk penggunaan sehari-hari dan tidak memakan banyak waktu. πŸ™‚

Bahkan pada tahap mengenal alat ini, kami menyembunyikan banyak peringatan selama salah satu peluncuran pertama. Sayangnya, penganalisis statis tidak sempurna, sehingga terkadang memberikan hasil positif palsu. Biasanya mudah untuk menyembunyikannya; misalnya, di plugin PVS-Studio untuk Visual Studio Anda hanya perlu mengklik satu tombol:

Analisis statis - mulai dari pengenalan hingga integrasi
Namun, Anda dapat melakukan lebih dari sekadar menekannya. Misalnya, Anda dapat melaporkan masalah ke dukungan. Jika positif palsu dapat diperbaiki, maka di pembaruan mendatang Anda akan melihat bahwa setiap kali positif palsu semakin sedikit yang khusus untuk basis kode Anda.

Setelah integrasi

Jadi kita telah melalui semua tahapan pengintegrasian analisis statis ke dalam proses pengembangan. Meskipun pentingnya menyiapkan alat tersebut di CI, tempat terpenting untuk menjalankannya adalah komputer pengembang. Lagi pula, penganalisis statis bukanlah hakim yang mengatakan di suatu tempat jauh dari Anda bahwa kode tersebut tidak bagus. Sebaliknya, asistenlah yang memberi tahu Anda jika Anda lelah dan mengingatkan Anda jika Anda melupakan sesuatu.

Benar, tanpa penggunaan rutin, analisis statis tidak mungkin menyederhanakan pengembangan secara signifikan. Lagi pula, manfaat utamanya bagi pengembang bukan terletak pada pencarian bagian kode yang rumit dan kontroversial, melainkan pada deteksi dini. Setuju bahwa menemukan masalah setelah hasil edit dikirim untuk pengujian tidak hanya tidak menyenangkan, tetapi juga sangat memakan waktu. Analisis statis, jika digunakan secara rutin, akan melihat setiap perubahan secara langsung di komputer Anda dan melaporkan hal-hal mencurigakan saat mengerjakan kode.

Dan jika Anda atau kolega Anda masih belum yakin apakah penganalisis ini layak diterapkan, saya sarankan Anda sekarang mulai membaca artikel "Alasan untuk memperkenalkan penganalisis kode statis PVS-Studio ke dalam proses pengembangan". Ini mengatasi kekhawatiran umum pengembang bahwa analisis statis akan menyita waktu mereka dan sebagainya.

Analisis statis - mulai dari pengenalan hingga integrasi

Jika Anda ingin membagikan artikel ini kepada audiens berbahasa Inggris, silakan gunakan tautan terjemahan: Maxim Zvyagintsev. Analisis Statis: Dari Memulai hingga Integrasi.

Sumber: www.habr.com

Tambah komentar