Opal adalah perpustakaan yang dapat diperluas untuk menganalisis dan merekayasa bytecode java. Opal sepenuhnya ditulis dalam Scala dan memanfaatkan fitur bahasa canggih Scala untuk memberikan tingkat fleksibilitas dan kemudahan penggunaan yang baru dan sebelumnya tidak terlihat. Opal dirancang dari bawah ke atas dengan ekstensibilitas , kemampuan beradaptasi , dan skalabilitas (memori dan kinerja-bijaksana) dalam pikiran. Banyak bagian Opal sudah paralelisasi, menyediakan infrastruktur yang diperlukan untuk menerapkan analisis yang sangat bersamaan atau setidaknya aman-utas.
Opal terdiri dari beberapa proyek:
Umum (opal/umum): Berisi fungsi umum yang berguna, struktur data (misalnya Triemaps) dan algoritma grafik (misalnya, komponen yang sangat terhubung, menghitung informasi dominator, dll.) Berguna saat menganalisis (byte) kode.
Infrastruktur Analisis Statis (Opal/SI): Berisi kerangka kerja berbasis kisi generik untuk implementasi analisis statis modularisasi.
Infrastruktur bytecode (Opal/BI): Infrastruktur yang diperlukan untuk parsing Java 1.0 - Java 16 bytecode.
Bytecode Disassembler (Opal/DA): Java Bytecode Disassembler yang menyediakan representasi satu-ke-satu dari file kelas dan yang dapat digunakan untuk membuat representasi HTML yang dapat dibaca dari file kelas Java.
Bytecode Creator (Opal/BC): Infrastruktur paling dasar untuk merekayasa java bytecode.
Representasi bytecode (Opal/BR): Representasi dasar Opal dari Java Bytecode. Menerapkan semua fungsionalitas untuk melakukan analisis dasar file kelas Java.
Abstrak Interpretation Framework (Opal/AI): Implementasi kerangka kerja berbasis interpretasi abstrak yang dapat digunakan untuk dengan mudah mengimplementasikan analisis pada berbagai tingkat presisi.
Tiga Kode Alamat (Opal/TAC): Menyediakan dua representasi perantara berbasis kode 3-alamat. Yang naif yang secara langsung dibuat berdasarkan bytecode, dan representasi seperti SSA tingkat lebih tinggi yang secara langsung menyediakan CFG serta informasi penggunaan def menggunakan hasil interpretasi abstrak dasar.
Ekstraksi Dependensi (Opal/DE): Memberikan dukungan untuk mengekstraksi dan menganalisis dependensi kode sumber proyek. Proyek ini adalah dasar untuk proyek -proyek, misalnya, periksa arsitektur.
Validasi Arsitektur (Opal/AV): Kerangka kerja kecil untuk memeriksa arsitektur yang diimplementasikan proyek terhadap yang tertentu.
Framework (Opal/Framework): Pada dasarnya hanya mengumpulkan semua sub-proyek untuk memungkinkan untuk dengan mudah mendapatkan snapshot yang konsisten dari semua sub-proyek. Secara umum, disarankan untuk menyatakan ketergantungan pada proyek ini ketika Anda ingin menggunakan Opal.
Demo (opal/demo): Berisi sampel kode kerja yang menunjukkan cara menggunakan opal. Kode dalam proyek demo terutama dimaksudkan sebagai sumber pengajaran. Untuk memulai contoh, mulailah konsol sbt (Alat Build) dan ubah proyek saat ini menjadi "demo" ( project Demos ). Setelah itu Anda dapat run beberapa analisis demo kecil.
Hermes (Opal/Tools/Hermes): Kerangka kerja untuk menjalankan berbagai kueri kode terhadap set proyek.
BugPicker (Opal/Tools/BP): Alat untuk menemukan masalah yang bergantung pada kontrol-/data dalam kode sumber. Jenis masalah yang diidentifikasi berkisar dari cek defensif yang tidak berguna hingga bug yang mengarah pada pengecualian runtime (tidak ditangani).
Opal juga hadir dengan semakin banyak alat yang dimaksudkan untuk membantu pengembang untuk menjadi terbiasa dengan Java Bytecode dan/atau Opal. Proyek -proyek ini ditemukan di folder DEVELOPING_OPAL/tools dan dapat dijalankan menggunakan konsol SBT.
Berikut ini berlaku untuk cabang "master/kembangkan".
Opal menggunakan SBT sebagai alat pembuatannya dan bekerja dengan Opal sangat mudah menggunakan konsol SBT. Pastikan Anda memiliki Java 8 setidaknya memperbarui 171, Scala 2.12.13 dan SBT 1.4.6 diinstal dan dijalankan dan bahwa SBT dapat menggunakan setidaknya 4GB RAM (-XMX4G). Unduh snapshot terbaru Opal atau klon repositori. Pergi ke folder root Opal.
sbt cleanBuild . Ini mengkompilasi semua proyek inti (termasuk tes), menghasilkan dokumentasi Scaladoc di seluruh proyek dan menerbitkan proyek ke direktori Ivy lokal Anda.local.sbt dan tentukan dua properti sistem ( JAVA_OPTS ): -Dorg.opalj.threads.CPUBoundTasks=8 -Dorg.opalj.threads.IOBoundTasks=24 - Nilai yang sesuai dengan nilai yang sesuai untuk mesin Anda ( CPUBoundTasks === "Number of real CPUs (Cores)" IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" ). Anda juga dapat mengatur properti ini saat menggunakan SBT dengan mengetik:eval sys.props("org.opalj.threads.CPUBoundTasks") = "1" .sbt test untuk menjalankan tes unit dan untuk menguji bahwa semuanya berfungsi seperti yang diharapkan. Harap dicatat, bahwa beberapa tes menghasilkan beberapa output tambahan (berwarna). Namun, selama semua tes berhasil tanpa kesalahan, semuanya baik -baik saja. Jika sbt test gagal, itu mungkin karena memori yang tidak mencukupi. Dalam hal ini perlu untuk memulai SBT sendiri dengan lebih banyak memori.sbt it:test untuk menjalankan suite tes integrasi. Melaksanakan suite tes ini mungkin memakan waktu sangat lama (pada desktop cepat dengan 32GB dan 8 core dibutuhkan ~ 2 jam).Anda siap untuk pergi.
Pemecahan masalah
Ketika Anda mengalami masalah dalam membangun Opal, silakan pertimbangkan opsi berikut.
Untuk memulai, buka halaman web proyek. Selain itu, kode dalam proyek Demos berisi banyak contoh pendek (ER) yang menunjukkan cara menyelesaikan tugas yang umum berulang. Sebagian besar contoh dapat secara langsung dieksekusi.
Mulai konsol SBT. (Dalam folder root Opal, panggilan sbt pada baris perintah.) Ubah proyek menjadi demo menggunakan project Demos dan ketik run untuk menjalankan salah satu demo.