De temps en temps, les programmeurs qui commencent à se familiariser avec l'analyseur de code PVS-Studio demandent: "Existe-t-il une liste d'avertissements qui indiquent avec précision les erreurs?" Il n'y a pas une telle liste pour la raison que des avertissements (faux) sans intérêt dans un projet et dans un autre s'avèrent très importants et utiles. Cependant, commencer à se familiariser avec l'analyseur avec les avertissements les plus intéressants est tout à fait possible. Examinons de plus près ce sujet.
L'ennui, c'est que lors des premiers lancements, le programmeur reçoit en règle générale un grand nombre d'avertissements dans lesquels il «se noie». Naturellement, il a envie de se familiariser avec les avertissements les plus intéressants afin de comprendre s'il doit passer tout ce temps. Très bien, voici trois étapes simples qui vous permettront de vous familiariser avec les points positifs les plus intéressants.
Étape 1
Désactivez tous les types d'alertes à l'exception de général (GA). Une erreur courante: activez toutes sortes d'avertissements. Pour les utilisateurs inexpérimentés, il semble que plus vous l'allumez, mieux c'est. Ce n'est pas le cas! Il existe des ensembles de diagnostics, tels que les contrôles 64 bits et les règles MISRA, qui ne doivent être utilisés qu'avec une idée claire de ce que c'est et de la façon de les utiliser. Par exemple, en activant les diagnostics MISRA pour un programme d'application ordinaire, vous vous noyerez dans des dizaines, des milliers ou des centaines de milliers de messages comme:
- V2506 . Misra. Une fonction doit avoir un seul point de sortie Ă la fin.
- V2507 . Misra. Le corps d'une instruction loop \ conditional doit être placé entre accolades.
- V2523 . Misra. Toutes les constantes entières de type non signé doivent avoir le suffixe «u» ou «U».
La plupart des avertissements MISRA n'indiquent pas d'erreurs, mais le code sent. Naturellement, une personne commence à poser des questions. Comment trouver quelque chose d'intéressant dans la masse de tous ces avertissements? Diagnostics sous quels numéros doit-il regarder? Ce ne sont pas les bonnes questions. Il vous suffit de désactiver le kit MISRA. Il s'agit de la norme pour écrire du code de qualité pour les appareils intégrés. L'essence de la norme: rendre le code extrêmement simple et compréhensible. N'essayez pas de l'appliquer là où il est inapproprié.
Remarque Oui, il existe des règles dans la norme MISRA visant à identifier les erreurs réelles. Exemple:
V2538 - La valeur de la variable non initialisée ne doit pas être utilisée. Mais n'ayez pas peur de désactiver la norme MISRA. Vous ne perdrez rien. De vraies erreurs seront toujours trouvées dans les diagnostics à usage général (GA). Par exemple, une variable non initialisée sera trouvée grâce au diagnostic
V614 .
Étape 2
Tout analyseur statique génère des faux positifs lors des premiers démarrages et nécessite une certaine configuration. Rien ne peut être fait avec cela, mais ce n'est pas aussi effrayant que cela puisse paraître. Même une simple configuration rapide vous permet de supprimer la plupart des faux avertissements et de commencer à vous familiariser avec un rapport déjà tout à fait adéquat. Nous n'en parlerons pas plus en détail, car j'en ai souvent parlé, par exemple, dans cet article: "
Caractéristiques de l'analyseur PVS-Studio utilisant l'exemple EFL Core Libraries, 10 à 15% de faux positifs ."
Passez un peu de temps à désactiver les avertissements explicitement non pertinents et à combattre les faux positifs dus aux macros. Les macros sont généralement la principale source de faux positifs, car un avertissement apparaît chaque fois qu'une macro défaillante est utilisée. Pour supprimer les avertissements dans les macros, un type spécial de commentaires peut être placé à côté de leur déclaration. Le format de rédaction des commentaires est décrit plus en détail dans la
documentation .
Oui, la configuration initiale prendra un peu de temps, mais améliorera considérablement la perception du rapport en éliminant le bruit gênant. Prenez un peu de temps pour cela. En cas de difficultés ou de questions, nous sommes toujours prêts à vous aider et à suggérer la meilleure façon de configurer l'analyseur. N'hésitez pas à nous
écrire et à nous poser des questions.
Étape 3
Commencez à apprendre les avertissements à partir du niveau 1. Et alors seulement, regardez 2 et 3. Les niveaux d'avertissement ne sont rien de plus que la fiabilité de l'avertissement. Les avertissements de niveau 1 sont plus susceptibles d'indiquer une véritable erreur que 2.
On peut dire qu'en choisissant «regarder niveau 1», vous appuyez sur le bouton «regarder les erreurs les plus intéressantes».
La classification des alertes PVS-Studio par niveaux est décrite plus en détail dans l'article «
Comment et pourquoi les analyseurs statiques traitent les faux positifs ».
Alors pourquoi n'y a-t-il toujours pas de liste?
Cependant, une idée avec une liste des avertissements les plus utiles peut encore sembler raisonnable. Permettez-moi de montrer par un exemple pratique que l'utilité du diagnostic est relative et dépend du projet.
Considérez l'avertissement
V550 . Un avertissement révèle une erreur potentielle due au fait que l'opérateur == ou! = Est utilisé pour comparer les nombres à virgule flottante.
La plupart des développeurs avec qui j'ai parlé croient que ce diagnostic est de peu d'utilité et le désactivent, car tous les points positifs de leur projet sont faux. Et c'est pourquoi ce diagnostic est peu fiable et se situe au 3ème niveau.
En effet, dans la plupart des applications, les types float / double sont utilisés dans des algorithmes très simples. Et souvent, une comparaison avec une constante est utilisée uniquement pour vérifier si une valeur par défaut est définie ou si elle a changé. Dans ce cas, une vérification précise est tout à fait appropriée. Je vais expliquer cela avec un pseudo-code.
float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value);
Ici, la comparaison
(valeur == 1.0f) est correcte et sûre.
Est-ce à dire que le V550 est un diagnostic sans intérêt? Non. Tout dépend du projet. Je citerai un fragment de l'article "
Comment nous avons testé l'analyse statique sur notre projet de simulateur d'entraînement à la chirurgie endovasculaire ", écrit par l'un de nos utilisateurs.
Donc, ce que l'analyseur statique attire notre attention ici:
V550 Une comparaison étrange et précise: t! = 0. Il est probablement préférable d'utiliser une comparaison avec une précision définie: fabs (A - B)> Epsilon. objectextractpart.cpp 3401
D3DXVECTOR3 N = VectorMultiplication( VectorMultiplication(V-VP, VN), VN); float t = Qsqrt(Scalar(N, N)); if (t!=0) { N/=t; V = V - N * DistPointToSurface(V, VP, N); }
Des erreurs similaires sont répétées assez souvent dans cette bibliothèque. Je ne dirai pas que cela m'a surpris. Déjà auparavant, j'ai rencontré un travail incorrect avec des nombres à virgule flottante dans ce projet. Cependant, il n'y avait pas de ressources pour vérifier systématiquement les sources pour cela. Selon les résultats de la vérification, il est devenu clair que vous devez donner au développeur quelque chose à lire pour élargir ses horizons en termes de travail avec les nombres à virgule flottante. Je lui ai jeté des liens vers quelques bons articles. Regardons le résultat. Il est difficile de dire sans ambiguïté si cette erreur provoque de véritables dysfonctionnements dans le programme. La solution actuelle définit un certain nombre d'exigences pour le réseau polygonal initial des artères, le long desquelles la propagation d'une substance radio-opaque est simulée. Si les exigences ne sont pas remplies, le programme peut se bloquer ou, de toute évidence, fonctionner incorrectement. Certaines de ces exigences sont obtenues analytiquement et d'autres empiriquement. Il est possible que cette deuxième partie des exigences se développe simplement à partir d'un travail incorrect avec des nombres à virgule flottante. Il convient de noter que tous les cas trouvés d'utilisation d'une comparaison exacte des nombres à virgule flottante n'étaient pas une erreur.
Comme vous pouvez le voir, ce qui n'est pas intéressant dans certains projets intéresse d'autres. Il est donc impossible de créer une liste des "plus intéressants".
Remarque Il est possible de définir le niveau d'avertissement à l'aide des paramètres. Par exemple, si vous pensez que les diagnostics du V550 méritent une attention particulière, vous pouvez le déplacer du troisième niveau au premier. Ce type de paramètres est décrit dans la
documentation (voir "Comment définir votre niveau pour des diagnostics spécifiques").
Conclusion
Vous savez maintenant comment commencer à étudier les avertissements de l'analyseur, en considérant les plus intéressants d'entre eux. Et n'oubliez pas de consulter la documentation pour vous familiariser avec la description détaillée des avertissements. Parfois, il arrive que derrière un manque de préjugé, à première vue, l'avertissement est l'enfer. Un exemple de tels diagnostics:
V597 ,
V1026 . Merci de votre attention.

Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien vers la traduction: Andrey Karpov.
Comment vérifier rapidement les avertissements intéressants donnés par l'analyseur PVS-Studio pour le code C et C ++?