Info sur JMRI:
Outils de Developpement
Structure
Techniqueser Standards
Comment Faire
Infos Fonctionnelles
Contexte Infos

JMRI: Analyse statique avec FindBugs

FindBugs est un outil qui peut examiner le code pour trouver d'éventuels problèmes. Il fait un "analyse statique", en regardant à travers le code pour trouver certaines "mauvaises idées connues ": Les choses qui sont susceptibles de causer des problèmes occasionnels/intermittents, mauvaise performance, etc Parce que ces genre de problèmes sont difficile à trouver avec les tests, les trouver par l'inspection est souvent la seule approche réaliste. Disposer d'un outil qui peut faire les inspections automatiquement, afin qu'elles puissent se faire à chaque fois que quelque chose est changé, protège le code d'une dégradation lente sans que quelqu'un le remarque jusqu'à ce qu'il soit trop tard.

Pour plus d'informations sur FindBugs, voir la page d'accueil FindBugs .

Nous exécutons sous forme d'une routine FindBugs comme une partie de notre processus continue d'intégration. Vous pouvez voir les résultats des plus récentes constructions en ligne ici.

Si findBugs trouve une erreur positive, un bug qui n'est pas réellemnt un bug, vous pouvez l'éteindre avec une annotation tels que:


@edu.umd.cs.findbugs.annotations.SuppressWarnings("FE_FLOATING_POINT_EQUALITY","OK pour comparer les flottantess, car méme les plus infimes différences 
devraient déclencher les mises à jour")
Le second argument "justification" est optionnel, mais hautement recommandé. Expliquer pourquoi vous avez ajouté cette annotation pour supprimer un message aidera Celui qui viendra après vous et tentera de comprendre le code. Il aidera également à vous assurer que vous comprenez correctement la cause du rapport du bugg sous-jacent: Parfois ce qui semble un faux positif ne l'est pas vraiment.

si vous avez besoin de mettre plus d'un type de message dans une annotation, utilisez la syntaxe en tableau:


@edu.umd.cs.findbugs.annotations.SuppressWarnings("{type1},{type2}","Pourquoi les deux sont nécessaire")
Les annotations de bug peuvent aider à mieux comprendre votre code. Parfois, ils vont lui donner suffisamment de compréhension exemple: quand une variable peut étre nulle, que ça ne va plus faire de fausses erreurs positives. Pour plus d'information sur ceci, voir la page des annotations Findbugs . Elle peut étre utile pour marquer les classes avec une des annotations suivantes de telle sorte que FindBugs fasse un bon travail de raisonnement à ce sujet:
  • edu.umd.cs.findbugs.annotations.CheckForNull - une variable ou un paramètre peut avoir une valeur nulle ,donc toutes les utilisations devraient convenablement gérer cela.
  • edu.umd.cs.findbugs.annotations.CheckReturnValue - cette méthode n'a aucun effet secondaire, il n'y a donc pas lieu de l'appeler sans vérifier que c'est la valeur de retour
  • net.jcip.annotations.Immutable - Un objet de cette classe ne peut pas étre modifié après sa création. Cela permet à la fois la une meilleure vérification de la logique, et de simplifier également l'utilisation par vos collègues, il est donc bon de marquer les classes avec cette propriété.
  • net.jcip.annotations.NotThreadSafe - une classe qui n'est pas un lien de sécurité,ne devrait donc pas étre vérifiée pour les problèmes de simultanéité. Souvent utilisé pour les classes Swing , mais il faut noter que certains composants Swing (par exemple, les fenétres moniteur, les classes avec les auditeurs) ne doivent pas accepter l'entrée d'autres liens.
  • net.jcip.annotations.ThreadSafe - Les classes qui ne doivent étre utilisables pour de multiples liens. FindBugs l'assumes généralement, mais il est bon de le mettre sur une classe qui est destinée à étre un lien de sécurité comme un rappel pour les développeurs futurs. Pour de plus ample informations au sujet de ces annotations, svp voir la page dans l'API Concurrency.

    Simon White a ajouté le support FindBugs à notre Chaine de construction basée sur Ant pendant le développement du JMRI 2.5.5. Sa note sur ceci suit...

    Comme demande de fonctionnalité par 1716873, j'ai ajouté une tâche Ant pour exécuter FindBugs. Ceci va produire un rapport en HTML dans le méme emplacement que le JMRI jar (c'est à dire le plus haut niveau du répertoire projet ). Notez la nouvelle tâche exécute en premier ant dist parce FindBugs examine le dossier jmri.jar. Pour exécuter la tâche:

    • Installer Findbugs (pour moi j'ai mis cela dans C:/FindBugs-1.3.8)
    • copie FindBugs-ant.jar à partir du répertoire lib FindBugs dans le répertoire java/lib
    • soit exécuter
      ant-Dfindbugs.home = C: / FindBugs-1.3.8 FindBugs (remplaçant le paramètre de votre emplacement d'installation)
      

      ou modifier le build.xml et modifier le paramètre commenté de findbugs.home à votre emplacement d'installation, puis exécutez

      ant FindBugs
      
    Sur mon ancienne machine il faut environ 20 minutes, mais votre durée peut varier.

    Notez que dans le build.xml j'ai mis le réglage maximal de mémoire-Xmx pour le tâche FindBugs pour 1024m. Si votre système a plus de mémoire, la stimuler peut accélérer les choses.

    L'exécution de ceci sur JMRI 2.5.4 donné les résultats suivants:

    Avertissements Mauvaise pratique164
    Avertissements Correction77
    Avertissements expérimentaux7
    Avertissements vulnérabilité code malveillant221
    Avertissements multithread exactitude90
    Avertissements Performance459
    Avertissements Louche304
    Total1322

    Beaucoup de travail a été fait dans JMRI pendant le cycle de libération 2,12 pour amener le compteur de bug à zéro. Le serveur d'intégration continue a fait fonctionner FindBugs deux fois par jour, ce qui permet aux développeurs de voir les résultats de leur codage sans avoir à exécuter findbugs eux-mémes.

    Si vous regardez le code dans le dépôt Subversion JMRI, s'il vous plaît vérifier le serveur CI et assurez-vous que vos modifications ne vont pas introduire de nouvelles erreurs.