AddressSanitizer C++ : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

AddressSanitizer pour C++ : guide complet pour détecter les erreurs mémoire

1. Qu'est-ce que c'est et pourquoi l'utiliser ?

AddressSanitizer (ASan) n'est pas une bibliothèque classique, mais un puissant outil d'analyse dynamique de code intégré aux compilateurs Clang et GCC. Il permet de détecter les erreurs de gestion mémoire lors de l'exécution du programme. Développé par l'équipe Google, ASan est devenu le standard de facto pour repérer des défauts dangereux comme les dépassements de tampon (buffer overflow), l'utilisation de mémoire après libération (use-after-free), les doubles libérations (double-free) et les fuites mémoire (memory leaks).

Pourquoi est-ce essentiel ? Les erreurs mémoire sont parmi les plus redoutables en C++. Elles peuvent rester latentes pendant des années, provoquant des plantages aléatoires, des corruptions de données ou des failles de sécurité. Les débogueurs traditionnels sont souvent impuissants, car le programme peut planter loin du lieu réel de l'erreur. ASan résout ce problème en instrumentant le code à la compilation : il ajoute des vérifications autour de chaque opération mémoire (malloc, new, free, delete, lecture/écriture via des pointeurs). En cas d'anomalie, ASan arrête immédiatement le programme et affiche une trace détaillée avec la ligne de code exacte, le type d'erreur et l'état de la mémoire.

Pour le site éducatif PythonLib, il est important de comprendre : même si Python gère la mémoire automatiquement, la connaissance d'ASan est précieuse pour les développeurs C++ qui créent des applications critiques ou à forte charge. ASan s'intègre dans les pipelines CI/CD, permettant de détecter les bugs avant la mise en production. Il fonctionne sous Linux, macOS, Windows et FreeBSD, et prend en charge C, C++ et Objective-C.

2. Installation

AddressSanitizer ne s'installe pas séparément : il fait partie du compilateur. Vous avez besoin de Clang (version 3.1+) ou GCC (version 4.8+).

Installation du compilateur (exemple pour Ubuntu/Debian) :

sudo apt update
sudo apt install clang-14  # ou g++-11

Pour macOS : Les Xcode Command Line Tools incluent Clang avec ASan.

xcode-select --install

Pour Windows : Utilisez Visual Studio 2019+ (activez le flag /fsanitize=address) ou installez Clang via LLVM.

Vérification de la prise en charge :

clang++ -fsanitize=address --version
g++ -fsanitize=address --version

3. Démarrage rapide — exemple minimal fonctionnel

Créez un fichier example.cpp avec une erreur volontaire (utilisation après libération) :

#include <iostream>

int main() {
    int* p = new int(42);
    delete p;
    std::cout << *p << std::endl;  // Erreur : use-after-free
    return 0;
}

Compilez et exécutez avec ASan :

clang++ -fsanitize=address -g -o example example.cpp
./example

Vous obtiendrez un rapport détaillé avec la ligne, le type d'erreur et la pile d'appels. Sans ASan, le programme pourrait afficher 42 ou planter avec une erreur de segmentation.

4. Méthodes/fonctions/classes principales

AddressSanitizer ne fournit pas d'API à appeler depuis le code : il fonctionne automatiquement. Cependant, il existe des macros et fonctions auxiliaires pour un réglage fin et une intégration. Voici 8 éléments clés.

4.1. __asan_address_is_poisoned()

Signature : int __asan_address_is_poisoned(void const *addr);

Fonction : Vérifie si une zone mémoire est marquée comme "empoisonnée" (inaccessible). Renvoie 1 si l'adresse se trouve dans une zone empoisonnée, sinon 0.

Exemple :

#include <sanitizer/asan_interface.h>
#include <iostream>

int main() {
    int* arr = new int[10];
    arr[5] = 100;
    // Vérifie si l'adresse arr+10 (hors limites du tableau) est empoisonnée
    if (__asan_address_is_poisoned(arr + 10)) {
        st                    

Recommendations