J'ai vu une publication disant que PVS avait appris à analyser sous Linux, et j'ai décidé d'essayer sur mes projets. Voici ce que cela a donné.
Contenu
Support réactif
J'ai demandĂ© une clĂ© d'essai, et je l'ai reçue le mĂȘme jour.
Documentation assez claire
J'ai réussi à lancer l'analyseur sans trop de problÚmes. Il y a aussi de l'aide pour les commandes en console (bien qu'il y ait des remarques à ce sujet, voir la section ).
Possibilité d'analyse multithread
L'analyseur a une option « standard » -j, permettant d'effectuer l'analyse en parallÚle sur plusieurs tùches. Cela fait gagner beaucoup de temps.
Bonne visualisation
De nombreux formats de sortie, du texte Ă une petite interface web. .
Intégration facile dans la compilation
Toute la documentation est disponible sur leur site, je dirai juste que si votre projet est compilé avec CMake, c'est trÚs simple.
Bonnes descriptions des diagnostics
Si vous générez la sortie en mode fullhtml, chaque message a un lien vers une description des diagnostics, avec des explications, des exemples de code et des liens supplémentaires.
Incompréhension de la langue C++ par l'analyseur
Malheureusement, PVS fait parfois des erreurs de syntaxe, générant des messages faux positifs pour un code parfaitement correct.
Par exemple, il y a une fonction qui retourne void:
template <typename T>
auto copy (const void *source, void *destination)
->
std::enable_if_t
<
std::is_copy_constructible<T>::value
>
{
new (destination) T(*static_cast<const T *>(source));
}Oui, le mot-clé auto peut signifier void, c'est justement son but. auto. Mais PVS a généré les messages suivants :
dynamic_tuple_management.hpp:29:1: erreur : V591 Fonction non-void doit retourner une valeur.
dynamic_tuple_management.hpp:29:1: erreur : V2542 Fonction avec un type de retour non-void doit retourner une valeur depuis tous les chemins de sortie.Site trĂšs lent
Oui, dans l'interface web, à cÎté de chaque message, il y a un lien vers la description de diagnostic correspondant avec des exemples. Mais en cliquant sur le lien, il faut attendre assez longtemps, et parfois il y a aussi un .
Langue
Toutes les descriptions sont disponibles en russe, c'est excellent. Mais les liens des rapports mÚnent toujours à la version anglaise. Ce serait bien d'avoir la possibilité de changer de langue pour consulter les diagnostics directement en russe. Je n'ai pas trouvé cette option dans l'interface.
Il est peu pratique de travailler avec les niveaux de diagnostic via la console.
Commençons par le fait que les deux outils utilisés (ce sont pvs-studio-analyzer et plog-converter) ont des formats de spécification de diagnostic différents.
La documentation pour pvs-studio-analyzer indique :
-a [MODE], --analysis-mode [MODE]
MODE définit le type d'avertissements :
1 - erreurs 64 bits ;
2 - réservé ;
4 - Analyse Générale ;
8 - Micro-optimisations ;
16 - Demandes Spécifiques des Clients ;
32 - MISRA.
Les modes peuvent ĂȘtre combinĂ©s en additionnant les valeurs
Par dĂ©faut : 4J'ai longtemps essayĂ© de comprendre oĂč il fallait ajouter («adding the values») les clĂ©s. J'ai essayĂ© de les Ă©numĂ©rer sĂ©parĂ©es par des virgules :
pvs-studio-analyzer analyze ... -a 1,4,16J'ai essayé de spécifier la clé plusieurs fois :
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Et ce n'est qu'aprÚs que j'ai réalisé qu'il s'agissait de masques binaires ! Il faut donc additionner, pas ajouter les valeurs. Par exemple, pour obtenir des diagnostics globaux, des diagnostics sur les microoptimisations et MISRA, il faut les additionner (4 + 8 + 32 = 44) :
pvs-studio-analyzer analyze ... -a 44L'utilisation de masques binaires dans les interfaces utilisateur est généralement de mauvais goût. On aurait pu tout additionner en interne et laisser à l'utilisateur un ensemble de cases à cocher.
De plus, il existe un autre utilitaire plog-converter, qui génÚre des informations lisibles sur l'analyse statique. Il a ses propres particularités.
La documentation du programme plog-converter indique :
-a, --analyzer Spécifie l'analyseur(s) et le(s) niveau(x) à utiliser pour le filtrage, c'est-à -dire
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Par défaut : GA:1,2Ici, il y a des niveaux qui n'existaient nulle part auparavant, et je n'ai rien trouvé à leur sujet dans la documentation.
En général, c'est flou. C'est pourquoi j'ai tout réglé au maximum.
Une multitude de messages inutiles sur Catch
Dans deux des trois projets que j'ai analysés, la bibliothÚque de tests unitaires est utilisée. Et une grande partie des messages (!!! 90 sur 138 dans l'un et 297 sur 344 dans l'autre !!!) apparaissent comme suit :

Ne prend pas en compte le multi-threading
Beaucoup de faux positifs concernant des variables prétendument inchangées ou des boucles infinies, alors que ces variables sont manipulées à partir de différents threads, et si ce n'était pas le cas, les tests unitaires échoueraient.

Cependant, un analyseur statique peut-il vraiment considérer cela ? Je ne sais pas.
PVS n'a trouvé aucune véritable erreur dans mes projets ouverts et , ainsi que dans un projet de travail que je ne peux, pour des raisons évidentes, montrer. Cependant, il convient de noter que certains défauts ont déjà été détectés et corrigés auparavant à l'aide de et .
L'impression gĂ©nĂ©rale de tous ces analyseurs est Ă peu prĂšs la mĂȘme : oui, ils attrapent quelque chose, parfois mĂȘme quelque chose d'important, mais en gros, un compilateur suffit.
Il se peut (et cela me fait plaisir de le penser) que notre équipe utilise des pratiques de développement logiciel qui permettent de générer un minimum de code de mauvaise qualité. Mieux vaut ne pas créer de problÚmes que de les surmonter héroïquement.
C'est pourquoi je me permets de donner quelques conseils sur la maniÚre d'écrire en C++ pour ne pas tirer dans le pied de quelqu'un et ne pas se prendre des coups sur le front.
Utilisez le diagnostic du compilateur au maximum
Notre équipe utilise (et vous conseille) les options de compilation suivantes :
-Werror
-Wall
-Wextra
-Wpedantic
-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promoIntégrez-les dans votre projet, vous apprendrez beaucoup de nouveau sur votre code.
Respectez la norme
Essayez de ne pas utiliser de choses dépendantes de la plateforme s'il existe des analogues standard, et si vous ne pouvez vraiment pas vous en passer, enveloppez-les dans des blocs spéciaux sous des macros (ou autrement) et ne laissez simplement pas compiler votre code dans des conditions non prises en charge.
Adhérez à la sémantique standard des opérations
L'addition doit ĂȘtre une addition, la multiplication - une multiplication, l'appel de fonction - un appel de fonction, la copie doit copier, le dĂ©placement - dĂ©placer, le conteneur doit ĂȘtre itĂ©rable, l'itĂ©rateur doit avoir une progression ++ et une dĂ©rĂ©fĂ©rencement *. Et ainsi de suite, ainsi de suite.
Je pense que l'idĂ©e est claire. Il existe des conventions Ă©tablies qui ne sont pas obligatoires Ă respecter, mais que tous les utilisateurs et lecteurs de votre code s'attendent Ă voir. Ne tentez pas de berner les autres, sinon c'est vous-mĂȘme que vous bernez.
Ăcrivez un code compatible
En premier lieu, je pense Ă la bibliothĂšque standard. Il est trĂšs souhaitable que les interfaces de vos classes et fonctions puissent ĂȘtre utilisĂ©es avec les bibliothĂšques standard et d'autres bibliothĂšques (par exemple, Boost).
N'hésitez pas à consulter les interfaces STL et Boost. à de rares exceptions prÚs, vous y trouverez un bon exemple à suivre.
Utilisez au maximum les outils ouverts
Pour la mĂȘme analyse statique, il existe au moins deux outils gratuits et ouverts qui se connectent « en un clic » Ă tout projet utilisant le systĂšme de construction CMake.
.
Enfin, je souligne que je n'encourage pas à ne pas utiliser PVS ou d'autres analyseurs statiques. Mais je vous incite à réfléchir à la raison pour laquelle l'analyseur statique trouve constamment des erreurs significatives dans votre code.
Ceci n'est qu'une conséquence. Il faut chercher et éliminer la cause.
Source : habr.com
