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

Michel SIMATIC

18 juin 2026

1 Introduction

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

2 Analyse des fuites mémoire (et autres mauvaises utilisations de la mémoire)

Pour analyser les fuites mémoire (et autres mauvaises utilisations de la mémoire), vous disposez de différents outils présentés dans cette section. Pour tester ces outils, vous pouvez vous appuyer sur votre propre projet ou bien utiliser l’archive SoucisMemoire.zip (à exploiter selon la procédure Construire un projet C++ avec cmake).

Le tableau suivant recense, pour chaque analyse souhaitée et pour chaque environnement de développement souhaité (OS et IDE), l’outil recommandé en priorité et, le cas échéant, le (ou les) autre(s) outil(s) que vous pouvez aussi utiliser. Par exemple, si vous êtes sous Windows avec Visual Studio, le tableau ci-dessous vous recommande d’utiliser en priorité l’outil Memory Profiler ou bien d’Autres outils. Cliquez sur le lien pour avoir des explications.

Analyse souhaitée Linux (Clion, VSCode) macOS (Clion, VSCode) Windows (Visual Studio) Windows (VSCode)
Fuites mémoire 1. Sanitizer leak 2. Valgrind 1. Sanitizer leak 2. Leaks 1. Memory Profiler 2. Autres outils 1. Procédure spéciale 2. Autres outils
Accès illicites 1. Sanitizer address 2. Valgrind Sanitizer address 1. Sanitizer address 2. Autres outils 1. Procédure spéciale 2. Autres outils
Mémoire non initialisée 1. Sanitizer memory 2. Valgrind Sanitizer memory 1. Messages compilateur 2. Autres outils 1. Procédure spéciale 2. Autres outils
Signed integer overflow & co Sanitizer undefined Sanitizer undefined Aucun outil ? Procédure spéciale

2.1 Sanitizers

Les sanitizers permettent d’ajouter du code à vos sources au moment de leur compilation/édition de liens, grâce à des instructions ajoutées dans votre CMakeLists.txt principal.

add_compile_options(-fsanitize=leak)
add_link_options(-fsanitize=leak)
add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)
add_compile_options(-fsanitize=memory)
add_link_options(-fsanitize=memory)
add_compile_options(-fsanitize=undefined`)
add_link_options(-fsanitize=undefined`)
Onglet Sanitizer dans CLion

2.2 Autres outils sous Linux

2.2.1 Valgrind

Installez Valgrind qui est un outil qui permet notamment de détecter beaucoup de problèmes liés à la mémoire. Par exemple, sous Ubuntu : sudo apt install valgrind

Vous pouvez ensuite :

  1. Soit ouvrir un terminal, aller dans le répertoire racine de votre projet, taper valgrind repertoire_ou_cmake_travaille/src/main/nom_executable et observer les affichages.
  2. Soit, si vous utilisez CLion :
    1. Dans CLion, menu Run > Run ‘unitTests’ with Valgrind Memcheck : la fenêtre Console indique que valgrind a été lancé.
    2. 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.
  3. Soit, si vous utilisez VSCode, cette extension vous permet de lancer Valgrind et d’analyser ses sorties à partir de VSCode.
CLion affichant le résultat de l’exécution de Valgrind

2.3 Autres outils sous macOS

2.3.1 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.4 Autres outils sous Windows

2.4.1 Visual Studio

2.4.1.1 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.4.1.2 Autres outils

Voici deux autres outils qui sont disponibles sous Windows et qui peuvent être utilisés par les utilisateurs·trices de Visual Studio, mais aussi de VSCode :

2.4.2 Visual Studio Code (VSCode)

2.4.2.1 Procédure spéciale

A notre connaissance, sous Windows, VSCode ne dispose pas d’outils permettant d’analyser les fuites mémoire (ou autres). Aussi, notre propùosition est de faire que votre VSCode Windows travaille sur un environnement Linux. Deux cas se présentent :

  1. Votre Windows héberge une WSL.
  2. Votre Windows n’héberge pas de WSM et vous ne voulez pas de WSL.
2.4.2.1.1 Vous disposez de WSL (Windows Subsystem Linux*)
2.4.2.1.2 Vous n’avez pas de WSL (et vous ne voulez vraiment pas installer WSL)
2.4.2.1.2.1 A faire une seule fois
Host ssh-tsp
    HostName ssh.imtbs-tsp.eu
    User votreUsernameSurLesMachinesDeSalleTP
    ForwardX11 yes
    ForwardX11Trusted yes
2.4.2.1.2.2 A faire à chaque fois que vous voulez faire des tests

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 :