PVS-Studio pour Visual Studio


Beaucoup de nos articles sont consacrés à tout, mais pas à l'outil PVS-Studio lui-même. Mais nous faisons beaucoup pour que les développeurs utilisent facilement notre outil. Mais c'est précisément ce qui se passe souvent dans les coulisses. J'ai décidé de corriger cette situation et de parler du plugin PVS-Studio pour Visual Studio. Si vous utilisez Visual Studio, cet article est fait pour vous.

Qu'est-ce que l'analyse de code statique et pourquoi est-elle nécessaire


L'analyse de code statique est le processus d'identification des erreurs et des lacunes dans le code source des programmes. L'analyse statique peut être considérée comme un processus automatisé de révision de code. Un examen collaboratif du code est une excellente méthodologie. Mais il présente également un inconvénient important - un coût élevé. Il est nécessaire de rassembler régulièrement plusieurs programmeurs pour revoir le nouveau code ou réexaminer le code après avoir fait des recommandations.

D'une part, je souhaite revoir régulièrement le code. En revanche, c'est trop cher. Le compromis est les outils d'analyse de code statique. Ils traitent inlassablement le code source des programmes et donnent au programmeur des recommandations pour accorder une attention accrue à certaines sections du code. Bien sûr, le programme ne remplace pas un examen complet du code exécuté par une équipe de programmeurs. Cependant, le rapport avantages / prix fait de l'utilisation de l'analyse statique une pratique très utile pour de nombreuses entreprises. Si le lecteur est intéressé par des chiffres précis, je vous propose de vous familiariser avec l'article " PVS-Studio ROI ".

Il existe un grand nombre d'analyseurs de code statique commerciaux et gratuits. Une grande liste d'analyseurs statiques est disponible sur Wikipedia: Liste d'outils pour l'analyse de code statique . La liste des langages pour lesquels existent des analyseurs de code statiques est également assez longue (C, C ++, C #, Java, Ada, Fortran, Perl, Ruby, ...). Naturellement, nous vous parlerons de l'analyseur PVS-Studio .

Le principal avantage de l'analyse statique est la possibilité d'une réduction significative du coût d'élimination des défauts du programme. Plus l'erreur est identifiée tôt, plus le coût de sa correction est faible. Ainsi, selon les données fournies dans le livre de McConnell «Perfect Code», la correction d'une erreur au stade des tests coûtera dix fois plus qu'au stade de la construction (écriture):

Figure 1. Le coût moyen de réparation des défauts en fonction du moment de leur introduction et de leur détection (les données du tableau sont extraites du livre de S. McConnell "Perfect Code").

Figure 1. Le coût moyen de réparation des défauts en fonction du moment de leur introduction et de leur détection (les données du tableau sont extraites du livre de S. McConnell "Perfect Code").

Les outils d'analyse statique vous permettent d'identifier un grand nombre d'erreurs dans la phase de conception, ce qui réduit considérablement le coût de développement de l'ensemble du projet. Par exemple, l'analyseur de code statique PVS-Studio peut démarrer en arrière-plan immédiatement après la compilation, et si une erreur potentielle est détectée, il en informera le programmeur. Plus d'informations sur ce mode seront décrites ci-dessous.

Analyseur de code statique PVS-Studio


PVS-Studio est un analyseur statique qui détecte les erreurs et les vulnérabilités potentielles dans le code source des applications en C, C ++ (les extensions sont également prises en charge: C ++ / CLI et C ++ / CX ), C # et Java sur les plateformes Windows, Linux et macOS. L'analyseur s'intègre parfaitement avec Visual Studio 2010-2019 et IntelliJ IDEA. Dans cet article, nous examinerons de plus près le travail de PVS-Studio pour vérifier le code en C, C ++ et C #. Vous pouvez lire ici comment utiliser PVS-Studio pour tester le code Java dans IntelliJ IDEA.

Après avoir installé PVS-Studio et intégré à Visual Studio, les utilisateurs reçoivent un élément supplémentaire «PVS-Studio» dans le menu principal et une fenêtre pour travailler avec les messages de diagnostic (voir Figure 2).

Figure 2. Les principaux éléments ajoutés par l'analyseur PVS-Studio lors de l'intégration dans Visual Studio.

Figure 2. Les principaux éléments ajoutés par l'analyseur PVS-Studio lors de l'intégration dans Visual Studio.

Paramètres initiaux


L'analyseur est prêt à fonctionner immédiatement après l'installation. Dans la plupart des cas, vous n'avez rien à configurer pour terminer la première exécution. La seule configuration dont vous pourriez avoir besoin au début est l'exclusion des bibliothèques tierces. Après tout, vous ne modifierez toujours rien dans les fichiers source, par exemple, la bibliothèque jpeg, il n'est donc pas nécessaire de le vérifier. De plus, l'exclusion de dossiers supplémentaires réduira le temps d'analyse du projet. Les répertoires exclus de l'analyse sont définis ici: PVS-Studio> Options ...> Ne pas vérifier les fichiers> PathMasks (voir Figure 3).

Figure 3. Modification d'une liste de répertoires que l'analyseur ne vérifiera pas.

Figure 3. Modification d'une liste de répertoires que l'analyseur ne vérifiera pas.

Si l'un des noms spécifiés se trouve dans le chemin d'accès complet du fichier, l'analyse ne sera pas effectuée. Par défaut, les noms de certains répertoires sont déjà inclus dans la liste. Cependant, dans votre projet, le dossier contenant la bibliothèque ZLib peut ne pas s'appeler «zlib», mais, par exemple, «zip_lib». Par conséquent, vous devez modifier cette liste. Pour commencer l'édition, cliquez sur le bouton avec trois points.

Exemples de masques valides pour la liste PathMasks:

  • c: \ Libs \ - tous les fichiers de projet situés dans ce dossier et ses sous-dossiers seront exclus.
  • \ Libs \ ou * \ Libs \ * - tous les fichiers situés dans des répertoires dont le chemin vers lequel contient le sous-dossier Libs seront exclus. Si les caractères "*" ne sont pas spécifiés, ils seront toujours ajoutés automatiquement, donc les deux options d'enregistrement sont les mêmes.
  • Libs ou * Libs * - tous les fichiers contenant un sous-dossier ayant «Libs» comme nom ou un fragment de nom seront exclus. Dans ce cas également, les fichiers contenant des Libs dans le nom seront exclus, par exemple, c: \ project \ mylibs.cpp. Pour éviter toute confusion, nous vous recommandons de toujours utiliser des barres obliques.

En plus d'exclure des dossiers entiers, vous pouvez spécifier des masques pour exclure des fichiers individuels. Pour cela, il existe un paramètre FileNameMasks. Pour plus de détails sur l'utilisation des listes d'exclusion, consultez la documentation: Paramètres: ne pas vérifier les fichiers .

Vérification du projet


Une fois les réglages initiaux terminés, vous pouvez commencer à vérifier le projet. PVS-Studio pour Visual Studio prend en charge la vérification des projets C ++ (.vcxproj) et C # (.csproj). Vous pouvez également essayer immédiatement de vérifier une solution qui contient des projets de ces types dans leur intégralité. Pour ce faire, sélectionnez l'élément de menu Extensions> PVS-Studio> Vérifier> Solution (voir figure 4).

Figure 4. Vérification de la solution à l'aide de l'analyseur PVS-Studio.

Figure 4. Vérification de la solution à l'aide de l'analyseur PVS-Studio.

En cas de difficultés avec la vérification, nous vous recommandons de vous référer à la section " Vous ne pouvez pas vérifier? " De notre site Web. Ce ne sont pas des prises «vérifier que la fiche est branchée». La section décrit les situations typiques avec lesquelles les utilisateurs nous ont contactés et ont suggéré des options d'action.

Utilisation d'une liste de messages de diagnostic


Après vérification, tous les messages de diagnostic seront affichés dans une fenêtre spéciale. Une fenêtre possède de nombreux contrôles. Tous servent à afficher exactement les messages de diagnostic qui intéressent l'utilisateur. Cependant, au début, la fenêtre peut sembler compliquée. Examinons tous les contrôles (voir la figure 5).

Figure 5. Une fenêtre avec des messages de diagnostic.

Figure 5. Une fenêtre avec des messages de diagnostic.

  1. En fait, la fenêtre PVS-Studio.
  2. Menu supplémentaire. Vous permet d'accéder à des options telles que: marquer un avertissement comme faux, masquer les messages, ajouter des fichiers aux exceptions (voir ci-dessous).
  3. Le bouton inclut le message «quelque chose s'est mal passé». Par exemple, vous ne pouvez pas prétraiter l'un des fichiers.
  4. Accédez au message précédent / suivant. Cela ouvre le fichier correspondant et le curseur est placé sur la ligne avec une erreur potentielle. Vous pouvez également toujours sélectionner des diagnostics dans la liste en double-cliquant. Vous pouvez attribuer des raccourcis clavier pour passer au message précédent / suivant. Par défaut, ce sont Alt + '[' et Alt + ']'.
  5. Boutons qui incluent des alertes à différents niveaux. Maintenant, les deux premiers niveaux de diagnostic sont inclus. Dans le même temps, 90 avertissements du premier niveau et 6700 avertissements du deuxième niveau sont affichés dans la fenêtre. Le niveau du message est affiché sur le côté gauche de la fenêtre, sous la forme d'une barre correspondant à la couleur de la barre sur le bouton du niveau correspondant. Pourquoi y a-t-il tant de points positifs? D'où proviennent les 6700 avertissements? Pour démontrer les capacités de l'interface, un ensemble de règles MISRA est inclus, ce qui est contre-indiqué pour les applications ordinaires :).
  6. Ensembles actifs de règles de diagnostic. Général - diagnostics à usage général, optimisation - microoptimisation, diagnostics 64 bits - 64 bits, diagnostics standard MISRA - MISRA C et MISRA C ++. Maintenant, la fenêtre affiche tous les types d'alertes.
  7. Affiche le nombre de messages marqués comme fausses alarmes. Vous pouvez activer / désactiver l'affichage des messages balisés dans les paramètres, PVS-Studio> Options ...> Paramètres spécifiques de l'analyseur> Afficher les fausses alarmes.
  8. Filtres rapides. Par exemple, vous pouvez laisser dans la liste uniquement les messages avec le code V501 et qui se trouvent dans le projet XYZ.
  9. Certains diagnostics suggèrent de prêter attention non pas à une, mais à plusieurs lignes. Dans ce cas, une ellipse apparaît à côté du numéro de ligne. En cliquant dessus avec la souris, vous pouvez voir une liste de lignes et en sélectionner une.

Le tableau avec les messages de diagnostic est divisé dans les colonnes suivantes:

  • Niveau. Niveau de fiabilité que l'erreur est trouvée. 1er niveau (rouge) - les endroits les plus suspects. 3e niveau (jaune) - très probablement une inexactitude mineure dans le code.
  • Astérisque Elle n'a aucun but précis. L'utilisateur peut l'interpréter à sa discrétion. Par exemple, il peut signaler les avertissements les plus intéressants pour une analyse plus approfondie. Une analogie consiste à marquer des lettres avec un astérisque dans un programme de messagerie tel que Thunderbird ou Outlook.
  • Identifiant Numéro de message unique. Cela peut être utile lorsque vous travaillez avec une grande liste. Par exemple, vous pouvez accéder au message avec un numéro spécifique (voir l' élément "Naviguer vers ID ..." dans le menu contextuel ).
  • Code Code de message Si vous cliquez dessus avec la souris, une page avec une description de l'avertissement s'ouvrira.
  • CWE. Identifie un avertissement à l'aide du code CWE (Common Weakness Enumeration). En cliquant sur le lien, vous pouvez voir une description de ce CWE sur le réseau.
  • Misra. Identique à ci-dessus, mais uniquement pour la norme MISRA .
  • Message Le texte du message de diagnostic.
  • Projet Nom du projet (vous pouvez désactiver cette colonne à l'aide du menu contextuel).
  • Fichier Nom de fichier.
  • Ligne Numéro de ligne. Important! Veuillez noter qu'après certaines lignes, il y a des points de suspension. Exemple: "123 (...)". En cliquant sur ce numéro, vous obtiendrez une liste de toutes les lignes de code liées à ce message. Dans ce cas, il est possible d'accéder à chacune des lignes de la liste.

Oui, lire tout cela était fatigant. Cependant, je vous assure qu'en commençant à l'utiliser, vous vous familiarisez rapidement avec l'outil. Et vous appuierez rarement sur quelque chose pour configurer.

Menu contextuel


Ainsi, en double-cliquant sur le message, vous accédez au fragment de code souhaité. En appuyant sur le bouton droit de la souris, un menu contextuel s'ouvre.

Le menu est assez simple et vous ne devez pas surcharger l'article avec une description de chacun des éléments. Si quelque chose n'est pas clair, vous pouvez consulter la documentation.

Cependant, je veux m'attarder sur une caractéristique très utile. N'oubliez pas que dans les paramètres, vous pouvez ajouter des dossiers / fichiers à exclure (voir figure 2). Donc, ajouter quelque chose est beaucoup plus facile qu'il n'y paraît!

Faites attention à l'élément "Ne pas vérifier les fichiers et masquer tous les messages de ...". Lorsque vous cliquez dessus, une liste de chemins peut être ajoutée qui peut être ajoutée à l'exception (voir figure 6).

Figure 6. Exclusion de fichiers de l'analyse.


Figure 6. Exclusion de fichiers de l'analyse.

Vous pouvez sélectionner un seul fichier ou l'un des répertoires. La figure montre que le dossier "SDL2-2.0.9 \ src \ haptic \ windows" est sélectionné. Cela signifie que tous les fichiers de ce dossier et tous les sous-dossiers seront exclus de l'analyse. De plus, tous les messages liés à ces fichiers disparaîtront immédiatement de la liste. Très confortable. Vous n'avez pas besoin de redémarrer l'analyse pour supprimer tous les messages liés au test.

Mode d'analyse incrémentale


L'introduction à PVS-Studio sera incomplète si vous ne parlez pas de l'une des fonctionnalités les plus importantes - l' analyse de code incrémentielle .

Plus l'erreur est détectée tôt, moins il est coûteux de la corriger. Il est idéal de souligner immédiatement les erreurs dans le texte édité du programme. Cependant, c'est techniquement difficile et gourmand en ressources. Par conséquent, PVS-Studio démarre en arrière-plan au moment où le code corrigé a été compilé avec succès. Ainsi, les erreurs sont recherchées dans le code qui vient d'être modifié. Le fait que l'analyse soit en cours peut être jugé par l'icône dans la zone de notification du système.

Lorsqu'une erreur est détectée, une fenêtre contextuelle s'affiche pour vous avertir du danger (voir figure 7).

Figure 7. Un message contextuel indiquant que des endroits suspects ont été trouvés dans les fichiers modifiés.

Figure 7. Un message contextuel indiquant que des endroits suspects ont été trouvés dans les fichiers modifiés.

Si vous cliquez sur l'icône, l'IDE s'ouvrira avec le résultat de la vérification du projet (voir figure 2) et il sera possible d'examiner les fragments de code suspects.

En fait, plutôt que de décrire ce mode, il est plus facile d'essayer de travailler avec lui. Vous écrivez le code comme précédemment. Et si nécessaire, l'analyseur vous dérangera. Essayez-le!

Nous utilisons nous-mêmes constamment ce mode. Oui, nous faisons aussi parfois des erreurs de codage. Et la possibilité de les corriger immédiatement réduit considérablement le temps de détection d'un défaut et la tentative de comprendre pourquoi le programme ne se comporte pas comme prévu. Il est dommage de consacrer 15 à 20 minutes au débogage, puis de trouver une faute de frappe dans l'index. Voici l'un des cas où PVS-Studio a trouvé une erreur dans PVS-Studio juste après son apparition dans le code:

if (in[0] == '\\' && in[1] == '.' && in[1] == '\\') { in += 2; continue; } 

Mais ce sont bien sûr des fleurs. L'analyseur PVS-Studio peut parfois être beaucoup plus utile. Voici l'un des commentaires sur notre analyseur: " Un exemple d'utilisation d'un analyseur statique ." Le texte vous fait réfléchir.

Je résume. L'analyse incrémentale est quelque chose que vous devez absolument essayer. Vous l'aimerez dès que vous trouverez quelques erreurs dans le nouveau code.

Fonctionnalités de PVS-Studio


Soyons brefs. Il est impossible de décrire de manière concise tous les diagnostics disponibles dans PVS-Studio. Une liste complète des diagnostics et leur description détaillée se trouvent dans la documentation: Description des erreurs diagnostiquées . Nous nous limitons à une table dans laquelle les diagnostics sont regroupés par type. Certains diagnostics sont inclus dans plusieurs groupes. Le fait est que la division est très arbitraire. Par exemple, une faute de frappe peut conduire à l'utilisation de mémoire non initialisée. Au contraire, certaines erreurs n'ont pas trouvé de place dans le tableau, elles sont trop spécifiques. Néanmoins, le tableau dans son ensemble donne une idée de la fonctionnalité d'un analyseur de code statique (voir Figure 8).

Figure 8. Fonctionnalités de PVS-Studio.

Figure 8. Fonctionnalités de PVS-Studio.

Comme vous pouvez le voir, l'analyseur se manifeste autant que possible dans des domaines tels que la recherche d'erreurs survenues en raison de fautes de frappe, du copier-coller. Il diagnostique les problèmes liés à la sécurité du code.

Vous pouvez découvrir comment tout cela fonctionne dans la pratique en consultant la base de données des erreurs . Nous collectons dans cette base de données toutes les erreurs que nous avons constatées en vérifiant divers projets Open-Source.

SAST


PVS-Studio est un outil de test statique de sécurité des applications (SAST) - l'analyseur peut identifier les vulnérabilités potentielles dans le code du projet et afficher l'identificateur d'erreur correspondant dans une certaine classification.

PVS-Studio prend en charge les classifications d'erreur suivantes:

  1. CWE
  2. SEI CERT
  3. Misra

Vous pouvez activer l'affichage des codes CWE à l'aide du menu contextuel dans la fenêtre de l'analyseur sous Afficher les colonnes> CWE

Figure 9. Menu contextuel et un exemple de sortie des codes CWE.

Figure 9. Menu contextuel et un exemple de sortie des codes CWE.

Ou dans le menu ci-dessus (Extensions> PVS-Studio> Afficher les codes CWE dans la fenêtre de sortie)

Figure 10. Le menu d'extension.

Figure 10. Le menu d'extension.

Les diagnostics MISRA sont inclus séparément dans les paramètres:

Figure 11. Liste des erreurs détectées.

Figure 11. Liste des erreurs détectées.

En savoir plus sur ces classifications ici .

Vérification des projets à partir de la ligne de commande


PVS-Studio_Cmd.exe est un utilitaire de vérification des projets Visual Studio C ++ / C # (.vcxproj / .csproj) et des solutions .sln à partir de la ligne de commande. Il peut être utile pour automatiser l'analyse. Le programme se trouve dans le répertoire où l'installation a été effectuée - par défaut, il est 'C: \ Program Files (x86) \ PVS-Studio'.

Le programme a de nombreux paramètres , mais d'abord nous n'en avons besoin que de 3:

  • --target: le projet ou le fichier de solution à vérifier.
  • --output: le fichier plog où vous souhaitez écrire le rapport.
  • --progress: affiche la progression de la vérification.

Voici à quoi ressemblera le lancement:

Figure 12. La sortie du programme PVS-Studio_Cmd.exe

Figure 12. La sortie du programme PVS-Studio_Cmd.exe

Après l'exécution, nous obtiendrons un fichier plog avec le rapport, le chemin vers lequel nous avons spécifié dans les options de lancement. Ce rapport peut être converti dans d'autres formats à l'aide de l'utilitaire PlogConverter.exe, et pour afficher le rapport dans l'EDI, il suffit de double-cliquer sur le fichier plog dans l'Explorateur.

Vous pouvez également ouvrir le fichier de rapport dans le menu d'extension sous Extensions> PVS-Studio> Ouvrir / Enregistrer> Ouvrir le rapport d'analyse ...

Image 4


Des informations détaillées sur l'utilitaire et ses paramètres se trouvent dans la documentation .

Suppression des fausses alertes


Certains messages émis par l'analyseur seront inévitablement faux. On ne peut rien y faire. Un analyseur statique est juste un programme qui n'a pas d'intelligence artificielle et ne peut pas déterminer exactement s'il a trouvé une erreur réelle ou non.

Pour lutter contre les faux positifs, l'analyseur propose un ensemble de mécanismes différents. Ils sont décrits en détail dans les sections suivantes de la documentation:


Conclusion


Bien sûr, ici, nous n'avons pas tout dit sur l'instrument. Si vous dites tout, l'article se transformera en documentation. L'objectif était de montrer à quel point il est facile de travailler avec l'outil dans l'environnement Visual Studio. Vous pouvez lire sur d'autres environnements et modes de fonctionnement dans la documentation et d'autres articles situés sur notre site Web . Il y a d'ailleurs beaucoup de choses intéressantes pour les programmeurs. Venez vous promener.

Il convient de noter que PVS-Studio ne fonctionne pas uniquement dans l'environnement de Microsoft. Nous prenons également en charge le langage Java, nous pouvons travailler sous Linux et macOS, intégrer dans CMake et bien plus encore. Pour plus d'informations, consultez la documentation .

Je vous souhaite un code sans code et j'espère que vous apprécierez PVS-Studio. Si vous avez des questions, nous vous aiderons et vous répondrons toujours. Écrivez-nous .

Ressources supplémentaires:


  1. Examen du code
  2. Analyse de code statique .
  3. Outils d'analyse de code statique .
  4. SAST .
  5. Technologies utilisées dans l'analyseur PVS-Studio .
  6. Téléchargez PVS-Studio et essayez-le.
  7. Prise en charge de Visual Studio 2019 .
  8. Discutez du prix de l'analyseur PVS-Studio pour votre équipe et comment l'acheter: achetez PVS-Studio .
  9. Un exemple d'utilisation d'un analyseur statique .
  10. Réponses aux questions fréquemment posées lors des conférences.
  11. Comment démarrer PVS-Studio Java
  12. Comment exécuter PVS-Studio sur Linux et macOS



Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien vers la traduction: Sergey Larin. PVS-Studio pour Visual Studio

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


All Articles