Question

J'essaie d'écrire des règles pour détecter certaines erreurs dans les programmes Java multi-thread annotés . Par exemple, j'aimerais détecter si une méthode annotée avec @ThreadSafe appelle une méthode sans une telle annotation, sans synchronisation. Je cherche un outil qui me permettrait d'écrire un tel test.

J'ai examiné les analyseurs de sources, tels que CheckStyle et PMD, et ils ne disposent pas de fonctionnalités d'analyse transcendant les classes. Les analyseurs de bytecode, tels que FindBugs et JLint, semblent plutôt difficiles à étendre.

Je me contenterais d'une solution à quelque chose d'encore plus simple, tout en posant le même problème: écrire une règle personnalisée qui vérifie si chaque méthode surchargée est annotée avec @Override.

Était-ce utile?

La solution

Avez-vous essayé FindBugs ? Il prend en charge un ensemble de des annotations pour la sécurité du thread (identiques à ceux utilisés dans Concurrence Java en pratique ). En outre, vous pouvez écrire vos propres règles personnalisées. Je ne suis pas sûr que vous puissiez faire une analyse transversale, mais je le crois bien.

Peter Ventjeer a un outil de vérification de la simultanéité (utilisant ASM) pour détecter des éléments de ce type. Je ne sais pas s'il l'a publié publiquement, mais il pourrait peut-être vous aider.

Et je crois que les outils d'analyse statique / dynamique de Coverity pour la sécurité des threads effectuent ce type de vérification.

Autres conseils

Vous pouvez effectuer une analyse de classe croisée dans PMD (si je ne l'ai jamais fait) utilisé à cette fin spécifique). Je pense qu'il est possible d'utiliser ce modèle de visiteur qu'ils documentent, bien que je vous laisse les détails.

Un outil simple pour vérifier les annotations est apt ( http: //java.sun.com/j2se/1.5.0/docs/guide/apt/ fait également partie de Java 6 api dans javax.annotation.processing), mais il ne contient que des informations de type (c'est-à-dire que je n'ai pas pu trouver Un moyen rapide de connaître la hiérarchie des héritages à l’aide de l’API javax.lang.model. Toutefois, si vous pouvez charger la classe, vous pouvez obtenir ces informations par réflexion).

Essayez javap + regex (par exemple, Perl)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top