Dans un article précédent nous parlions de l'outil clang-modernize pour identifier où les nouvelles fonctionnalités C++11 pourraient être utilisées afin de moderniser votre code source C++. Mais comment détecter facilement où les nouvelles fonctionnalités du C++ sont utilisées dans un projet ?
Facebook et Google utilisent largement C++11 dans leur code source. Folly de Facebook, comme nous l'avons découvert dans un article précédent, utilise presque toutes les fonctionnalités de C++11, et j'étais curieux de savoir si Microsoft utilisait également la nouvelle norme C++11 dans son code open source.
Les projets open source de Microsoft se trouvent dans leur dépôt GitHub. Certains sont des forks d'autres projets que Microsoft a adaptés à ses besoins, comme LLVM, Clang et OpenCV, et d'autres sont développés par Microsoft. Examinons l'un de ces projets pour voir s'il utilise C++11. Le meilleur choix pourrait être l'un de leurs derniers projets C/C++ open source : WinObjC.
Windows Bridge for iOS (également appelé WinObjC) est un projet open source de Microsoft qui fournit un environnement de développement Objective-C pour Visual Studio/Windows. WinObjC offre en outre une prise en charge de la compatibilité avec les API iOS.
Une façon de vérifier où C++11 est utilisé consiste à explorer chaque fichier source, ce qui peut prendre des heures, voire des jours, selon la taille du projet. Une autre solution consiste à utiliser Clang.
Clang et son puissant moteur de diagnostics à la rescousse.
L'équipe Clang s'efforce de fournir des messages d'erreur aussi clairs et expressifs que possible. Elle essaie de 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 messages conviviaux.
Clang émet de nombreux types de diagnostics, et pour nos besoins, les plus intéressants ont des descriptions de ce type : « XXX incompatible with C++98 ».
Mais comment obtenir les diagnostics Clang pour une solution Visual Studio ?
La première solution consiste à compiler vos projets avec Clang ; cependant, ce n'est pas une tâche facile. Il faut en effet modifier votre processus de build pour utiliser Clang à la place du compilateur Microsoft.
La deuxième solution 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.
Voici tous les diagnostics Clang pour la solution WinObjC :

Mais dans notre cas, nous n'avons besoin que des diagnostics du type « incompatible with C++98 ». Vous pouvez facilement filtrer la requête précédente pour n'obtenir que ces diagnostics :

Comme on peut le constater, les fonctionnalités du langage nullptr et auto sont utilisées à de nombreux endroits du code source, mais contrairement aux projets de Facebook et de Google, les fonctionnalités C++11 ne sont pas largement employées. En explorant les fichiers sources C++ de WinObjC, on constate aussi que les extensions C++/CX sont utilisées plus massivement.
Résumé:
Il est parfois utile de savoir si un projet C++ utilise des fonctionnalités des normes plus récentes, et où elles sont utilisées. Clang est un outil puissant pour recueillir ces informations.
