Encore une fois, l'analyseur PVS-Studio s'est avéré être plus attentif qu'une personne

Prenez un bug

En étudiant les avertissements de l'analyseur PVS-Studio dans le processus de vérification de divers projets ouverts, nous nous assurons encore et encore de l'utilité de cet outil. L'analyseur de code est incroyablement attentif et jamais fatigué. Il indique des erreurs qui disparaissent même avec un examen attentif du code. Prenons un autre cas de ce genre.

La dernière fois que j'ai écrit une note similaire , j'étudiais le code source du projet StarEngine: 2D Game Engine. L'analyseur a maintenant montré sa supériorité sur moi lors de la vérification du framework Qt.

La dernière fois que nous avons testé le framework Qt en 2014. Beaucoup de temps s'est écoulé, le projet a changé et de nombreux nouveaux diagnostics sont apparus dans l'analyseur PVS-Studio. Il est donc tout à fait possible d'écrire un autre article, ce que j'ai fait.

En écrivant des exemples intéressants d'erreurs, je suis tombé sur ce code:

QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing) // <= V616 .... } 

PVS-Studio a émis un avertissement pour ce code:

V616 CWE-480 La constante nommée 'CursorShowing' avec la valeur 0 est utilisée dans l'opération au niveau du bit. qwindowscursor.cpp 669

Une version instable de PVS-Studio a été utilisée pour la vérification, donc ma foi en l'analyseur a faibli. "Oh, quelque chose que nous avons cassé dans les mécanismes de traitement des transferts sans nom", soupirai-je, et j'ai écrit ce cas au bugtracker comme une erreur conduisant à un faux positif.

J'étais absolument sûr que l'analyseur s'était trompé. Après tout, avec seulement quelques lignes au-dessus, il est écrit que la constante CursorShowing est 1.

En même temps, j'ai essayé de faire attention! J'ai parcouru le code plusieurs fois pour m'assurer que l'analyseur est incorrect. J'ai conçu ce morceau de code et le message correspondant comme une erreur dans le bugtracker.

J'ai fait un examen approfondi de ce petit morceau de code et j'ai tout de même foiré. L'analyseur a raison, pas la personne.

Dans une étude détaillée de la situation, il s'est avéré que la constante nommée cursorShowing est déclarée ci - dessus et la constante CursorShowing est utilisée dans la condition. La différence n'est que dans la première lettre! À un endroit, il est en minuscules et dans une autre capitale.

Pourquoi le code se compile-t-il? Parce que la constante CursorShowing existe également. Voici son annonce:

 class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... } 

Comme vous pouvez le voir, la constante CursorShowing est 0. Par conséquent, l'analyseur PVS-Studio a tout à fait raison de dire que la condition (cursorInfo.flags & CursorShowing) n'a pas de sens. La condition est toujours fausse.

L'analyseur a trouvé une merveilleuse faute de frappe. Aimez l'analyse de code statique! :)


Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien vers la traduction: Andrey Karpov. Une fois de plus, l'analyseur PVS-Studio s'est révélé plus attentif qu'une personne .

Source: https://habr.com/ru/post/fr423771/


All Articles