Introduction à FindBugs

1. Vue d’ensemble

FindBugs est un outil open source utilisé pour effectuer une analyse statique sur du code Java.

Dans cet article, nous allons voir comment configurer FindBugs sur un projet Java et l’intégrer à l’EDI et à la compilation Maven.

2. FindBugs Maven Plugin

2.1. Configuration Maven

Afin de commencer à générer des rapports d’analyse statiques, nous devons d’abord ajouter le plugin FindBugs dans notre pom.xml :

<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>3.0.4</version>
        </plugin>
    </plugins>
</reporting>

Vous pouvez consulter la page dernière version du plugin sur Maven Central.

2.2. Génération de rapports

Maintenant que le plugin Maven est correctement configuré, générons la documentation du projet à l’aide de la commande mvn site .

Le rapport sera généré dans le dossier target/site du répertoire du projet sous le nom findbugs.html .

Vous pouvez également exécuter la commande mvn findbugs: gui pour lancer l’interface graphique afin de parcourir les rapports générés pour le projet en cours.

Le plugin FindBugs peut également être configuré pour échouer dans certaines circonstances - en ajoutant l’objectif d’exécution check à notre configuration:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>3.0.4</version>
    <configuration>
        <effort>Max</effort>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Le effort - lorsque maximisé, effectue une analyse plus complète et précise, révélant plus de bogues dans le code, cependant, il consomme plus de ressources et prend plus de temps.

Vous pouvez maintenant exécuter la commande mvn verify pour vérifier si la construction réussira ou non, en fonction des défauts détectés lors de l’exécution de l’analyse.

Vous pouvez également améliorer le processus de génération de rapports et mieux contrôler l’analyse en ajoutant une configuration de base à la déclaration du plug-in:

<configuration>
    <onlyAnalyze>org.baeldung.web.controller.** </onlyAnalyze>
    <omitVisitors>FindNullDeref</omitVisitors>
    <visitors>FindReturnRef</visitors>
</configuration>

L’option onlyAnalyze déclare une valeur séparée par des virgules de classes/packages pouvant être analysés.

Les options visitors / omitVisitors sont également des valeurs séparées par des virgules. Elles servent à spécifier les détecteurs qui doivent/ne doivent pas être exécutés au cours de l’analyse. Notez que visitors et omitVisitors ne peuvent pas être utilisés en même temps .

Un détecteur est spécifié par son nom de classe, sans qualification de package. Vous trouverez les détails de tous les noms de classe de détecteurs disponibles en suivant les liens http://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/detect/package-summary.html ].

3. FindBugs Eclipse Plugin

3.1. Installation

L’installation du plug-in FindBugs dans l’EDI est assez simple: il vous suffit d’utiliser la fonctionnalité de mise à jour de logiciel dans Eclipse _, avec le site de mise à jour suivant: http://findbugs.cs.umd.edu/eclipse . _

Pour vous assurer que FindBugs est correctement installé dans votre environnement Eclipse, recherchez l’option intitulée FindBugs sous Windows → Préférences → Java.

3.2. Rapports de navigation

Pour lancer une analyse statique sur un projet à l’aide du plug-in FindBugs Eclipse, vous devez cliquer avec le bouton droit sur le projet dans l’explorateur de packages, puis cliquer sur l’option intitulée find bugs .

Après le lancement, Eclipse affiche les résultats dans la fenêtre de l’Explorateur de bogues, comme indiqué dans la capture d’écran ci-dessous:

/uploads/bug__explorer.png%20652w À partir de la version 2, FindBugs a commencé à classer les bogues avec une échelle de 1 à 20 pour mesurer la gravité des défauts:

  • Scariest : classé entre 1

  • Effrayant : classé entre 5

  • Troubling : classé entre 10

  • Préoccupant : classé entre 15

Bien que le classement des bogues décrive la gravité, le facteur de confiance reflète la probabilité que ces bogues soient signalés comme tels. La confiance s’appelait à l’origine priorité , mais elle a été renommée dans la nouvelle version.

Bien entendu, certains défauts peuvent être sujets à interprétation et même exister sans nuire au comportement souhaité d’un logiciel.

C’est pourquoi, dans une situation réelle, nous devons configurer correctement les outils d’analyse statique en choisissant un ensemble limité de défauts à activer dans un projet spécifique.

3.3. Configuration Eclipse

Le plug-in FindBugs facilite la personnalisation de la stratégie d’analyse des bogues en offrant différentes méthodes pour filtrer les avertissements et limiter la rigueur des résultats. Vous pouvez vérifier l’interface de configuration en allant dans Fenêtre → Préférences → Java → FindBugs:

Vous pouvez librement décocher les catégories non désirées, élever le rang minimum à signaler, spécifier le niveau de confiance minimum à signaler et personnaliser les marqueurs pour le classement des bogues - Avertissement, Informations ou Erreur.

FindBugs divise les défauts en plusieurs catégories:

  • Correctness - rassemble des bugs généraux, par exemple boucles infinies,

utilisation inappropriée de equals () , etc. Mauvaise pratique ** , par exemple gestion des exceptions, flux ouverts, chaînes

comparaison, etc. Performances ** , par exemple objets inactifs

  • Exactitude multithread ** - recueille les incohérences de synchronisation

et divers problèmes dans un environnement multi-thread Internationalisation ** - regroupe les problèmes d’encodage et de

l’internationalisation de l’application Vulnérabilité liée au code malveillant ** - recueille les vulnérabilités dans le code, par exemple.

extraits de code pouvant être exploités par des attaquants potentiels Sécurité ** - rassemble des failles de sécurité liées à des protocoles spécifiques ou

Injections SQL Dodgy ** - recueille les odeurs de code, par exemple comparaisons inutiles, contrôles nuls,

variables inutilisées, etc.

Sous l’onglet Configuration du détecteur , vous pouvez vérifier les règles que vous êtes censé respecter dans votre projet:

  • L’attribut speed indique le coût de l’analyse ** . Plus le détecteur est rapide, plus les ressources utilisées pour le réaliser sont réduites.

Vous pouvez trouver la liste exhaustive des bogues reconnus par FindBugs sur le site page de la documentation officielle .

Sous le panneau Filtrer les fichiers , vous pouvez créer des filtres de fichiers personnalisés, afin d’inclure/exclure des parties de la base de code. Cette fonctionnalité est utile, par exemple, lorsque vous souhaitez empêcher le code «non géré» ou «corbeille», l’apparition d’anomalies dans les rapports ou l’exclusion de toutes les classes du package de test, par exemple.

4. FindBugs IntelliJ IDEA Plugin

4.1. Installation

Si vous êtes un fan d’IntelliJ IDEA et que vous souhaitez commencer à inspecter le code Java à l’aide de FindBugs, vous pouvez simplement vous procurer le package d’installation du plug-in à partir du site official. et extrayez-le dans le dossier% INSTALLATION__DIRECTORY%/plugins. Redémarrez votre IDE et vous êtes prêt à partir.

Vous pouvez également accéder à Paramètres → Plugins et rechercher tous les référentiels pour le plugin FindBugs.

Au moment de la rédaction de cet article, la version 1.0.1 du plugin IntelliJ IDEA est tout juste sortie,

Pour vous assurer que le plug-in FindBugs est correctement installé, vérifiez l’option “Analyser le code du projet” sous Analyser → FindBugs.

4.2. Rapports de navigation

Pour lancer l’analyse statique dans IDEA, cliquez sur «Analyser le code du projet» sous Analyser → FindBugs, puis recherchez le panneau FindBugs-IDEA pour examiner les résultats:

Vous pouvez utiliser la deuxième colonne de commandes à gauche de la capture d’écran pour regrouper les défauts à l’aide de différents facteurs:

  1. Grouper par une catégorie de bogue.

  2. Groupe par classe.

  3. Grouper par un paquet.

  4. Regrouper par rang de bugs.

Il est également possible d’exporter les rapports au format XML/HTML en cliquant sur le bouton «exporter» dans la quatrième colonne de commandes.

4.3. Configuration

Les pages de préférences du plug-in FindBugs dans IDEA sont assez explicites:

Cette fenêtre de paramètres est assez similaire à celle que nous avons vue dans Eclipse. Vous pouvez donc effectuer toutes sortes de configurations de la même manière, à partir du niveau d’analyse, du classement des bogues, de la confiance, du filtrage des classes, etc.

Le panneau de préférences est accessible dans IDEA en cliquant sur l’icône «Préférences du plug-in» sous le panneau FindBugs-IDEA.

5. Analyse du rapport pour le projet Spring-Rest

Dans cette section, nous allons jeter un éclairage sur une analyse statique réalisée sur le projet spring-rest disponible sur Github :

La plupart des défauts sont mineurs - d’inquiétude, mais voyons ce que nous pouvons faire pour en réparer certains.

  • La méthode ignore la valeur de retour exceptionnelle: **

File fileServer = new File(fileName);
fileServer.createNewFile();

Comme vous pouvez probablement le deviner, FindBugs se plaint du fait que nous jetons la valeur de retour de la méthode createNewFile () . Un correctif possible consisterait à stocker la valeur renvoyée dans une variable nouvellement déclarée, puis à enregistrer quelque chose de significatif à l’aide du niveau de journalisation DEBUG - par exemple. “ Le fichier nommé n’existe pas et a été créé avec succès ” si la valeur renvoyée est true.

  • La méthode peut ne pas fermer les flux sur exception: ce défaut particulier illustre un cas d’utilisation typique pour la gestion des exceptions qui suggère de toujours fermer les flux dans un bloc finally ** :

try {
    DateFormat dateFormat
      = new SimpleDateFormat("yyyy__MM__dd__HH.mm.ss");
    String fileName = dateFormat.format(new Date());
    File fileServer = new File(fileName);
    fileServer.createNewFile();
    byte[]bytes = file.getBytes();
    BufferedOutputStream stream
      = new BufferedOutputStream(new FileOutputStream(fileServer));
    stream.write(bytes);
    stream.close();
    return "You successfully uploaded " + username;
} catch (Exception e) {
    return "You failed to upload " + e.getMessage();
}

Lorsqu’une exception est levée avant l’instruction stream.close () , le flux n’est jamais fermé. C’est pourquoi il est toujours préférable d’utiliser le bloc finally \ {} pour fermer les flux ouverts au cours d’une routine try / catch .

  • Une Exception est interceptée lorsque Exception n’est pas levée ** : Comme vous le savez peut-être déjà, intercepter Exception est une mauvaise pratique de codage. FindBugs pense que vous devez intercepter une exception plus spécifique pour pouvoir la gérer correctement. Donc, si vous manipulez des flux dans une classe Java, capturer IOException serait plus approprié que de capturer une exception plus générique.

  • Champ non initialisé dans le constructeur mais déréférencé sans contrôle de null ** : c’est toujours une bonne idée d’initialiser les champs à l’intérieur des constructeurs, sinon nous devrions vivre avec la possibilité que le code lève un NPE . Il est donc recommandé de procéder à des vérifications null lorsque nous ne sommes pas sûrs que la variable est correctement initialisée ou non.

6. Conclusion

Dans cet article, nous avons abordé les points clés à utiliser et à personnaliser FindBugs dans un projet Java.

Comme vous pouvez le constater, FindBugs est un outil d’analyse statique puissant et simple qui permet de détecter les failles de qualité potentielles de votre système, s’il est réglé et utilisé correctement.

Enfin, il convient de mentionner que FindBugs peut également être exécuté dans le cadre d’un outil de révision de code automatique continu et distinct tel que Sputnik , ce qui peut être très utile pour donner aux rapports beaucoup plus de visibilité .

L’exemple de code utilisé pour l’analyse statique est disponible à l’adresse over sur Github .