Расширяемый инструмент статического анализа для Java с возможностью межклассовой поддержки?

StackOverflow https://stackoverflow.com/questions/276476

Вопрос

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

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

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

Это было полезно?

Решение

Попытался ли ты Найти ошибки?На самом деле он поддерживает набор аннотации для потокобезопасности (такие же, как те, которые используются в Java-параллелизм на практике).Кроме того, вы можете написать свои собственные правила.Я не уверен, можно ли провести межклассовый анализ, но я так думаю.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top