Analisis statis (static analysis) adalah pemeriksaan kode sumber tanpa menjalankannya, sehingga masalah dapat terlihat sebelum program dieksekusi. Pada jalur ini, analisis statis diterapkan dalam dua lapis, yaitu peringatan kompilator yang menyertai setiap pembangunan dan pemeriksa aturan seperti GNATcheck untuk standar pengodean (coding standard). Topik ini membahas peran analisis statis, cara memunculkan serta membaca peringatan -gnatwa saat kompilasi dengan gnatmake, dan letak aturan GNATcheck di dalam alur kerja. Setelah topik ini dibaca, peringatan kompilator dapat dibaca satu per satu, dan keluaran GNATcheck dapat dihubungkan dengan aturan yang dilanggar.
Peran analisis statis#
Analisis statis menelaah kode sumber secara menyeluruh tanpa memerlukan masukan tertentu, sehingga ia melengkapi pengujian unit yang memeriksa perilaku pada kasus yang dipilih. Temuan analisis statis berupa pola sumber yang patut diragukan, misalnya variabel yang tidak pernah dibaca, unit yang diimpor tanpa digunakan, atau penamaan yang menyimpang dari kesepakatan. Pemeriksaan ini tidak menuntut langkah terpisah karena berjalan bersama pembangunan, dan temuannya menjadi daftar kerja yang ditangani sebelum kode diserahkan ke pengujian. Analisis statis bukan pengganti pengujian, melainkan pemeriksaan awal yang menyaring masalah yang paling mudah terlihat.
Pada ekosistem Ada, dua lapis pemeriksaan statis yang menyertai pekerjaan sehari-hari adalah peringatan kompilator dan pemeriksa aturan. Peringatan kompilator GNAT diaktifkan melalui switch pada baris perintah atau berkas proyek, dan pemeriksaannya bekerja pada setiap berkas yang dikompilasi. Pemeriksa aturan seperti GNATcheck bekerja setelah sumber lolos kompilasi dan menilai bentuk sumber terhadap aturan yang tidak dicakup pemeriksaan kompilator. Keduanya dibahas pada bagian berikut, dengan contoh -gnatwa yang dapat dijalankan langsung pada lingkungan topik ini.
Memunculkan peringatan -gnatwa dengan gnatmake#
Switch -gnatwa mengaktifkan sebagian besar peringatan opsional GNAT, dan contoh pada topik ini menjalankannya langsung dengan gnatmake. Peringatan tidak menghentikan pembangunan, karena berkas yang memunculkannya tetap dikompilasi dan programnya tetap dapat dijalankan. Setiap baris peringatan justru menandai tempat pada kode yang patut dibaca ulang sebelum program digunakan. Berkas contoh berikut sengaja ditulis dengan tiga pola yang memunculkan peringatan, sambil tetap menghasilkan program yang sah.
with Ada.Calendar;
with Ada.Text_IO;
-- Berkas contoh: sengaja ditulis dengan kode yang memunculkan
-- peringatan -gnatwa.
procedure Kandidat_Peringatan is
Sampah : Integer;
Sisa : Integer := 4;
Ambang : Integer;
Hasil : Integer;
begin
Ambang := 24;
Hasil := Ambang / 2;
Ada.Text_IO.Put_Line ("Hasil =" & Integer'Image (Hasil));
end Kandidat_Peringatan;Berkas ini mengimpor Ada.Calendar tanpa menggunakannya, mendeklarasikan variabel Sampah yang tidak pernah dibaca maupun diisi, dan menginisialisasi variabel Sisa yang tidak pernah dibaca. Prosedur tetap sah, karena perhitungan Hasil dan pencetakan hasilnya tidak bergantung pada ketiga nama tersebut. Kompilasi dan peluncuran berikut memperlihatkan kedua hal tersebut sekaligus, yaitu peringatan yang muncul dan program yang tetap berjalan.
# kompilasi dengan sebagian besar peringatan aktif
gnatmake -q -gnatwa kandidat_peringatan.adb
# jalankan programnya
./kandidat_peringatankandidat_peringatan.adb:1:09: warning: unit "Ada.Calendar" is not referenced [-gnatwu]
kandidat_peringatan.adb:7:04: warning: variable "Sampah" is never read and never assigned [-gnatwu]
kandidat_peringatan.adb:8:04: warning: variable "Sisa" is not referenced [-gnatwu]
Hasil = 12Setiap baris peringatan memuat letak dalam bentuk berkas, baris, dan kolom, diikuti jenis temuan serta kategori switch dalam kurung siku. Baris pertama menandai unit yang diimpor tetapi tidak dirujuk, sedangkan dua baris berikutnya menandai variabel yang tidak terpakai, termasuk Sisa yang diinisialisasi karena pengisian nilai awal tidak dihitung sebagai penggunaan. Program tetap dijalankan hingga selesai, dan keluarannya hanya memuat baris Hasil = 12. Perbaikannya jelas, yaitu menghapus with Ada.Calendar beserta dua deklarasi variabel yang tidak digunakan.
Aturan GNATcheck dan standar pengodean#
Standar pengodean adalah kesepakatan tertulis sebuah tim tentang bentuk sumber, misalnya konvensi penamaan, penggunaan huruf kapital, tata letak, dan konstruksi yang dilarang. Menegakkan standar tersebut dengan membaca kode secara manual tidak andal, karena pemeriksaan pada sumber yang besar mudah melewatkan pelanggaran. GNATcheck adalah alat resmi dari AdaCore yang memeriksa berkas Ada terhadap himpunan aturan sintaksis dan semantik. Alat ini dilengkapi aturan bawaan siap pakai dan kemampuan menambahkan aturan sendiri, sehingga standar pengodean dapat diperiksa secara otomatis.
Aturan bawaannya mencakup banyak kategori. Contoh keluaran resmi memperlihatkan ragam yang lazim, seperti konvensi nama yang menuntut awalan T_ untuk subtipe dan awalan C_ untuk konstanta, kesesuaian huruf kapital pada nama, larangan subtipe tanpa nama (anonymous subtype), hingga larangan tasking melalui restriction No_Tasking. Pada baris perintah, aturan diaktifkan dengan -r atau --rule, sedangkan himpunan aturan yang lebih besar dikelola melalui berkas aturan atau berkas proyek. Baris keluarannya berformat berkas, baris, kolom, diikuti pesan rule violation yang menyebut aturan yang dilanggar.
GNATcheck tergabung dalam distribusi GNAT Pro dan tidak terpasang pada toolchain terbuka yang digunakan di topik ini, sehingga perintah berikut tidak dieksekusi dan keluarannya dikutip dari rangkaian uji resmi pada repositori GNATcheck. Berkas sumber yang dianalisis memuat dua konstruksi, yaitu satu pernyataan goto dan satu pernyataan null yang berlebihan, sedangkan komentar -- FLAG adalah penanda baris yang dilaporkan pada uji resmi tersebut.
procedure Main is
begin
goto lbl; -- FLAG
null; -- FLAG
<<lbl>>
end Main;# tidak-dijalankan
gnatcheck -r goto_statements --rule Redundant_Null_Statements main.adb --briefmain.adb:3:04: rule violation: goto statement
main.adb:4:04: rule violation: redundant null statementDua baris itu adalah isi laporan brief yang dijadikan acuan pada uji resmi repositori GNATcheck, dan masing-masing menunjuk letak baris serta kolom konstruksi yang melanggar aturan. Dua aturan pada contoh diaktifkan langsung dari baris perintah, sedangkan standar pengodean organisasi nyata biasanya menghimpun puluhan aturan sekaligus dalam satu berkas konfigurasi. Peringatan -gnatwa dan aturan GNATcheck saling melengkapi sebagai dua cara membaca sumber secara disiplin dengan tingkat ketelitian yang berbeda.
Kesalahan umum#
Kesalahan pertama adalah memperlakukan peringatan sebagai hal yang boleh ditunda karena pembangunan tetap berhasil. Peringatan yang dibiarkan akan menumpuk dan menutupi temuan baru, karena daftar yang panjang membuat baris yang penting mudah terlewat. Perbaikannya, tangani setiap peringatan segera setelah muncul, baik dengan memperbaiki kodenya maupun dengan menghapus nama yang memang tidak diperlukan.
Kesalahan kedua adalah mengharapkan peringatan muncul kembali setiap kali gnatmake dijalankan. Peringatan hanya dihasilkan ketika berkas dikompilasi ulang, sehingga perintah yang sama pada sumber yang sudah selesai dikompilasi tidak mencetak apa pun. Kondisi ini mudah disangka peringatan yang hilang, padahal berkas objek dan berkas .ali yang lama masih digunakan. Perbaikannya, hapus berkas .o dan .ali yang lama, lalu jalankan gnatmake kembali agar seluruh sumber dikompilasi ulang.
Kesalahan ketiga adalah menganggap sumber yang bebas peringatan sebagai sumber yang pasti benar. Switch -gnatwa mengaktifkan sebagian besar, bukan seluruh, peringatan opsional, sehingga banyak pola bermasalah lolos dari pemeriksaan switch tersebut. Perbaikannya, perlakukan keluaran yang bersih sebagai syarat awal saja, lalu lanjutkan dengan pengujian unit serta pemeriksaan aturan GNATcheck.
Ringkasan#
- Analisis statis memeriksa sumber tanpa menjalankannya dan melengkapi pengujian unit, dengan peringatan
-gnatwasebagai lapis yang selalu tersedia pada pembangunan gnatmake. - Baris peringatan memuat letak berkas, baris, kolom, jenis temuan, dan kategori switch, sedangkan program yang memunculkannya tetap terbangun dan berjalan.
- GNATcheck menegakkan standar pengodean melalui aturan bawaan maupun buatan tim, dan keluarannya memformat setiap pelanggaran sebagai
rule violationyang menunjuk konstruksinya.
Referensi#
- GNATcheck — AdaCore — Repositori resmi GNATcheck yang menjelaskan perannya memeriksa sumber Ada terhadap aturan sintaksis dan semantik untuk standar pengodean.
- Uji command_line_rules pada repositori GNATcheck — AdaCore
— Sumber berkas main.adb, opsi
-rdan--rule, serta keluaran acuan yang dikutip pada topik ini. - Keluaran contoh proyek pada repositori GNATcheck — AdaCore — Contoh keluaran resmi yang memperlihatkan ragam aturan penamaan, huruf kapital, dan restriction.