Apa gunanya Analisis Dinamis Ketika Anda Memiliki Analisis Statis?

Untuk memverifikasi kualitas perangkat lunak, Anda harus menggunakan banyak alat yang berbeda, termasuk analisis statis dan dinamis. Pada artikel ini, kami akan mencoba mencari tahu mengapa hanya satu jenis analisis, apakah statis atau dinamis, mungkin tidak cukup untuk analisis perangkat lunak yang komprehensif dan mengapa lebih baik menggunakan keduanya.

Gambar 1


Tim kami banyak menulis tentang kegunaan analisis statis dan manfaatnya untuk proyek Anda. Kami suka menjalankan alat kami di berbagai proyek open-source untuk menemukan kemungkinan bug, yang merupakan cara kami untuk mempopulerkan metode analisis kode statis. Pada gilirannya, analisis statis membantu membuat program lebih berkualitas tinggi dan andal serta mengurangi jumlah kerentanan potensial. Mungkin setiap orang yang terlibat langsung dalam pekerjaan pada kode sumber memiliki perasaan puas memiliki bug diperbaiki. Tetapi bahkan jika proses berhasil menemukan (dan memperbaiki) bug tidak memicu endorfin Anda, Anda pasti menikmati pemikiran untuk mengurangi biaya pengembangan berkat penganalisa statis, yang telah membantu programmer Anda menggunakan waktu mereka lebih efektif dan efisien. Untuk mengetahui lebih lanjut tentang bagaimana Anda bisa mendapat manfaat dari penggunaan analisis statis dalam hal uang, lihat artikel ini . Ini memberikan perkiraan perkiraan untuk PVS-Studio, tetapi hasil tersebut dapat diekstrapolasi ke alat analisis statis lain yang tersedia di pasar.

Semua yang dikatakan di atas tampaknya menunjukkan bahwa tujuan analisis statis adalah untuk menemukan bug dalam kode sumber sedini mungkin, sehingga mengurangi biaya perbaikan bug. Tetapi mengapa kita memerlukan analisis dinamis, dan mengapa hanya berpegang pada satu dari dua teknik saja mungkin tidak cukup? Mari kita berikan definisi analisis statis dan dinamis yang lebih formal dan jelas dan mencoba menjawab pertanyaan-pertanyaan ini.

Analisis kode statis adalah proses mendeteksi kesalahan dan bau kode dalam kode sumber perangkat lunak. Untuk menganalisis suatu program, Anda tidak perlu menjalankannya; analisis akan dilakukan pada basis kode yang tersedia. Analogi terdekat dengan analisis statis adalah tinjauan kode yang disebut kecuali bahwa analisis statis adalah versi otomatis dari tinjauan kode (yaitu dilakukan oleh program bot).

Pro utama analisis statis:

  1. Deteksi bug pada tahap pengembangan awal. Ini membantu untuk membuat perbaikan bug jauh lebih murah karena semakin cepat cacat terdeteksi, semakin mudah - dan, oleh karena itu, semakin murah - untuk memperbaikinya.
  2. Ini memungkinkan Anda untuk secara tepat menemukan bug potensial dalam kode sumber.
  3. Cakupan kode lengkap. Tidak peduli seberapa sering satu blok kode atau lainnya mendapat kendali saat mengeksekusi, analisis statis memeriksa seluruh basis kode.
  4. Mudah digunakan. Anda tidak perlu menyiapkan set data input apa pun untuk melakukan pemeriksaan.
  5. Analisis statis mendeteksi kesalahan ketik dan salin-tempel terkait dengan cukup cepat dan mudah.

Kontra objektif analisis statis:

  1. Positif palsu yang tak terhindarkan. Penganalisa statis bisa marah tentang fragmen kode yang sebenarnya tidak memiliki bug di dalamnya. Hanya pemrogram yang dapat menyelesaikan masalah ini dan menandai peringatan sebagai false positive, yang berarti akan memakan waktu kerja mereka.
  2. Analisis statis umumnya buruk dalam mendeteksi kebocoran memori dan kesalahan terkait konkurensi. Untuk mendeteksi kesalahan seperti itu, Anda sebenarnya harus menjalankan beberapa bagian dari program dalam mode virtual, yang merupakan tugas yang sangat sulit. Selain itu, algoritma seperti itu akan membutuhkan terlalu banyak memori dan waktu CPU. Analisis statis biasanya tidak berjalan lebih jauh daripada menganalisis beberapa kasus sederhana. Analisis dinamis lebih cocok untuk mendiagnosis kebocoran memori dan kesalahan terkait konkurensi.

Perlu dicatat bahwa analisa statis tidak fokus secara eksklusif pada penangkapan bug. Misalnya, mereka dapat memberikan rekomendasi tentang pemformatan kode. Beberapa alat memungkinkan Anda untuk memeriksa kode Anda untuk kepatuhan dengan standar pengkodean yang melekat di perusahaan Anda. Ini termasuk lekukan berbagai konstruksi, penggunaan karakter spasi / tabulasi, dan sebagainya. Selain itu, analisis statis dapat membantu untuk mengukur metrik. Metrik perangkat lunak adalah ukuran kuantitatif sejauh mana suatu program atau spesifikasinya memiliki beberapa properti. Lihat artikel ini untuk mempelajari tentang penggunaan analisis statis lainnya.

Analisis kode dinamis adalah analisis yang dilakukan pada suatu program pada waktu eksekusi. Ini berarti Anda harus mengubah kode sumber Anda menjadi file yang dapat dieksekusi terlebih dahulu. Dengan kata lain, kode yang mengandung kesalahan kompilasi atau build tidak dapat diperiksa oleh jenis analisis ini. Pemeriksaan dilakukan dengan set input data yang diumpankan ke program yang sedang dianalisis. Itu sebabnya efektivitas analisis dinamis secara langsung tergantung pada kualitas dan kuantitas data input uji. Data inilah yang menentukan tingkat cakupan kode pada akhir tes.

Dengan pengujian dinamis, Anda bisa mendapatkan metrik dan peringatan berikut:

  1. Sumber daya yang digunakan: waktu pelaksanaan seluruh program atau bagian-bagian individualnya, jumlah permintaan eksternal (misalnya, ke database), jumlah RAM dan sumber daya lain yang digunakan oleh program.
  2. Tingkat cakupan kode dengan tes dan metrik lainnya.
  3. Bug perangkat lunak: pembagian dengan nol, null dereference, kebocoran memori, kondisi balapan.
  4. Beberapa kerentanan keamanan.

Pro utama analisis dinamis:

  1. Anda tidak harus memiliki akses ke kode sumber program untuk menganalisisnya. Namun perlu dicatat bahwa alat analisis dinamis dibedakan berdasarkan cara mereka berinteraksi dengan program yang sedang dianalisis (ini dibahas lebih rinci di sini ). Misalnya, satu teknik analisis dinamis yang cukup umum melibatkan instrumentasi kode sebelum pemeriksaan, yaitu penambahan fragmen kode khusus ke kode sumber aplikasi agar penganalisa dapat mendiagnosis kesalahan. Dalam hal ini, Anda harus memiliki kode sumber program.
  2. Ini dapat mendeteksi kesalahan penanganan memori yang kompleks seperti pengindeksan di luar batas array dan kebocoran memori.
  3. Itu dapat menganalisis kode multithreaded pada waktu eksekusi, sehingga mendeteksi potensi masalah yang berkaitan dengan akses ke sumber daya bersama atau kemungkinan deadlock.
  4. Sebagian besar implementasi analisis dinamis tidak menghasilkan positif palsu karena kesalahan tertangkap saat terjadi. Oleh karena itu, peringatan yang dikeluarkan oleh penganalisa dinamis bukanlah prediksi yang dibuat oleh alat berdasarkan analisis model program tetapi hanya pernyataan fakta bahwa kesalahan telah terjadi.

Kontra analisis dinamis:

  1. Cakupan kode lengkap tidak dijamin. Artinya, Anda sangat tidak mungkin mendapatkan cakupan 100% dengan pengujian dinamis.
  2. Analisis dinamis buruk dalam mendeteksi kesalahan logika. Sebagai contoh, kondisi yang selalu benar bukanlah bug dari perspektif penganalisa dinamis karena pemeriksaan yang salah hanya menghilang sebelumnya pada langkah kompilasi.
  3. Lebih sulit menemukan kesalahan dalam kode dengan tepat.
  4. Analisis dinamis lebih sulit digunakan dibandingkan dengan analisis statis karena Anda perlu memasukkan cukup data ke program untuk mendapatkan hasil yang lebih baik dan mencapai cakupan kode lengkap sebanyak mungkin.

Analisis dinamis sangat berguna di bidang-bidang di mana keandalan program, waktu respons, atau sumber daya yang dikonsumsi adalah perhatian utama. Sistem waktu nyata yang mengelola sektor produksi kritis atau server basis data adalah beberapa contoh dari sistem tersebut. Kesalahan apa pun di area ini bisa menjadi kritis.

Kembali ke pertanyaan mengapa hanya berpegang pada salah satu dari dua jenis analisis mungkin tidak cukup, mari kita lihat beberapa contoh bug yang sepele bahwa satu metode analisis tidak memiliki masalah dalam mendiagnosis sementara yang lain tidak cocok untuk dideteksi. , dan sebaliknya.

Contoh berikut diambil dari proyek Dentang:

MapTy PerPtrTopDown; MapTy PerPtrBottomUp; void clearBottomUpPointers() { PerPtrTopDown.clear(); } void clearTopDownPointers() { PerPtrTopDown.clear(); } 

Analisis statis akan menunjukkan bahwa tubuh kedua fungsi tersebut identik. Tentu saja, dua fungsi yang memiliki tubuh yang identik belum tentu merupakan tanda bug yang pasti, tetapi sangat mungkin bahwa mereka telah dihasilkan dari menggunakan teknik copy-paste dikombinasikan dengan kecerobohan di sisi programmer - dan itu mengarah pada perilaku yang tidak terduga. Dalam hal ini, metode clearBottomUpPointers harus memanggil metode PerPtrBottomUp.clear . Analisis dinamis tidak akan melihat ada yang salah dalam contoh ini karena ini merupakan potongan kode yang benar-benar sah dari sudut pandangnya.

Contoh lain. Misalkan kita memiliki fungsi berikut:

 void OutstandingIssue(const char *strCount) { unsigned nCount; sscanf_s(strCount, "%u", &nCount); int array[10]; memset(array, 0, nCount * sizeof(int)); } 

Secara teori, penganalisa statis dapat menduga ada sesuatu yang salah dengan kode ini, tetapi menerapkan diagnostik seperti itu adalah tugas yang sangat sulit dan tidak berguna. Contoh diambil dari artikel ini , yang juga menguraikan mengapa itu adalah ide yang buruk untuk mengajarkan analisis statis bagaimana mendiagnosis kesalahan seperti itu. Singkatnya, analisis statis sangat buruk dalam mencari tahu bahwa panggilan fungsi memset dapat mengakibatkan pengindeksan di luar batas array karena mereka tidak dapat melihat nomor apa yang akan dibaca dari string strCount ; dan jika nilai strCount dibaca dari file, itu menjadi tugas yang mustahil untuk analisis statis sama sekali. Di sisi lain, penganalisa dinamis tidak akan kesulitan memperhatikan dan menunjukkan kesalahan penanganan memori dalam kode ini (mengingat bahwa program diberi makan data yang benar).

Artikel ini tidak bertujuan membandingkan analisis statis dan dinamis. Tidak ada teknik tunggal yang dapat mendiagnosis seluruh variasi cacat perangkat lunak. Kedua jenis analisis tidak dapat sepenuhnya menggantikan yang lain. Untuk meningkatkan kualitas program Anda, Anda harus menggunakan berbagai jenis alat agar saling melengkapi. Saya harap contoh-contoh yang ditunjukkan di atas cukup meyakinkan.

Saya tidak ingin terlihat terlalu bias terhadap analisis statis, tetapi teknik inilah yang paling banyak dibicarakan dan, yang lebih penting, dimasukkan oleh perusahaan ke dalam proses CI mereka belakangan ini. Analisis statis bertindak sebagai salah satu langkah gerbang mutu untuk membangun produk perangkat lunak yang andal dan berkualitas tinggi. Kami percaya analisis statis akan menjadi praktik pengembangan perangkat lunak standar dalam beberapa tahun, sama seperti pengujian unit dulu.

Singkatnya, saya ingin menunjukkan sekali lagi bahwa analisis dinamis dan analisis statis hanyalah dua metode yang berbeda, yang saling melengkapi. Pada akhirnya, semua teknik ini melayani tujuan tunggal untuk meningkatkan kualitas perangkat lunak dan mengurangi biaya pengembangan.

Referensi:

  1. Terminologi. Analisis kode statis .
  2. Terminologi. Analisis kode dinamis .
  3. Andrey Karpov. Analisis Kode Statis dan Dinamis .
  4. Andrey Karpov. Mitos tentang analisis statis. Mitos ketiga - analisis dinamis lebih baik daripada analisis statis .
  5. Andrey Karpov. ROI PVS-Studio .

Source: https://habr.com/ru/post/id461173/


All Articles