Opalは、Java Bytecodeを分析およびエンジニアリングするための拡張可能なライブラリです。 OpalはScalaで完全に書かれており、Scalaの高度な言語機能を活用して、以前に目に見えなかった新しいレベルの柔軟性と使いやすさを提供します。 Opalは、拡張性、適応性、スケーラビリティ(メモリ、パフォーマンスごと)を念頭に置いて、ゼロから設計されました。 Opalの多くの部分はすでに並行しており、非常に同時の分析を実装するために必要なインフラストラクチャを提供するか、少なくともスレッドセーフです。
Opalはいくつかのプロジェクトで構成されています。
Common (Opal/Common):一般的な便利な関数、データ構造(トリマップなど)、グラフアルゴリズム(たとえば、強く接続されたコンポーネントの計算、ドミネーター情報の計算など)が含まれています。
静的分析インフラストラクチャ(OPAL/SI):モジュール化された静的分析の実装のための一般的な格子ベースのフレームワークが含まれています。
ByteCode Infrastructure (Opal/BI):Java 1.0 -Java 16 Bytecodeを解析するための必要なインフラストラクチャ。
ByteCode Resassembler (Opal/DA):クラスファイルの1対1の表現を提供し、Javaクラスファイルの読み取り可能なHTML表現を作成するために使用できるJava Bytecode Assembler。
Bytecode Creator (Opal/BC):Java Bytecodeをエンジニアリングするための最も基本的なインフラストラクチャ。
バイトコード表現(OPAL/BR):Java BytecodeのOpalの基本表現。すべての機能を実装して、Javaクラスファイルの基本的な分析を行います。
抽象解釈フレームワーク(OPAL/AI):さまざまなレベルの精度で分析を簡単に実装するために使用できる抽象的な解釈ベースのフレームワークの実装。
3つのアドレスコード(OPAL/TAC):2つの3つのアドレスコードベースの中間表現を提供します。バイトコードに基づいて直接作成される素朴なものと、基本的な抽象的な解釈の結果を使用して、CFGとDEF-使用情報を直接提供する高レベルのSSA様表現。
依存関係抽出(OPAL/DE):プロジェクトのソースコード依存関係の抽出と分析のサポートを提供します。このプロジェクトは、たとえば、アーキテクチャをチェックするプロジェクトの基盤です。
アーキテクチャ検証(OPAL/AV):指定されたものに対してプロジェクトの実装されたアーキテクチャを確認するための小さなフレームワーク。
フレームワーク(OPAL/フレームワーク):基本的に、すべてのサブプロジェクトを集約して、すべてのサブプロジェクトの一貫したスナップショットを簡単に取得できるようにします。一般に、Opalを使用する場合は、このプロジェクトへの依存を宣言することをお勧めします。
Demos (Opal/Demos):Opalの使用方法を示す作業コードサンプルが含まれています。デモプロジェクトのコードは、主に教育リソースとして意図されています。例を開始するには、 sbtコンソール(SCALAビルドツール)を開始し、現在のプロジェクトを「デモ」( project Demos )に変更します。その後、いくつかの小さなデモ分析runできます。
Hermes (Opal/Tools/Hermes):プロジェクトのセットに対してさまざまなコードクエリを実行するフレームワーク。
Bugpicker (Opal/Tools/BP):ソースコードで制御/データフローに依存する問題を見つけるためのツール。特定された問題の種類は、役に立たない防御チェックから、(未処理の)ランタイムの例外につながるバグにまで及びます。
Opalには、開発者がJava BytecodeやOpalに精通するのを支援することを目的としたツールが増えています。これらのプロジェクトは、 DEVELOPING_OPAL/toolsフォルダーにあり、SBTコンソールを使用して実行できます。
以下は、「マスター/開発」ブランチに適用されます。
OpalはSBTをビルドツールとして使用し、SBTコンソールを使用してOpalを使用することは特に簡単です。 Java 8を少なくとも更新171、Scala 2.12.13、SBT 1.4.6をインストールおよび実行していることを確認してください。SBTは、少なくとも4GBのRAM(-XMX4G)を使用できることを確認してください。 Opalの最近のスナップショットをダウンロードするか、リポジトリをクローンします。 Opalのルートフォルダーに移動します。
sbt cleanBuildに電話してください。これにより、すべてのコアプロジェクト(テストを含む)をコンパイルし、プロジェクト全体のScaladocドキュメントを生成し、プロジェクトをローカルアイビーディレクトリに公開します。local.sbtを編集し、2つのシステムプロパティ( JAVA_OPTS CPUBoundTasks === "Number of real CPUs (Cores)" :- -Dorg.opalj.threads.CPUBoundTasks=8 -Dorg.opalj.threads.IOBoundTasks=24マシンの適切な値に値を設定しますIOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" )。 SBTを使用するときに、これらのプロパティを入力して設定することもできます。eval sys.props("org.opalj.threads.CPUBoundTasks") = "1" 。sbt test電話して、ユニットテストを実行し、すべてが期待どおりに機能することをテストします。一部のテストでは、追加の(色付き)出力が生成されることに注意してください。ただし、すべてのテストがエラーなしで成功する限り、すべては問題ありません。 sbt testが失敗した場合、メモリが不十分なためである可能性があります。この場合、より多くのメモリでSBT自体を開始する必要があります。sbt it:testを呼び出して統合テストスイートを実行します。このテストスイートを実行すると、非常に時間がかかる場合があります(32GBと8コアの高速デスクトップでは、〜2時間かかります)。あなたは行く準備ができています。
トラブルシューティング
Opalの構築で問題が発生したら、次のオプションを検討してください。
開始するには、プロジェクトWebページにアクセスしてください。さらに、 Demosプロジェクトのコードには、一般的に繰り返されるタスクを解決する方法を示す多くの短い(ER)例が含まれています。ほとんどの例は直接実行できます。
SBTコンソールを開始します。 (Opalのルートフォルダーでは、コマンドラインのsbtを呼び出します。)コマンドproject Demosとタイプ実行を使用してプロジェクトをデモに変更して、デモの1つを実行しrun 。