Blog 4 min de lecture

Que peut vous apprendre Clang sur vos projets Visual C++ ?

Share this article
Que peut vous apprendre Clang sur vos projets Visual C++ ?

Chaque compilateur peut signaler de nombreux avertissements après un build. Ces avertissements n'empêchent pas votre code de compiler, sauf si vous décidez de les traiter comme des erreurs. Prenez le temps d'examiner ces avertissements plutôt que de les ignorer. Les avertissements du compilateur sont souvent les indicateurs de bogues potentiels qui, autrement, ne se manifesteraient qu'à l'exécution.

Clang est un compilateur C/C++/Objective-C doté de nombreuses fonctionnalités utiles. Voici quelques-unes de ses principales caractéristiques pour l'utilisateur final :

  • Compilation rapide et faible consommation de mémoire.
  • Diagnostics expressifs.
  • Compatibilité GCC.

Dans cet article, nous nous concentrerons sur les diagnostics expressifs de Clang et sur la manière de les obtenir pour les projets Visual C++.

L'équipe Clang s'efforce de fournir des messages d'erreur aussi clairs et informatifs que possible. Elle cherche à les rendre aussi conviviaux que possible pour un compilateur en ligne de commande. Pour ce faire, Clang indique précisément ce qui ne va pas dans le code. Cela est réalisé grâce à un moteur de diagnostics qui transforme les informations d'erreur en un message convivial.

Pour constater les avantages des diagnostics de Clang, compilons un fichier source C++ minimal avec Visual C++ et Clang, et comparons les avertissements qu'ils signalent. Tous les avertissements seront activés pour les deux compilateurs.

clang1

Le compilateur C++ de Microsoft signale l'avertissement suivant :

  • warning C4100: ‘n’: unreferenced formal parameter

Clang signale trois avertissements :

  • no previous prototype for function ‘Print’
  •  use of old-style cast
  • unused parameter ‘n’

Ce qui est intéressant avec Clang, c'est qu'il signale aussi des diagnostics liés aux bonnes pratiques de codage. Par exemple, l'avertissement « no previous prototype for function Print » est signalé parce que Print n'est pas déclarée comme fonction statique ; elle pourrait donc être utilisée depuis un autre fichier source — auquel cas il est recommandé de placer sa déclaration dans un fichier d'en-tête.

Pour se faire une idée plus concrète des diagnostics de Clang, compilons un projet C++ open source à la fois avec Clang et avec le compilateur Microsoft, et comparons les types d'avertissements signalés.

Nous utiliserons le projet « 7-Zip » comme exemple et ne compilerons que le module Gui.vcproj. Nous nous concentrerons uniquement sur les avertissements liés au code source du projet, et non aux fichiers d'inclusion externes.

Le compilateur Microsoft signale ces types d'avertissements :

  • Bytes padding added after data member.
  • Conversion issues.
  • Function not inlined.
  • Class has virtual functions, but destructor is not virtual.
  • Catch(…) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught.
  • Cast issues.
  • Enumerator ‘kInfo’ in switch of enum ‘NCommandType::EEnum’ is not explicitly handled by a case label.
  • ‘GetVersionExA’: was declared deprecated.
Le compilateur Clang signale ces types d'avertissements :
  • Use of old-style cast
  • Missing field ‘MinLen’ initializer
  • Macro is not used
  • Declaration requires a global constructor
  • Declaration requires an exit-time destructor
  • Conversion issues
  • Cast issues
  • enumeration values ‘kWithoutPrompt’, ‘kAutoRename’, and ‘kAutoRenameExisting’ not handled in switch
  • Operand of ?: changes signedness: ‘const int’ to ‘unsigned int’
  • Declaration shadows a local variable
  • ISO C++11 does not allow conversion from string literal to ‘LPSTR’ (aka ‘char *’)
  • No previous prototype for function
  • Comparison issues
  • ‘GetVersionExA’: was declared deprecated
  • dynamic exception specifications are deprecated
  • ‘&&’ within ‘||’
  • ‘CBenchRandomGenerator’ has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit
  • Delete called on ‘CBenchmarkInStream’ that has virtual functions but non-virtual destructor
  • ‘CBenchmarkInStream’ has virtual functions but non-virtual destructor
  • Equality comparison result unused
  • Explicitly assigning value of variable of type ‘INT_PTR’ (aka ‘int’) to itself
  • Add explicit braces to avoid dangling else

Comme on peut le constater, Clang signale davantage d'avertissements utiles que le compilateur Microsoft ; certains d'entre eux ne sont généralement signalés que par des outils d'analyse statique. Il vaut la peine de prendre ces avertissements au sérieux, car ils peuvent révéler de nombreux bogues.

Comment obtenir les diagnostics de Clang pour vos projets Visual C++ ?

Les diagnostics de Clang aident les développeurs à améliorer la qualité de leur code source C/C++ ; il est donc utile d'y avoir accès pour les projets Visual C++.

La première option consiste à compiler vos projets avec Clang ; voici un article MSDN qui vous montre comment utiliser Clang comme compilateur dans VS.

La deuxième option consiste à analyser vos projets Visual Studio à l'aide de CppDepend, qui utilise Clang comme parseur frontal et rapporte tous ses diagnostics. CppDepend est gratuit pour la communauté open source.

La requête suivante retourne tous les diagnostics de Clang :

clang6

Le projet Gui de l'application 7-Zip ne compte que 10 000 lignes de code et 1 186 diagnostics. Pour les projets moyens et grands, vous pourriez avoir des milliers de diagnostics. Dans ce cas, il est utile de les filtrer pour ne récupérer que des types d'avertissements spécifiques.

Par exemple, nous pouvons modifier la requête précédente pour n'obtenir que les avertissements liés aux utilisations dépréciées.

clang8

Conclusion :

Les avertissements sont souvent les indicateurs de bogues potentiels ; ils ne doivent donc pas être ignorés. Clang signale de nombreux diagnostics utiles, dont certains liés aux bonnes pratiques de codage, et traiter ces avertissements peut aider à améliorer la qualité du code source de votre projet.

Share this article