Domanda

Sto cercando di scrivere regole per rilevare alcuni errori nei programmi java multi-thread annotati . Ad esempio, vorrei rilevare se un metodo annotato con @ThreadSafe chiama un metodo senza tale annotazione, senza sincronizzazione. Sto cercando uno strumento che mi consenta di scrivere un test del genere.

Ho esaminato gli analizzatori di sorgente, come CheckStyle e PMD, e non hanno davvero capacità di analisi tra classi. Gli analizzatori di bytecode, come FindBugs e JLint, sembrano piuttosto difficili da estendere.

Mi accontenterei di una soluzione a qualcosa di ancora più semplice, ma ponendo la stessa difficoltà: scrivere una regola personalizzata che controlla se ogni metodo di sostituzione è annotato con @Override.

È stato utile?

Soluzione

Hai provato FindBugs ? In realtà supporta una serie di annotazioni per la sicurezza dei thread (uguale a quelli utilizzati in Java Concurrency in Practice ). Inoltre, puoi scrivere le tue regole personalizzate. Non sono sicuro che tu possa fare un'analisi tra classi, ma credo di si.

Peter Ventjeer ha un strumento di controllo della concorrenza (che utilizza ASM) per rilevare cose come questa. Non sono sicuro che l'abbia rilasciato pubblicamente, ma potrebbe aiutarti.

E credo che gli strumenti di analisi statica / dinamica di Coverity per la sicurezza dei thread eseguono un controllo in questo modo.

Altri suggerimenti

Puoi fare analisi tra classi in PMD (anche se non ho mai usato per questo scopo specifico). Penso che sia possibile utilizzare questo modello di visitatori che documentano, anche se lascerò i dettagli per te.

È adatto un semplice strumento per il controllo delle annotazioni ( http: //java.sun.com/j2se/1.5.0/docs/guide/apt/ anche parte di Java 6 api in javax.annotation.processing) tuttavia questo ha solo informazioni sul tipo (cioè non sono riuscito a trovare un modo rapido per accedere alla gerarchia dell'ereditarietà utilizzando l'API javax.lang.model, tuttavia se è possibile caricare la classe è possibile ottenere tali informazioni utilizzando reflection).

Prova javap + regexes (ad es. Perl)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top