0

私は、多くの設計上の問題があるレガシー Java プロジェクトに取り組んでいます。その結果、コードの一部が期待どおりに動作しません。次のコードを検討してください。

public enum Parent{
    PARENT1(CHILD1, CHILD2), PARENT2(CHILD3, CHILD1), 
    PARENT3(CHILD4, CHILD2)

    private Child [] children;
    Parent(Child ...children) { this.children = children; } 

    public Child [] getChildren() { return this.children; }
}

public enum Child{ CHILD1, CHILD2, CHILD3, CHILD4  }

上記のコードから、getChildren() が配列への参照を返すことがはっきりとわかります。したがって、次のように配列の要素を変更することができます。

   Child [] childrenOfParent3 = Parent3.getChildren();
   childrenOfParent3[0] = null;  //badcode

コードの一部が上記のようなことを行っており、これを見つけるのに苦労しています (grep は役に立ちません)。

jvm バイトコード分析を使用してこのパターン (badcode) を見つけるのに役立つツールはありますか、それともどのようにしますか?

: いくつかの制約により、親の実装を変更することはできません。

ありがとう!

4

3 に答える 3

3

Findbugsはこれを検出できます

于 2011-10-21T20:21:25.803 に答える
1

ここではいくつのインスタンスについて話しているのですか? Eclipse デバッガーなどのツールでは、データ ウォッチポイントを使用できます (例: オブジェクトの変更)。これにより、問題のオブジェクトを変更している正確なコード行でデバッガーが即座に停止します。唯一の秘訣は、監視したいオブジェクトを識別できるように、オブジェクトの作成時にブレークポイントを設定する必要があることです。

于 2011-10-24T06:51:58.400 に答える
0

Java Decompilerを使用してすべてのバイトコードをソースに変換すると、問題のコードに一致する正規表現を見つけることができます (または FindBugs を使用しますか?)。

于 2011-10-21T21:18:17.870 に答える