1

私は現在、2 つの制御フロー グラフを比較するプログラムに取り組んでいます (グラフは Soot で生成されます)。これらのグラフは 2 つの異なるクラスに属します。したがって、それぞれに 1 つの cfg です。

現在、クラスをロードするために以下を使用しています。

   SootClass sClassNew = Scene.v().loadClassAndSupport("Calc");     
   sClassNew.setApplicationClass();

   SootClass sClassOld = Scene.v().loadClassAndSupport("Calc2");        
   sClassOld.setApplicationClass()

プロジェクトを右クリックしてクラス Calc.java および Calc2.java を含むフォルダーを追加すると、これが機能します | Java ビルド パス | 外部クラス フォルダを追加| フォルダーを選択します。

残念ながら、これはまさに私が望んでいるものではありません。

  1. 2 つのクラスは、互いに異なるバージョンであるため、同じ名前になります。つまり、一方のクラスがもう一方のクラスの更新バージョンです。
  2. プログラムの実行時に、cfg が作成されるように、ユーザーがファイルを選択できるようにしたいと考えています。したがって、クラスを追加するために上記の手順を省略し、実行時にクラスを追加する方法が必要です。

重要な注意点として、Soot は JAR ファイルおよび Soot のクラスパスにあるディレクトリからのみファイルをロードします。これら2つの問題を解決する方法を知っている人はいますか?

4

1 に答える 1

1

Soot は、これに対処するように設定されていません。その主なデータ構造はシーンであり、そこには理由となるすべてのクラスが保持され、シーンはクラス名ごとに正確に 1 つのクラス インスタンスしか保持できません。2 つの異なるバージョンは存在できません。

そうは言っても、最近、Reviser と呼ばれる Soot の拡張機能を構築しました (現在提出中): https://github.com/StevenArzt/reviser Reviser は、プログラムのプロシージャ間の制御フロー グラフと、誘導された IFDS/IDE 分析情報を段階的に更新します。 . ただし、これを機能させるには、Soot のクラスローディング メカニズムをかなりいじる必要がありました。これは些細なことではありません。詳細に興味がある方は、Steven Arzt と私に個人的なメールを送ってください。

于 2013-12-01T11:52:28.547 に答える