Implementação do SpotBugs Plugin

Criação do projeto Maven

Use spotbugs-archetype para criar o projeto Maven. Então, a arquitetura do Maven plugin pede para que você informe o groupId, artifactId, package e versão inicial do plugin.

$ mvn archetype:generate \
      -DarchetypeArtifactId=spotbugs-archetype \
      -DarchetypeGroupId=com.github.spotbugs \
      -DarchetypeVersion=0.2.3

Escrita do código Java para representar o bug a ser encontrado

No projeto gerado, você pode encontrar um arquivo nomeado como BadCase.java. Atualize esse arquivo para representar o bug a ser encontrado.

Se você tem muitos padrões a serem representados, adicione mais classes no diretório src/test/java.

Escreva casos de teste para garantir que seu detector pode encontrar bugs

No projeto gerado, você pode encontrar o arquivo nomeado como MyDetectorTest.java. Nesse teste, o spotbugs.performAnalysis(Path) executa o SpotBugs com o seu plugin, e retorna todos os bugs encontrados (o primeiro argumento desse método é o caminho do arquivo de classe compilado a partir de BadCase.java).

Você pode usar BugInstanceMatcher para verificar que seu plugin pode encontrar bug como o esperado.

Atualmente, esse teste deve falhar, porque não atualizamos o detector ainda.

Escrita de código Java para evitar falso-positivos

Para evitar falso positivos, é bom garantir os casos em que o detector NÃO deve encontrar um bug.

Atualize GoodCase.java no seu projeto, e represente tais casos. Em seguida, adicione um método de teste em MyDetectorTest.java o qual verifica que não foram encontradas instâncias de bug na classe GoodCase.

Se você tem muitos padrões a serem representados, adicione mais classes no diretório src/test/java.

Atualize o detector para passar em todos os testes de unidade

Agora você tem testes que garantem que seu detector funciona como o esperado.

Nota

TBU

Qual super classe você deve escolher

AnnotationDetector

Um detector base que analisa anotações em classes, campos, métodos e parâmetros de método.

BytecodeScanningDetector

Um detector base que analisa Java bytecode em arquivos de classe.

OpcodeStackDetector

É uma subclasse de BytecodeScanningDetector. Você pode verificar o bytecode do método e usar a pilha de operandos.

Atualizar o findbugs.xml

O SpotBugs lê o arquivo findbugs.xml em cada plugin para encontrar os detectores e bugs.Portanto, ao adicionar um novo detector, você precisa adicionar o novo elemento <Detector> da seguinte maneira :

<Detector class="com.github.plugin.MyDetector" reports="MY_BUG" speed="fast" />

Você também precisa adicionar <BugPattern> para descrever o tipo e a categoria do padrão de bug.

<BugPattern type="MY_BUG" category="CORRECTNESS" />

você pode encontrar o arquivo findbugs.xml no diretório src/main/resources do projeto Maven gerado

Atualizar messages.xml

O SpotBugs lê o arquivo messages.xml em cada plugin e cria uma mensagem legível por humanos para relatar os bugs detectados. Além disso, ele também suporta a leitura de mensagens localizadas em messages_ja.xml, messages_fr.xml e etc.

Você pode encontrar o arquivo messages.xml no diretório src/main/resources do projeto Maven gerado.

Atualizar a mensagem do Detector

Você pode adicionar uma mensagem descritiva no elemento <Detector>. Observe que a mensagem deve ser texto simples, HTML não é suportado.

<Detector class="com.github.plugin.MyDetector">
  <Details>
    Original detector to detect MY_BUG bug pattern.
  </Details>
</Detector>

Atualizar a mensagem de Bug Pattern

Você pode adicionar uma mensagem descritiva no elemento <BugPattern>. Há três tipos de mensagens:

ShortDescription

Apresenta uma breve descrição de um padrão de bug. Essa mensagem é útil para comunicar as intenções e o caráter para os usuários. Deve ser texto simples e HTML não é compatível.

LongDescription

Apresenta uma descrição mais longa do padrão de bug. Você pode usar um espaço reservado como {0} (0-índice) e os dados de BugInstance serão inseridos nesse espaço. Portanto, o LongDescription é útil para fornecer informações detalhadas sobre os bugs encontrados

Deve ser texto simples e HTML não é compatível.

Detalhes

Uma descrição detalhada do padrão de bug. Deve estar no formato HTML para comunicar especificações/exemplos detalhados em tabelas, listas e fragmentos de código.

<BugPattern type="MY_BUG">
  <ShortDescription>Explain bug pattern shortly.</ShortDescription>
  <LongDescription>
    Explain existing problem in code, and how developer should improve their implementation.
  </LongDescription>
  <Details>
    <![CDATA[
      <p>Explain existing problem in code, and how developer should improve their implementation.</p>
    ]]>
  </Details>
</BugPattern>