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




Простым инструментом для проверки аннотаций является apt (http://java.sun.com/j2se/1.5.0/docs/guide/apt/ также является частью Java 6 api в javax.annotation.processing), однако он содержит только информацию о типе (т.е. я не смог найти быстрый способ получить иерархию наследования с помощью javax. lang.model api, однако, если вы можете загрузить класс, вы можете получить эту информацию с помощью отражения).
Попробуйте java + regex (в Perl)
Вы можете сделать кросс-классовый анализ в PMD (хотя я никогда не использовал его для этой конкретной цели). Я думаю, что можно использовать этот шаблон посетителей, который они документируют, хотя я оставлю вам подробности.
Вы пробовали FindBugs? Фактически он поддерживает набор аннотации для безопасности потоков (тот же, что и в Параллелизм Java на практике). Кроме того, вы можете написать свои собственные правила. Я не уверен, что вы можете проводить межклассовый анализ, но я верю в это.
Питер Вентжеер имеет инструмент проверки параллелизма (который использует ASM) для обнаружения подобных вещей. Я не уверен, опубликовал ли он это публично, но, возможно, он сможет вам помочь.
И я считаю, что инструменты статического / динамического анализа Coverity's для обеспечения безопасности потоков выполняют такую проверку.