Outils CSC4526 (cmake, IDE, SonarQube, GoogleTest, débogueur, analyse de fuites mémoire)

Michel SIMATIC

21 mai 2026

1 Introduction

Ce document donne des précisions sur l’utilisation de différents outils utilisés durant CSC4526 :

2 Analyse de fuites mémoire

Pour analyser les fuites mémoire dans du code C++, nous nous appuyons sur des outils dédiés.

Pour tester ces outils, vous pouvez vous appuyer sur votre propre projet ou bien créer un projet console et substituer le code automatiquement généré par le contenu de codeQuiFuit.cpp.

Allez à la section correspondant à votre OS :

2.1 Linux

2.1.1 CLion sans installation d’un autre outil

Pour éviter l’installation d’un autre outil, nous nous appuyons sur le sanitizer address.

Pour ce faire, modifiez le CMakeLists.txt à la racine de votre projet en lui ajoutant les lignes :

        .......
        set (BUILD_SHARED_LIBS FALSE)

        ###### DEBUT lignes a rajouter
        if(MSVC)
          add_compile_options(/fsanitize=address)
        else()
          add_compile_options(-fsanitize=address)
          add_link_options(-fsanitize=address)
        endif()
        ###### FIN lignes a rajouter

        set(CMAKE_CXX_STANDARD 23)
        .......

Dans votre projet, prenez en compte les changements de CMakeLists.txt, puis régénérez complètement votre projet.

Si vous exécutez, comme jusqu’à présent, unitTests dans le cadre de l’environnement GoogleTest, vos tests sont toujours tous corrects. Cependant, en bas à gauche de votre écran, à côté de l’onglet Console, il y a un onglet Sanitizers qui vous signale des problèmes repérés dans votre code :

Onglet Sanitizer dans CLion

Pour information, si vous choisissez d’exécuter la cible All CTests, les tests qui causent la fuite mémoire sont signalés comme ne passant pas (alors que, pourtant, les différents EXPECT ou ASSERT sont corrects). L’onglet Sanitizers permet de comprendre les problèmes.

2.1.2 Clion combiné à l’outil Valgrind

  1. Installez Valgrind. Par exemple, sous Ubuntu : sudo apt install valgrind
  2. Dans CLion, menu Run > Run ‘unitTests’ with Valgrind Memcheck : la fenêtre Console indique que valgrind a été lancé.
  3. Au bout de quelques secondes, la fenêtre en bas à droite de l’écran indique que les “Tests Results” sont OK. En fait, ceci ne concerne que les tests unitaires qui sont tous OK. SI vous cliquez sur l’onglet “Valgrind” (à côté de l’onglet “Console” actuellement affiché), vous voyez un message Leak-DefinitelyLost 3 Warnings. Si vous dépliez ce message, vous accédez au détail de ces fuites mémoire. En dépliant l’une de ces fuites, vous avez accès à la pile d’appel qui a amené à l’allocation mémoire sans libération associée. En double-cliquant sur l’une des lignes de la pile d’appel (par exemple, dans la figure 1, sur la ligne Group::Group(pugi::xml_node) Group.cpp:15)), vous accédez au code de la ligne qui a fait le new.
CLion affichant le résultat de l’exécution de Valgrind

2.2 MacOS

2.2.1 Clion

Suivez la démarche proposée dans la section CLion sans installation d’un autre outil de Linux.

2.2.2 Outil standard Leaks

Sous MacOS, vous pouvez aussi vous appuyer sur l’outil leaks fourni en standard (cf. cet article).

Dans un terminal, compiler votre programme avec l’option -g (NB: Clion compile votre programme directement avec cette option). Par exemple:

cc -g -Wall -Werror nomFichier.c -o nomFichier
leaks --atExit --list -- ./nomFichier
# ==> Détection des leaks sans voir leur emplacement précis dans le code
export MallocStackLogging=1
# Rien ne se passe
leaks --atExit --list -- ./nomFichier
# ==> Affichage des emplacements précis dans le code

2.3 Windows

2.3.1 Votez pour que le sanitizer Address permette la détection de fuites mémoire sous Windows

Windows implémente le sanitizer Address pour son compilateur MSVC (cf. tous ces exemples de détection), mais, actuellement, cette implémentation ne détecte pas les fuites mémoire !

Si vous le souhaitez, votez ici pour demander l’ajout de cette fonctionnalité !

En attendant, consultez la section suivante pour détecter les fuites mémoire sous Windows.

2.3.2 Visual Studio et son Memory Profiler

Par rapport à Valgrind sous Linux, le Visual Studio Profiler est un peu plus compliqué à mettre en oeuvre, mais présente l’avantage de ne pas du tout ralentir l’application profilée.

Cet outil étant disponible en standard dans Visual Studio, il n’y a aucune installation à faire.

Commencez par poser un point d’arrêt au niveau de l’appel à la fonction que vous souhaitez tester. Par exemple, dans le cas d’une application CSC4526, l’appel à la fonction myMain().

Si vous souhaitez voir si vos tests unitaires révèlent des fuites mémoire :

Visual Studio après double-clic, dans la “Pile des appels”, sur la ligne unitTests.exe!testing::UnitTest::Run()
Visual Studio après pose du point d’arrêt sur double-clic sur int UnitTest::Run()
Icône “Pas à pas sortant” (Maj+F11) de Visual Studio
Visual Studio affichant la liste des fuites mémoire détectées
Visual Studio affichant le résultat de la différence d’instantanés

2.3.3 Dr Memory

L’outil Dr. Memory est sensé être un équivalent de Valgrind sous Windows. Mais nous n’avons pas réussi à le faire fonctionner correctement (message Dr. Memory failed to start the target application, perhaps due to interference from invasive security software. peut-être due à l’outil de sécurité installé sur les machines du campus Télécom SudParis). Nous le mentionnons ici seulement pour que vous ayez l’information et que vous puissiez faire vos propres tests.

2.4 Visual Studio Code et les fuites mémoire

Sous Linux, il existe cette extension qui vous permet de lancer Valgrind et d’analyser ses sorties à partir de VSCode.

Sous macOS, reportez-vous aux outils de la section macOS ci-dessus (nous n’avons pas trouvé d’extension VSCode facilitant l’utilisation de ces outils à partir de VSCode).

Sous Windows, Dr. Memory (évoqué ci-dessus) est une piste de solution que nous n’avons pas été en mesure de tester (cf. ci-dessus). Par ailleurs, nous n’avons pas trouvé d’extension VSCode facilitant l’utilisation de DR. Memory à partir de VSCode.

3 cmake

Tous les canevas de projet C++ fournis dans le cadre de CSC4526 s’appuient sur cmake. cmake permet de configurer l’environnement du projet, ce qui dispense de configurer l’IDE (concernant les dépendances, la version du standard C++ compilateur, etc.).

Nous décrivons ici :

3.1 Construire un projet C++ avec cmake

3.1.1 Instructions et informations communes à tous les IDE/OS

A titre d’information, voici les temps de chargement du dossier (génération de la structure du projet) et de compilation/édition de lien du projet observés en 2024-2025 avec SampleSFML.zip, donc SFML 3.0.0 :

Système d’exploitation Temps de chargement du dossier (cmake -B build) Temps de compilation/édition de lien du projet (cmake --build build)
Linux Ubuntu 24.04 (Compilateur gcc ; sur WSL ; Processeur i7 à 2,80 Ghz, 32 Go de RAM) 0’23” 0’36”
macOS 15.3 Sequoia (Compilateur Apple clang ; Processeur Intel 3.8 GHz et 128 Go RAM) 0’31” 1’02”
Windows 11 (Compilateur MSVC ; Processeur i7 à 2,80 Ghz, 32 Go de RAM) 2’04” 1’01”

3.1.2 CLion (Linux) et cmake

cd chemin_absolu_vers_votreRépertoireProjet
rm -Rf .idea build cmake-build-debug
cmake -B build
#
# Si cmake affiche l'une des messages suivants:
#    - "cmake not found"
#    - "Error during cmake"
#    - "No CMAKE_CXX_COMPILER"
#    - "Could NOT find X11"
# Alors tapez la commande suivante (qui est sur plusieurs lignes) :
#
sudo apt update && sudo apt install -y \
    g++ \
    cmake \
    libxrandr-dev \
    libxcursor-dev \
    libxi-dev \
    libudev-dev \
    libflac-dev \
    libvorbis-dev \
    libgl1-mesa-dev \
    libegl1-mesa-dev \
    libdrm-dev \
    libgbm-dev \
    libfreetype-dev
# Au final, vous devriez obtenir le message "-- Build files have been written to: absolute_path_to_your_project". Cela signifie que toutes les installations préalables pour Linux sont OK.
#
# Il vous reste à nettoyer votre répertoire de votre test cmake:
rm -Rf build
Fenêtre SFML works!

3.1.3 CLion (MacOS) et cmake

3.1.3.1 Démarche préliminaire pour les utilisateurs·trices de Mac avec processeur M1 (ARM)

Dans un terminal, tapez la commande which brew pour vous assurer d’avoir la version de Homebrew adaptée à l’architecture ARM de votre processeur : Si la version de Homebrew est adaptée à ARM, le chemin affiché devrait commencer par /opt/homebrew/. Si le chemin affiché commence par /usr/local/, votre version de Homebrew est adaptée à un processeur Intel (ce qui vous posera des soucis lorsque CLion fera des éditions de liens) : Il vous faut installer un Homebrew adapté à ARM (cf. procédure un peu modifiée de la 1ère réponse ici) :

cd /opt
sudo mkdir -p homebrew
sudo chown -R $(whoami) homebrew
curl -L https://github.com/Homebrew/brew/tarball/master |\
    tar xz --strip 1 -C homebrew
#+end_src
- Modifiez *PATH*
#+begin_src bash
PATH=/opt/homebrew/bin:$PATH
hash -d brew
brew bundle install --file /path/to/Brewfile

3.1.3.2 Démarche pour tous les utilisateurs·trices de MacOS

Fenêtre SFML works!

3.1.4 Visual Studio (Windows) et cmake

Fenêtre SFML works!

Pour information, cette procédure crée les répertoires .vs et out dans le répertoire de votre projet.

3.1.5 Visual Studio Code et cmake

Nous déroulons la procédure expliquée ici :

Fenêtre SFML works!

3.2 Ajouter des fichiers source dans un projet géré avec cmake

Pour les premiers canevas de projet que vous utiliserez dans CSC4526, vous aurez juste à modifier des fichiers source déjà fournis dans le canevas.

Puis, vous serez amené·e à ajouter des fichiers sources, ce qui requiert une procédure particulière décrite ci-dessous :

4 Débogueur

Cette section retranscrit le contenu des vidéos de tutoriel sur le débogage :

Ces vidéos utilisent le fichier ExempleDeDebugDeProgramme.cpp

4.1 Initiation au débogage de programme avec CLion

Les manipulations ont été effectuées en s’appuyant sur le scénario Visual Studio ci-dessous. Pour information, CLion ne permet pas de mettre en place un arrêt quand la valeur d’une variable change (il faut taper manuellement la commande gdb watch dans la console gdb fournie par CLion).

4.2 Initiation au débogage de programme avec Visual Studio

4.2.1 Introduction au débogage

Dans ce tutoriel vidéo, je vous propose une initiation aux principales fonctions de débogage offertes par Visual Studio. Vous pourrez ainsi gagner en efficacité et en rapidité dans la mise au point de vos programmes, qu’ils soient écrits en C++ ou dans d’autres langages. En effet, les notions présentées ici sont génériques à tous les langages de programmation.

Notez que, pour ce tutoriel, nous nous appuierons sur le fichier ExempleDeDebugDeProgramme.cpp que je vous invite à télécharger maintenant, si vous ne l’avez pas déjà fait.

4.2.2 Mise en place de l’environnement

  1. Création d’un projet console
  2. Recopie du code pour debugging

4.2.3 Déboguer un plantage qui ne semble pas dans notre code

  1. Menu Déboguer > Exécuter sans débogage
  2. La fenêtre affiche Expression: vector subscript out of range
  3. Vu que la fenêtre dit Please retry to debug the application, clic sur Recommencer
  4. Expliquer affichage “Windows recherche une solution au problème” (pour info, MacOS a le même comportement). Le pb ne vient pas de votre OS ou de votre IDE (VisualStudio), mais bien de votre application !
  5. Cliquer sur “Déboguer” : patienter (environ 20 secondes).
  6. Choisir l’instance courante : vous arrivez dans le menu de debug.
  7. Nous pourrions commencer le débogage. Mais, pour vous montrer qu’on peut s’économiser le temps d’attente qu’on vient de vivre, voyons ce qui se passe si on lance notre programme directement en débogage.
  8. Faisons le ménage et démarrons maintenant en mode debug, par exemple en cliquant sur le bouton “Débogueur Windows Local” ou bien en appuyant sur la touche F5
  9. La fenêtre affiche toujours Expression: vector subscript out of range.
  10. Vu que la fenêtre dit Please retry to debug the application, clic sur Recommencer
  11. On arrive directement dans VisualStudio, dans le code du module vector qui affiche vector subscript out of range
  12. Dans le cadre en bas à droite, sélectionner l’onglet “Pile des appels” (NB : Si Visual Studio n’affiche pas cet onglet, menu Déboguer > Fenêtres > Pile des Appels) : la flèche montre où est arrêté votre programme.
  13. Double-cliquez sur la ligne juste en dessous : vous êtes à votre ligne de code qui a appelé vector et qui a généré le souci.
  14. Sélectionnez v.size : VS vous affiche 4.
  15. Sélectionnez v et cliquez sur la flèche pour voir le contenu de v : il y a 4 éléments. NB : on peut aussi voir le contenu de v dans le cadre des variables locales en bas à gauche (si Visual Studio n’affiche pas cet onglet, menu Déboguer > Fenêtres > Automatique).
  16. OK, nous comprenons le bug : ajoutons le -1 et cliquons sur le bouton “Redémarrer”

4.2.4 Pas à pas

  1. Nous obtenons une erreur, plus loin : division par zéro. Effectivement c vaut 0 (qui ne fait pas bon ménage avec l’opérateur modulo).
  2. Pour comprendre comment c s’est retrouvé avec la valeur 0, mettons un point d’arrêt au niveau de la définition de c, puis exécutons pas à pas le programme.
  3. Arrêter le programme
  4. Clic droit, Exécuter jusqu’au curseur
  5. Bouton “Pas à pas principal” (y compris au-dessus de l’appel à unCalcul()) ==> Zut, la valeur de c a changé.
  6. Exécuter jusqu’au curseur de l’appel à unCalcul()
  7. Bouton “Pas à pas détaillé” ==> Vous rentrez dans unCalcul()
  8. Faire “Aperçu de la définition” ==> On voit l’origine du problème.

4.2.5 Pose d’un point d’arrêt conditionnel

  1. Insérer un point d’arrêt au niveau du return resultat
  2. Dans le cadre en bas à droite, clic sur l’onglet “Points d’arrêt”
  3. Clic-droit sur le point d’arrêt, Paramètres
  4. Clic sur Conditions, resultat == 0
  5. Redémarrez
  6. Désactivez ce point d’arrêt

4.2.6 Arrêter l’exécution quand la valeur d’une variable change

  1. Exécutez jusqu’à ce que la variable c soit définie.
  2. Dans le cadre des variables locales (si Visual Studio n’affiche pas cet onglet, menu Déboguer > Fenêtres > Automatique), clic-droit sur c et “Arrêtez quand la valeur change”. Notez que la variable a change aussi de couleur (vu que c est une référence vers a).
  3. Cliquez sur “Continuer” ==> Arrêt quand a (et donc c) change.
  4. Hélas, si vous cliquez sur “Redémarrez”, le programme ne s’arrête pas sur le changement de c : il faut programmer un nouveau point d’arrêt pour cette variable.

4.2.7 Nettoyage de tous les points d’arrêt

  1. Menu Déboguer > Supprimer tous les points d’arrêt

4.2.8 Conclusion

Nous voici arrivés à la fin de cette initiation au débogage sous Visual Studio : n’hésitez pas à faire vos propres expériences pour vous familiariser avec cet outil et ainsi gagner en efficacité et en rapidité dans la mise au point de vos programmes.

4.3 Initiation au débogage de programme avec Visual Studio Code

TODO : A compléter.

5 Génération d’une version Release d’un programme

La version Release d’un programme est une version sans information de debug, donc plus rapide à l’exécution. Cette section décrit comment la générer :

6 GoogleTest au sein de votre IDE

GoogleTest est un environnement facilitant l’écriture et le passage de tests unitaires. Cette section présente l’utilisation de GoogleTest selon l’IDE que vous utilisez. Nous supposons ici que vous avez déjà appliqué cmake sur un canevas de projet contenant des tests unitaires.

6.1 CLion (Linux ou MacOS) et GoogleTest

6.2 Visual Studio (Windows) et GoogleTest

6.3 Visual Studio Code et GoogleTest

[ctest] [ RUN      ] choisir_carte.strategie_kCarte_la_plus_petite
[ctest] C:\temp\CSC4526\SixQuiPrend\src\test\unitTests.cpp:20: Failure
[ctest] Expected equality of these values:
[ctest]   cartes_t({4, 6})
[ctest]     Which is: { 4, 6 }
[ctest]   j.main
[ctest]     Which is: { 2, 4, 6 }

7 Profileur de performances

Le profileur de performances permet de repérer les sections de code où votre programme passe du temps.

8 SonarQube

8.1 Session CSC4526 2023-2024 : Résoudre un bug lié à la combinaison Visual Studio version 17.9.6 / cmake / SonarQube

Pour la session CSC4526 2023-2024, un bug lié à la combinaison Visual Studio version 17.9.6 / cmake / SonarQube est apparu quelques jours avant le début de ce cours. Il empêche que SonarQube affiche ses messages dans Visual Studio.

8.1.1 Constatation du bug

Voyons tout d’abord si vous êtes concerné·e par ce bug :

8.1.2 Correction du bug

Cet article indique la démarche pour résoudre ce bug :