Bagaimana CodeQL menganalisis kode?
Menimplementasikan pemindaian kode dengan CodeQL memerlukan pemahaman tentang bagaimana alat menganalisis kode.
Analisis CodeQL terdiri dari tiga fase:
- Menyiapkan kode dengan membuat database CodeQL.
- Menjalankan kueri CodeQL terhadap database.
- Menginterpretasikan hasil kueri.
Di unit ini, Anda akan mempelajari tentang tiga fase analisis CodeQL.
Pembuatan database
Untuk membuat database, CodeQL terlebih dahulu mengekstrak representasi relasional tunggal dari setiap file sumber dalam basis kode.
Untuk bahasa yang dikompilasi, ekstraksi bekerja dengan memantau proses build normal. Setiap kali pengkompilasi dipanggil untuk memproses file sumber, salinan file tersebut dibuat, dan semua informasi yang relevan tentang kode sumber dikumpulkan. Ini mencakup data sintaksis tentang pohon sintaks abstrak dan data semantik tentang pengikatan nama dan informasi jenis.
Untuk bahasa yang ditafsirkan, ekstraktor berjalan langsung pada kode sumber, menyelesaikan dependensi untuk memberikan representasi basis kode yang akurat.
Ada satu ekstraktor untuk setiap bahasa yang didukung oleh CodeQL untuk memastikan bahwa proses ekstraksi seakurat mungkin. Untuk basis kode multi-bahasa, database dihasilkan satu bahasa pada satu waktu.
Setelah ekstraksi, semua data yang diperlukan untuk analisis (data relasional, file sumber yang disalin, dan skema database khusus bahasa yang menentukan hubungan timbel dalam data) diimpor ke dalam satu direktori, yang dikenal sebagai database CodeQL.
Pelaksanaan kueri
Setelah Anda membuat database CodeQL, satu atau beberapa kueri dijalankan terhadapnya. Kueri CodeQL ditulis dalam bahasa kueri berorientasi objek yang dirancang khusus yang disebut QL.
Anda dapat menjalankan kueri yang dicek keluar dari repositori CodeQL (atau kueri kustom yang telah Anda tulis sendiri) menggunakan ekstensi CodeQL untuk Visual Studio Code atau CodeQL CLI.
Hasil kueri
Langkah terakhir mengonversi hasil yang dihasilkan selama eksekusi kueri menjadi formulir yang lebih bermakna dalam konteks kode sumber, yang berarti bahwa hasilnya ditafsirkan dengan cara yang menyoroti potensi masalah yang dirancang untuk ditemukan kueri.
Kueri berisi properti metadata yang menunjukkan bagaimana hasilnya harus ditafsirkan. Misalnya, beberapa kueri menampilkan pesan sederhana di satu lokasi dalam kode. Yang lain menampilkan serangkaian lokasi yang mewakili langkah-langkah di sepanjang jalur aliran data atau aliran kontrol, bersama dengan pesan yang menjelaskan signifikansi hasilnya. Kueri yang tidak memiliki metadata tidak ditafsirkan; hasilnya adalah output sebagai tabel dan tidak ditampilkan dalam kode sumber.
Setelah interpretasi, hasilnya adalah untuk peninjauan kode dan pengurutan prioritas. Di CodeQL untuk Visual Studio Code, hasil kueri yang ditafsirkan secara otomatis ditampilkan dalam kode sumber. Anda dapat menghasilkan hasil yang dihasilkan oleh CodeQL CLI ke dalam sejumlah format berbeda untuk digunakan dengan alat yang berbeda.