Opal ist eine erweiterbare Bibliothek zur Analyse und technischen Java -Bytecode. Opal ist vollständig in Scala geschrieben und nutzt die erweiterten Sprachfunktionen von Scala, um ein neues und bisher unsichtbares Maß an Flexibilität und Benutzerfreundlichkeit zu bieten. Opal wurde von Grund auf mit Erweiterbarkeit , Anpassungsfähigkeit und Skalierbarkeit (Gedächtnis und Leistung) ausgelegt. Viele Teile von Opal sind entweder bereits parallelisiert, bieten die erforderliche Infrastruktur, um hochverträgliche Analysen zu implementieren, oder sind zumindest fadensicher.
Opal besteht aus mehreren Projekten:
Gemeinsam (Opal/Common): Enthält allgemeine nützliche Funktionen, Datenstrukturen (z. B. Triemaps) und Graph-Algorithmen (z. B. Computer stark verbundene Komponenten, Computerdominatorinformationen usw.) bei der Analyse (BYTE) Code (BYTE).
Statische Analyseinfrastruktur (OPAL/SI): Enthält ein generisches gitterbasiertes Rahmen für die Implementierung modularisierter statischer Analysen.
Bytecode -Infrastruktur (OPAL/BI): Die erforderliche Infrastruktur zum Parsen von Java 1.0 - Java 16 -Bytecode.
Bytecode Disassembler (OPAL/DA): Ein Java-Bytecode-Disassembler, der eine Eins-zu-Eins-Darstellung der Klassendatei bietet und zum Erstellen lesbarer HTML-Darstellungen von Java-Klassendateien verwendet werden kann.
Bytecode Creator (OPAL/BC): Die grundlegendste Infrastruktur zum Ingenieur von Java -Bytecode.
Bytecode -Darstellung (OPAL/BR): Opals Basisdarstellung von Java -Bytecode. Implementiert alle Funktionen, um grundlegende Analysen von Java -Klassendateien durchzuführen.
Abstract Interpretation Framework (OPAL/AI): Implementierung eines abstrakten interpretationsbasierten Frameworks, mit dem die Analysen auf verschiedenen Ebenen der Genauigkeit einfach implementiert werden können.
Drei Adresscode (OPAL/TAC): Bereits zwei 3-Adress-Code-basierte Zwischendarstellung. Eine naive, die direkt basierend auf der Bytecode erstellt wird, und eine höhere SSA-ähnliche Darstellung, die direkt einen CFG sowie definitive Informationen anhand der Ergebnisse einer grundlegenden abstrakten Interpretation liefert.
Abhängigkeitsextraktion (OPAL/DE): Bietet Unterstützung für das Extrahieren und Analysieren der Quellcodeabhängigkeiten eines Projekts. Dieses Projekt ist die Grundlage für Projekte, z. B. Architekturen zu überprüfen.
Architekturvalidierung (OPAL/AV): Ein kleiner Rahmen zur Überprüfung der implementierten Architektur eines Projekts mit einem bestimmten.
Framework (Opal/Framework): Grundsätzlich aggregiert nur alle Unterprojekte, um es möglich zu machen, einen konsistenten Schnappschuss aller Unterprojekte zu erhalten. Im Allgemeinen wird empfohlen, eine Abhängigkeit von diesem Projekt zu erklären, wenn Sie Opal verwenden möchten.
Demos (Opal/Demos): Enthält Arbeitscode -Beispiele, die zeigen, wie Opal verwendet wird. Der Code im Demo -Projekt ist in erster Linie als Lehrressource gedacht. Um die Beispiele zu starten, starten Sie die sbt -Konsole (Scala Build -Tools) und ändern Sie das aktuelle Projekt in "Demos" ( project Demos ). Danach können Sie mehrere kleine Demoanalysen run .
Hermes (Opal/Tools/Hermes): Ein Framework zum Ausführen verschiedener Code -Abfragen gegen Projektsätze.
Bugpicker (OPAL/Tools/BP): Ein Tool zum Finden von Problemen mit Steuer-/Daten-Flow-abhängiger Probleme im Quellcode. Die Art von Problemen, die identifiziert werden, reichen von nutzlosen Defensivkontrollen bis hin zu Fehler, die zu (unberateten) Laufzeitausnahmen führen.
Opal hat auch eine wachsende Anzahl von Tools, die Entwicklern helfen sollen, sich mit Java -Bytecode und/oder Opal vertraut zu machen. Diese Projekte finden Sie im Ordner DEVELOPING_OPAL/tools und können mit der SBT -Konsole ausgeführt werden.
Das Folgende gilt für den Zweig "Master/Development".
Opal verwendet SBT als Build -Tool und die Arbeit mit Opal ist besonders einfach mit der SBT -Konsole. Stellen Sie sicher, dass Sie Java 8 zumindest aktualisieren, 171, Scala 2.12.13 und SBT 1.4.6 installiert und ausgeführt werden und dass SBT mindestens 4 GB RAM (-xmx4g) verwenden kann. Laden Sie eine aktuelle Snapshot von Opal herunter oder klonen Sie das Repository. Gehen Sie in Opals Root -Ordner.
sbt cleanBuild . Dies erstellt alle Kernprojekte (einschließlich Tests), generiert die projektweite Scaladoc-Dokumentation und veröffentlicht das Projekt in Ihrem lokalen Ivy-Verzeichnis.local.sbt und geben Sie die beiden Systemeigenschaften an ( JAVA_OPTS ): -Dorg.opalj.threads.CPUBoundTasks=8 -Dorg.opalj.threads.IOBoundTasks=24 IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" Setzen Sie die Werte für die geeigneten Werte für Ihre Maschinen ( CPUBoundTasks === "Number of real CPUs (Cores)" . IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" ). Sie können diese Eigenschaften auch beim Eingeben von SBT einstellen:eval sys.props("org.opalj.threads.CPUBoundTasks") = "1" .sbt test an, um die Unit -Tests auszuführen und zu testen, dass alles wie erwartet funktioniert. Bitte beachten Sie, dass einige Tests eine zusätzliche (farbige) Ausgabe erzeugen. Solange alle Tests ohne Fehler erfolgreich sind, ist alles in Ordnung. Wenn sbt test fehlschlägt, kann dies auf unzureichendem Speicher zurückzuführen sein. In diesem Fall ist es notwendig, SBT selbst mit mehr Speicher zu beginnen.sbt it:test , um die Integrationstestsuite auszuführen. Die Ausführung dieser Testsuite kann sehr lange dauern (auf einem schnellen Desktop mit 32 GB und 8 Kernen dauert ~ 2H).Du bist bereit zu gehen.
Fehlerbehebung
Wenn Sie auf Probleme beim Aufbau von Opal stoßen, berücksichtigen Sie bitte die folgenden Optionen.
Um loszulegen, besuchen Sie die Projektwebseite. Darüber hinaus enthält der Code im Demos -Projekt viele kurze (ER-) Beispiele, die zeigen, wie häufig wiederkehrende Aufgaben gelöst werden können. Die meisten Beispiele können direkt ausgeführt werden.
Starten Sie die SBT -Konsole. (In Opals Root Ordner rufen Sie sbt in der Befehlszeile auf.) Ändern Sie das Projekt mit den project Demos in Demos und geben Sie run ein, um einen der Demos auszuführen.