Files
JIMRI/help/fr/html/doc/Technical/FindBugs.shtml
T
2026-06-17 14:00:51 +02:00

287 lines
15 KiB
Plaintext

<!DOCTYPE html>
<html lang="fr">
<!-- Updated by Herv&#233; BLOREC <bzh56420@yahoo.fr> on 2016-07-10 -->
<head>
<title>JMRI: Analyse statique avec SpotBugs</title>
<meta name="author" content="Bob Jacobsen">
<meta name="keywords" content="JMRI technical code">
<!--#include virtual="/help/fr/parts/Style.shtml" -->
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<!--#include virtual="/help/fr/parts/Header_fr.shtml" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>JMRI: Analyse statique avec SpotBugs</h1>
SpotBugs 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.
<p>Pour plus d'informations sur SpotBugs, voir <a href="https://spotbugs.github.io">la page
d'accueil SpotBugs</a> .</p>
<p>Nous exécutons sous forme d'une routine SpotBugs comme une partie de notre <a href=
"ContinuousIntegration.shtml">processus continue d'intégration</a>. Vous pouvez voir les
résultats des plus récentes constructions en ligne <a href=
"https://jmri.ci.cloudbees.com/job/Development/job/FindBugs/lastBuild/">ici</a>.</p>
<p>Si SpotBugs trouve une erreur positive, un bug qui n'est pas réellemnt un bug, vous pouvez
l'éteindre avec une annotation tels que:</p>
<pre><code>
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings("FE_FLOATING_POINT_EQUALITY","OK to compare floats, as even tiny differences should
trigger update")
</code></pre>Bien que Java lui-même estime qu'il est facultatif, nous avons besoin du deuxième
argument "justification". Expliquer pourquoi vous avez ajouté cette annotation pour supprimer un
message aidera celui qui vient après vous et tente de comprendre le code. Il aidera également à
vous assurer que vous comprenez bien la cause du rapport de bogue sous-jacent: Parfois, ce qui
semble un faux positif ne l'est vraiment pas. Les Annotations sans une clause de justification
seront périodiquement éliminées.
<p>Si vous avez besoin de mettre plus d'un type de message dans une annotation, utilisez la
syntaxe de tableau:</p>
<pre><code>
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings("{type1},{type2}","why both are needed")
</code></pre>
<p>Il y a ausi des annotations Java et FingBugs qui peuvent vous aider à mieux comprendre
votre code. Parfois, ils vont lui donner suffisamment de compréhension, par exemple: quand
une variable peut être nulle, que ça ne va plus faire des erreurs de faux positifs. Pour en
savoir plus, voir les <a href=
"https://docs.oracle.com/javase/tutorial/java/annotations/">Annotations Java</a> et les
<a href="http://findbugs.sourceforge.net/manual/annotations.html">pages d'annotations
SpotBugs</a> .</p>
<p>Les bases d'annotations sont couverts dans un <a href=
"https://docs.oracle.com/javase/tutorial/java/annotations/">Tutoriel annotation Java</a>.</p>
<p>Il peut être utile de marquer le code avec une des annotaions suivantes de telle sorte que
SpotBugs fasse un bon travail de raisonnement à ce sujet:</p>
<ul>
<li><a href=
"http://findbugs.sourceforge.net/manual/annotations.html"><code>javax.annotation.Nonnull</code></a>
- L'element annoté ne doit pas être nul. Les champs annotés ne doivent pas être nuls après
la construction terminée. Les méthodes annotées doivent avoir des valeurs non-nulles
retournées Utiliser javax.annotation.ParametersAreNonnullByDefault pour définir pour toute
une classe. Préférer l'usage de <code>CheckForNull</code>.</li>
<li><a href=
"http://findbugs.sourceforge.net/manual/annotations.html"><code>javax.annotation.CheckForNull</code></a>
- La variable, paramètre ou valeur annotée peut avoir une valeur nulle, de sorte que tous
les utilisateurs devraient les traiter convenablement. S'il vous plaît mettre cela dans des
définitions de méthode pour signaler que la valeur de retournée doit être vérifié pour être
nulle</li>
<li><a href=
"http://findbugs.sourceforge.net/manual/annotations.html"><code>edu.umd.cs.findbugs.annotations.OverrideMustInvoke</code></a>
Utilisé pour annoter une méthode qui, si surchargée, doit (ou devrait) être super invoquée
dans le méthode redéfinie. Des exemples de tels procédés comprennent la finalisation () et
clone (). L'argument de la méthode indique quand la super invocation doit se produire: à
tout moment ( ANYTIME ), au début de la méthode dérogatoire ( FIRST ), ou à la fin de la
méthode dérogatoire ( LAST ), par défaut à tout moment, par exemple
<code>@OverrideMustInvoke ( valeur = ANYTIME )</code></li>
<li><a href=
"http://findbugs.sourceforge.net/manual/annotations.html"><code>javax.annotation.CheckReturnValue</code></a>
- annoter une méthode pour dire QUE la méthode n'a pas d'effets secondaires, donc il n'y a
aucun point en appelant sans vérifier sa valeur de retour</li>
<li><a href=
"http://jcip.net/annotations/doc/net/jcip/annotations/Immutable.html"><code>net.jcip.annotations.Immutable</code></a>
- Un objet de cettte classe ne peut pas être changé après avoir été créé. Ceci permet à la
fois une meilleure vérification de la logique et aussi simplifie l'usage pour vos
collègues, aussi il est bon de créer des classes qui ont cette propriété et de les
annoter.</li>
<li><a href=
"http://jcip.net/annotations/doc/net/jcip/annotations/ThreadSafe.html"><code>net.jcip.annotations.ThreadSafe</code></a>
- classes qui doivent être utilisables pour plusieurs threads.Fidbugs l'assume
généralement, mais il es bon de de le mettre dans une classe qui est prévue pour être
thread-safe comme un rappel pour de futures développeurs.</li>
</ul>
Pour avoir plus d'information à propos de ces annotations, SVP voir la <a href=
"http://jcip.net/annotations/doc/index.html">Page dans l'API Concurrency</a>.
<p>Nous n'utilisons pas ces annotations:</p>
<ul>
<li><a href=
"http://findbugs.sourceforge.net/manual/annotations.html"><code>javax.annotation.Nullable</code></a>
- cela ne signifie pas vraiment ce que les gens pensent qu'il fait, comme SpotBugs ne
vérifie pas vraiment pas quelque chose quand il est utilisé. De la documentation: SpotBugs
traitera les articles annotés comme s'ils n'avaient aucune annotation. Dans la pratique,
cette annotation est utile que pour des raisons impérieuses d'une annotation globale non
nulle. Utilisez javax.annotation.ParametersAreNullableByDefault pour le définir comme une
classe entière. Preférez l'usage de <code>CheckForNull</code>.</li>
</ul>
<h3>Suppression Avertissements</h3>
Nous avons désactivé les SpotBugs de routine de contrôle de certains types de conditions:
<dl>
<dt><a href=
"http://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#ri-class-implements-same-interface-as-superclass-ri-redundant-interfaces">
RI_REDUNDANT_INTERFACES</a>
</dt>
<dd>Ce drapeaux au cas où une classe implémente une interface, et aussi hérite d'une
superclasse qui implémente déjà cette interface. Ceci est redondant et inutile, mais il ne
peut pas provoquer de dysfonctionnement du code. Nous avons assez d'entre eux que nousavons
éteint l'avertissement, et nous y reviendrons plus tard.</dd>
<dt><a href=
"http://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#sic-could-be-refactored-into-a-named-static-inner-class-sic-inner-should-be-static-anon">
SIC_INNER_SHOULD_BE_STATIC_ANON</a> ,</dt>
<dt><a href=
"http://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#sic-could-be-refactored-into-a-static-inner-class-sic-inner-should-be-static-needs-this">
SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS</a>
</dt>
<dd>Static opposé à non-static, les classes internes ( classes définies au cœur d'autres
classes ) prennent moins de place parce qu'ils ne maintiennent pas de références à l'objet
contenant. Cet avertissement suggère de déplacer une classe anonyme interne (définie dans
la ligne du code) à une classe régulière (non définie en ligne) ainsi elles peuvent être
statiques. Bien que ce soit probablement une petite amélioration, c'est un peu de travail
pour une petite amélioration. Nous avons assez de ceux où nous avons coupé les
avertissements, et et nous y reviendront plus tard.</dd>
<dt><a href=
"http://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#sic-could-be-refactored-into-a-named-static-inner-class-sic-inner-should-be-static-anon">
SIC_INNER_SHOULD_BE_STATIC_ANON</a>, <a href=
"http://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#sic-could-be-refactored-into-a-static-inner-class-sic-inner-should-be-static-needs-this">
SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS</a></dt>
<dd>Statique, comme opposé à non-statique, Les inner classes ( classes définies au sein
d'autres classes ) prennent peu de place parce qu'lles ne permettent pas de maintenir les
références à l'objet contenant. Cet avertissement suggère de déplacer une classe interne
anonyme ( définie dans la ligne du code ) vers une classe régulière ( non défini pas en
ligne ) ainsi elle peut être rendue statique.Bien que ce soit probablement une petite
amélioration, c'est un peu de travail pour une petite amélioration. Nous en avons assez
aussi nous avons eteint l'avertissement, et il reviendra un peu plus tard.</dd>
<dt><a href=
"http://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#pzla-consider-returning-a-zero-length-array-rather-than-null-pzla-prefer-zero-length-arrays">
PZLA_PREFER_ZERO_LENGTH_ARRAYS</a>
</dt>
<dd>Que doit faire une méthode qui retourne un tableau de valeurs quand il n'y en a pas?
Retourner "Nulle", opposé à un tableau vides, exige tout le code d'appel pour traiter un
cas particulier. Dans beaucoup de cas, retourner un tableau vide rend le code plus simple.
Mais pour du code existant, la simplification est marginale. Comme cela est un problème de
conception, mais il surgit souvent nous avons supprimé ceci pour nous focaliser maintenant
sur des problèmes plus presssants</dd>
<dt>Code Malveillant</dt>
<dd>C'est une classe d'avertissement centrée autour d'une idée que les données et les
méthodes de codes ne doivent pas être trop visibles spécialement en statique. Ceci est
vrai, mais JMRI n'est pas une bibliothèque trempée qui est publiée dans un monde de gens
qui essaient de le briser, aussi ces changements ne sont pas une grande priorité.</dd>
<dt>Nm</dt>
<dd>La convention est que les noms de cette clase démarre avec une lettre capitale et les
noms de procédé ( donné et code ) avec une lettre minuscule.</dd>
<dt>Se,SvVI</dt>
<dd>Cette une grande classe d'averissementss associées avec la sérialisation Java. JMRI
n'utilise pas la sérialisation et il est peu probable qu'il le fasse à l'avenir, de sorte
que nous supprimons ces derniers pour élever la qualité moyenne des avertissements
émis.</dd>
</dl>
<h3>Arrière Plan</h3>
<p>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...</p>
<p>Comme demande de fonctionnalité par 1716873, j'ai ajouté une tâche Ant pour exécuter
SpotBugs. 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 SpotBugs examine le dossier jmri.jar.</p>
Pour exécuter la tâche:
<ul>
<li>Installer SpotBugs ( pour moi j'ai mis cela dans C:/SpotBugs-3.1.1 )</li>
<li>soit exécuter <code>ant-Dspotbugs.home=C:/SpotBugs-4.2.3 spotbugs ( remplaéant le
paramètre de votre emplacement d'installation )</code> ou modifier le build.xml et modifier
le paramètre commenté de spotbugs.home à votre emplacement d'installation, puis exécutez
<code>ant spotbugs</code></li>
</ul>
Sur mon ancienne machine il faut environ 20 minutes, mais votre durée peut varier.
<p>Notez que dans le build.xml j'ai mis le réglage maximal de mémoire-Xmx pour le tâche
SpotBugs pour 1024m. Si votre système a plus de mémoire, la stimuler peut accélérer les
choses.</p>
<p>L'exécution de ceci sur JMRI 2.5.4 donné les résultats suivants:</p>
<table border="1" summary="">
<tr>
<td>Avertissements Mauvaise pratique</td>
<td>164</td>
</tr>
<tr>
<td>Avertissements Correction</td>
<td>77</td>
</tr>
<tr>
<td>Avertissements expérimentaux</td>
<td>7</td>
</tr>
<tr>
<td>Avertissements vulnérabilité code malveillant</td>
<td>221</td>
</tr>
<tr>
<td>Avertissements multithread exactitude</td>
<td>90</td>
</tr>
<tr>
<td>Avertissements Performance</td>
<td>459</td>
</tr>
<tr>
<td>Avertissements Louche</td>
<td>304</td>
</tr>
<tr>
<th>Total</th>
<th>1322</th>
</tr>
</table>
<p>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 <a href="ContinuousIntegration.shtml">serveur d'intégration
continue a fait</a> fonctionner SpotBugs deux fois par jour, ce qui permet aux développeurs
de voir les résultats de leur codage sans avoir à exécuter spotbugs eux-mémes.</p>
<p>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.</p>
<!--#include virtual="/help/fr/parts/Footer_fr.shtml" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
<script src="/js/help.js"></script>
</body>
</html>