Расширяемый инструмент статического анализа с кросс-классами для Java?

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
588
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Простым инструментом для проверки аннотаций является 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 для обеспечения безопасности потоков выполняют такую ​​проверку.

Другие вопросы по теме