grep для конкретного шаблона байт-кода jvm - PullRequest
0 голосов
/ 22 октября 2011

Я работаю над устаревшим 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 или как бы вы это сделали?

ПРИМЕЧАНИЕ : из-за некоторых ограничений я не могу изменить родительскую реализацию.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 22 октября 2011

Findbugs способен обнаруживать это .

1 голос
/ 24 октября 2011

Сколько случаев мы говорим здесь?Такие инструменты, как отладчик Eclipse, позволяют отслеживать данные (например, объект изменен).Это приведет к немедленной остановке отладчика на той строке кода, которая модифицирует рассматриваемый объект.Единственная хитрость заключается в том, что вам нужно установить точку останова при создании объекта, чтобы вы могли определить объект, который вы хотите наблюдать.

0 голосов
/ 22 октября 2011

Вы можете использовать Java Decompiler , превращающий весь байт-код в исходный код, тогда вы сможете найти регулярное выражение, соответствующее рассматриваемому коду (или использовать FindBugs?).

...