Кросс-классный расширяемый инструмент статического анализа для Java? - PullRequest
4 голосов
/ 10 ноября 2008

Я пытаюсь написать правила для обнаружения некоторых ошибок в аннотированных многопоточных Java-программах. В качестве игрушечного примера я хотел бы определить, вызывает ли какой-либо метод, аннотированный @ThreadSafe, метод без такой аннотации, без синхронизации. Я ищу инструмент, который позволил бы мне написать такой тест.

Я смотрел на исходные анализаторы, такие как CheckStyle и PMD, и они на самом деле не имеют возможности межклассового анализа. Анализаторы байт-кода, такие как FindBugs и JLint, кажутся довольно сложными для расширения.

Я бы согласился на решение чего-то еще более простого, но представляющего ту же трудность: написание пользовательского правила, которое проверяет, аннотирован ли каждый переопределенный метод @Override.

Ответы [ 4 ]

3 голосов
/ 20 ноября 2008

Вы пробовали FindBugs ? Фактически он поддерживает набор аннотаций для обеспечения безопасности потоков (такой же, как те, которые используются в Java Concurrency на практике ). Также вы можете написать свои собственные правила. Я не уверен, что вы можете сделать межклассовый анализ, но я верю в это.

Peter Ventjeer имеет инструмент проверки параллелизма (который использует ASM) для обнаружения подобных вещей. Я не уверен, что он выпустил это публично, но он мог бы помочь вам.

И я считаю, Инструменты статического / динамического анализа Coverity для обеспечения безопасности потоков выполняют такую ​​проверку.

2 голосов
/ 14 ноября 2008

Вы можете сделать межклассовый анализ в PMD (хотя я никогда не использовал его для этой конкретной цели). Я думаю, что возможно использовать этот шаблон посетителя, который они документируют, хотя я оставлю детали для вас.

0 голосов
/ 10 ноября 2008

Попробуйте javap + регулярные выражения (например, Perl)

0 голосов
/ 10 ноября 2008

Простым инструментом для проверки аннотаций является apt (http://java.sun.com/j2se/1.5.0/docs/guide/apt/, также являющийся частью Java 6 API в javax.annotation.processing), однако он содержит только информацию о типе (т.е. я не смог найти быстрый способ получить в иерархии наследования с использованием API javax.lang.model, однако, если вы можете загрузить класс, вы можете получить эту информацию с помощью отражения).

...