2009-11-05 5 views
5

私は、大学のクラスのスタティックアナライザーを作成しようとしています。ツールのためのより多くのパワーを提供するために、コール階層を調べることができます(Ctrl + Alt + HはEclipseで行います)。これも高速な操作でなければならないため、バイトコードスキャンではなくインデックスに対してルックアップを実行する必要があります。Eclipseのコード索引作成機能を切り離すことはできますか?

しかし、Eclipseプラグインを書くことはあまりにも野心的です。代わりに、コードインデックスを作成するEclipseの部分をデカップリングし、ライブラリを使用して参照を行います。実装を単純化するために、ユーザーとのインターフェイスはコマンドライン上にあります。

EclipseはLuceneを使用して索引付けを行っていますが、Eclipseが許す機能のためにはLuceneの上でかなりの量の作業が必要です。

質問は、再利用のためにEclipseの索引機能を切り離すことは可能ですか?もしそうでなければ、私が議論したような処理を行うことができる他のライブラリがありますか?

アクション[1] Luceneの(IIRC)


EDIT

私はいくつかの誤解があったと思います。私はクラスの階層を調べるために探していない、私はの呼び出しを検査したいと思います。だからこそ、検索と索引付け(何らかの種類がありますが、それは適切な用語ではないかもしれませんが)が議論に入る理由です。クラス階層を調べることは、おそらく呼び出し階層を調べるよりもはるかに安いでしょう。

Eclipseプラグインを作成する場合、私は大好きですが、この割り当てが非常に短いタイムスケールにあるとすれば、私はそれを管理することはほとんどありません。しかし、それは私が思うほど厳しくはないと感じている人がいるという役に立つ情報です。

おそらく私はEclipseに重点を置いているかもしれませんが、実際に私は、バイトコードを通してコールグラフを検査するためのAPIを提供するツールを探していました。

これまでのお返事ありがとうございます!

+0

- Eclipseが非常に速く実行する方法について知っておくべき重要なことは、一般的なインデックスを一度作成し、クラスが変更されたときにのみそれを更新することです。だから、私はこのEclipseの機能から切り離すことはほとんどないと思う。コール階層の索引テーブルを構築する(コール階層を検索する各タイプをスキャンしなくて済むように保存できる)最初のフルバイトコード分析を避ける方法はわかりません。 本当に巨大なコードベースを除いて正直言って、ASMでは完全スキャンが本当に速く、 "デルタインデクサ"を書くのに費やす時間は労力に値するものではありません。 – Olivier

+0

最初の初期スキャンで問題はありません。私がもっと心配しているのは、それを実行するAPIを見つけることです(クラスのスコープ外)。最初の完全スキャンがASMで行われている場合は問題ありませんが、私はこのビットを書くことを避けたいです;-) – Grundlefleck

答えて

0

ecjを見ましたか?これは、Eclipseのコンパイラ部分で、別のプロジェクトに組み込まれています。

それとも、日食のJDT部分を使用することができます:あなたが探しているhttp://www.eclipse.org/jdt/core/index.php

1

操作が正確にインデックスではありません。索引付けは全文検索を提供するために行われます。与えられたクラスのスーパークラスを見つけることは、ほとんどテキスト検索ではありません。

JDTを使用するEclipseプラグイン(むしろシンプルで、ほんの数個のクラスかもしれません)を作成したいとします。あなたのコードを分析するために使用されるAST(抽象構文木)ビジターを書く必要があります。タイプを解決し、JDT機能を使用してクラス階層を簡単にトラバースすることができます。

チェックアウトmy answer to this question

+0

私の編集をご覧ください。私はスーパークラスを解決するつもりはないが、特定のメソッドのグラフを呼び出す。乾杯。 – Grundlefleck

+0

メソッドfooを検査しているとします。fooによって呼び出されたメソッドやfooを呼び出すメソッドを探していますか?大きな違いがあります。 – zvikico

+0

fooの呼び出し。具体的にコンストラクタを呼び出す – Grundlefleck

0

Eclipseプラグインは本当に難しくありません。彼らは多少慣れていますが、あまり長くはありません。

eclipse IDEに必要な機能を追加することを考えてください。他のプラグイン機能(探している検索機能を含むJDTなど)を活用することができます。

別のスタンドアロンツールを開発するのではなく、Eclipseユーザーが使用するプラグインを提供できます。

1

私はASMに基づいて解決策を検討しますが、それは階層を解決するという難しい作業を行います。ここで が与えられたクラスの呼び出し階層をprintlnをシンプルアナライザ、次のとおりです。

public class Analyzer { 
    public static void main(String[] args) throws IOException { 
     ClassReader classReader; 
     ClassNode classNode; 
     String fullyQualifiedClassName = args[0]; 
     String callHierarchy = ""; 
     while (null != fullyQualifiedClassName) { 
      callHierarchy = " > " + fullyQualifiedClassName + callHierarchy; 
      classReader = new ClassReader(fullyQualifiedClassName); 
      classNode = new ClassNode(); 
      classReader.accept(classNode, 0); 
      if (null != classNode.superName) { 
       fullyQualifiedClassName = classNode.superName.replace('/', '.'); 
      } else { 
       fullyQualifiedClassName = null; 
      } 
     } 
     System.out.println(callHierarchy); 
    } 
} 

は、引数としてjava.util.TreeMapのを考えると、それは、私はこれはバイトコード解析である知っている

> java.lang.Object > java.util.AbstractMap > java.util.TreeMap 

を印刷しますしかし、正直言って、ASMは雷が速く、Call Hierarchyが必要なだけであればスキャンに時間がかかりません(何も目立ちません)。

・ホープ、この助け:)

+0

あなたの例は、 "タイプ階層"を示しています。私は "Call Hierarchy"を探しています。メソッドAがメソッドBを呼び出し、Bの呼び出し階層を調べると、メソッドAが表示されます。これは型階層より複雑です。コードベース全体をスキャンする必要があると思います。そのため、私はインデックス付きのソリューションを探していました。私が何か誤解していない限り、... – Grundlefleck

4

バイトコードをウォーキングは全く難しいことではありませんし、どちらか遅いではありません。インタラクティブな速度で大規模なJavaコードプロジェクトを静的に分析しました。あなたは時間が足りないので、Eclipseグラフのコールグラフビューアプラグイン[1]のようなものを変更することをお勧めします。また、Eclipseのコードを理解するのは難しいので、できるだけ多くのEclipseの文書化されていないAPIを使用する独自のプラグインを作成する方がよいでしょう。

[1] http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid-1326.html

+0

+1リンクは興味深いものを提供します。 – Grundlefleck

+1

私はこの提案が大好きです:「できるだけ多くのEclipseの文書化されていないAPIを使う」。真剣ですか? –

+0

私はそれをしました。それは時間がかかりますが、持続性を持って行うことができます。 – mansu

1

は、IBMのWALAフレームワークを見てください。とりわけ、コードベースのコールグラフ(CG)を生成することができます。実際に、WALAのすべてのものは、CGの構築から始まります。 サンプルを変更し、テストデータを独自のものに置き換えることができます。

1

私はEclipseを完全に無視します。それはあなたの気を散らすだけです。

静的解析を実行している場合は、ほとんどの場合、バイトコードを分析する必要があります。コール階層を見つけるには、invokeinstance,invokestatic、およびinvokespecialバイトコード(JVM specを参照)を探します。これらは完全修飾されたクラス/メソッド名を参照し、Map<FuncRef,Set<FuncRef>>を使用して呼び出し階層を構築することができます。FuncRefは、メソッド呼び出し情報を保持するために定義するクラスです。

BCELバイトコードのスキャンに役立ちます。

しかし、あなたは本当のインスタンスが何であるか分からないため、特に invokeinstance で、より多くの作業を行う必要があるとしています。場合によっては、コードを後方に見て割り当てを見つけることができますが、推測する可能性が高くなります - これは静的解析のアキレス腱です。

1

これはEclipseのGUIプラグインで、コールの階層を視覚的に表現します。それはリストではありませんが、それは助けになります。内部にあることと、それらのうち何かを構築するために意図されているビットを抽出するよりも - Eclipseのが設計され、文書化されている -

http://www.certiv.net/projects/callgraph.html

0

は、私はあなたがそれがプラグインを作成する方が簡単だということでしょう疑い。

関連する問題