Blog 5 min de lecture

Tirez le meilleur parti des outils d’analyse statique C/C++

Share this article
Tirez le meilleur parti des outils d’analyse statique C/C++

L'analyse statique de code est le processus de détection des défauts dans le code source d'un logiciel. Les outils d'analyse statique sont utiles pour détecter les erreurs de codage courantes ; voici quelques avantages de leur utilisation :

  • Rendre le code source plus lisible et plus maintenable.
  • Prévenir les comportements inattendus à l'exécution.
  • Améliorer les performances d'exécution.
  • Rendre le code plus sûr.

De nombreux outils d'analyse statique C/C++ sont disponibles, chacun se concentrant sur un domaine spécifique et offrant ses propres avantages. En voici quelques exemples :

  • Cppcheck 
  • Clang Analyzer
  • Visual C++ Analyzer
  • Vera++
  • Goanna
  • Viva64
  • PC-lint

Il existe plusieurs façons d'explorer les résultats de ces outils :

  • Le format XML: des fichiers XML peuvent être générés par chacun de ces outils ; ils peuvent servir à créer un rapport HTML ou être consommés par un autre outil pour explorer les résultats de l'analyse.
  • Le format HTML: le HTML est un format pratique pour générer des rapports et les partager avec l'équipe, et vous pouvez créer des rapports personnalisés à l'aide d'une feuille de style XSL.
  • Les plugins d'IDE: presque tous les IDE bien connus proposent des plugins pour ces outils, ce qui permet de visualiser les violations directement dans le code source.

L'un des problèmes des outils de qualité de code est qu'ils ont tendance à submerger les développeurs avec des problèmes qui n'en sont pas vraiment — c'est-à-dire des faux positifs. Lorsque des faux positifs surviennent, les développeurs apprennent à ignorer la sortie de l'outil, voire l'abandonnent complètement.

Pour mieux explorer leurs résultats, il est utile de disposer d'un moyen de se concentrer uniquement sur les constatations pertinentes et d'offrir aux développeurs une vue claire des résultats.

CppDepend et CQLinq

CppDepend est un autre outil d'analyse statique qui complète les autres. Il utilise un langage de requête de code fondé sur LINQ (CQLinq) pour interroger la base de code comme une base de données.

CppDepend intègre Cppcheck, Vera++ et l'analyseur Clang par défaut, et il peut facilement être étendu pour prendre en charge d'autres outils d'analyse statique grâce à son API. Le code source du plugin Visual Studio Analyzer est disponible pour montrer comment intégrer d'autres outils.

Prenons le code source de Clang comme exemple et voyons comment explorer les résultats de ces outils avec CppDepend.

Obtenir tous les problèmes :

La requête pour récupérer tous les problèmes est très simple. Cependant, comme vous pouvez le constater, elle n'est pas très intéressante — en effet, traiter un résultat contenant 331 417 problèmes est un défi.

static1

Pour mieux exploiter les résultats de ces outils, nous pouvons les filtrer et nous concentrer uniquement sur ce que nous voulons.

Les requêtes par outil

Nous pouvons modifier la première requête et ajouter un critère pour l'outil concerné.

static2

Les problèmes les plus fréquemment signalés

Il est intéressant de savoir quels problèmes sont signalés le plus fréquemment par ces outils.

static3Les plus récurrents concernent les problèmes de style signalés par Vera++ ; nous pouvons les exclure de la requête s'ils ne sont pas pertinents dans votre cas.

Les classes comportant le plus de problèmes

Il est très intéressant de savoir quelles classes contiennent de nombreuses violations.

static4

La requête précédente est intéressante, mais elle ne nous dit pas exactement quelles classes présentent les problèmes de qualité les plus significatifs. Une autre métrique utile à prendre en compte est NBLinesOfCode. Nous pouvons modifier la requête précédente et calculer le ratio entre le nombre de problèmes et NBLinesOfCode.

static5

Les méthodes les plus utilisées comportant des problèmes

Lorsque les outils d'analyse statique signalent des problèmes, il est utile de savoir lesquels prioriser, surtout s'ils concernent des bogues. Un bogue peut exister dans une méthode spécifique, mais ce qu'il est intéressant de savoir, c'est combien de méthodes sont affectées par ce bogue. Les méthodes largement utilisées sont appelées par davantage de code, et il est préférable de résoudre rapidement leurs problèmes.

static6

Avec CQLinq, nous pouvons combiner les résultats de tous ces outils ainsi que ceux de CppDepend pour créer des requêtes plus élaborées, et ajouter ces vérifications au processus de build.

Les tendances des problèmes

Les problèmes ne sont pas inhabituels dans un projet logiciel ; tout projet peut avoir des problèmes à résoudre. Cependant, nous devrions surveiller la tendance de qualité du projet. En effet, c'est un mauvais indicateur si le nombre de problèmes augmente au fil des changements et de l'évolution du projet. CppDepend fournit la fonctionnalité de surveillance des tendances pour créer des graphiques de tendances.

Les graphiques de tendances sont construits à partir de valeurs de métriques enregistrées au fil du temps pendant les analyses. Plus de 50 métriques de tendance sont disponibles par défaut, et il est facile de créer vos propres métriques de tendance.

Avec ce graphique de tendance, nous pouvons suivre l'évolution des problèmes signalés par Cppcheck au fil du temps :

cppcheck7

Intégrer les résultats des outils d'analyse statique dans le rapport HTML

CppDepend permet d'ajouter des sections supplémentaires au rapport HTML, listant certaines requêtes CQLinq.


Dans le panneau CQLinq Query Explorer, un groupe CQLinq particulier rapporté est encadré d'un rectangle orange.

cppcheck10

Et dans le rapport HTML, ces sections ajoutées sont accessibles depuis le menu :

cppcheck11

Intégrer les résultats des outils d'analyse statique dans le processus de build

CppDepend introduit la notion de règle CQLinq critique. Les règles critiques permettent de définir des règles de haute priorité qui ne doivent jamais être violées. Avec les règles critiques, il est possible de faire échouer le processus de build lorsqu'une règle critique est violée.

Une règle critique est simplement une règle CQLinq dont l'indicateur Règle critique est coché :

Pendant le processus de build, lorsqu'une règle critique est violée, CppDepend.Console.exe retourne un code de sortie non nul. Ce comportement peut être utilisé pour faire échouer le processus de build si une règle critique est violée.

Nous pouvons facilement définir une règle critique Cppcheck pour faire échouer le build si des types spécifiques de problèmes Cppcheck sont détectés.

Conclusion

CppDepend est ouvert aux autres outils d'analyse statique, et vous pouvez aussi facilement intégrer votre propre outil personnalisé. De cette façon, vous pouvez utiliser toutes les fonctionnalités de CppDepend pour mieux explorer les résultats des outils d'analyse statique C/C++ pris en charge.

Share this article