Partager via


Erreur : double-free

Erreur d’assainissement de l’adresse : désallocation de la mémoire libérée

En C, vous pouvez appeler free par erreur. En C++, vous pouvez appeler delete plusieurs fois. Dans ces exemples, nous affichons des erreurs avec delete, freeet HeapCreate.

Exemple C++ - double operator delete

// example1.cpp
// double-free error
int main() {

    int *x = new int[42];
    delete [] x;

    // ... some complex body of code

    delete [] x;
    return 0;
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Erreur résultante - double operator delete

Capture d’écran du débogueur affichant une erreur double libre dans l’exemple 1.

Exemple 'C' - double free

// example2.cpp
// double-free error
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {

    char* x = (char*)malloc(10 * sizeof(char));
    memset(x, 0, 10);
    int res = x[argc];
    free(x);

    // ... some complex body of code

    free(x + argc - 1);  // Boom!
    return res;
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

Erreur résultante - double free

Capture d’écran du débogueur affichant une erreur double libre dans l’exemple 2.

Exemple - Double Windows HeapCreateHeapFree

// example3.cpp
// double-free error
#include <Windows.h>
#include <stdio.h>

int main() {
    void* newHeap = HeapCreate(0, 0, 0);
    void* newAlloc = HeapAlloc(newHeap, 0, 100);

    HeapFree(newHeap, 0, newAlloc);
    HeapFree(newHeap, 0, newAlloc);
    printf("failure\n");
    return 1;
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

Erreur résultante - Double Windows HeapCreateHeapFree

Capture d’écran du débogueur affichant une erreur double libre dans l’exemple 3.

Voir aussi

Vue d’ensemble de AddressSanitizer
Résoudre les problèmes connus liés à AddressSanitizer
Référence de build et de langage AddressSanitizer
Informations de référence sur le runtime AddressSanitizer
Octets d’ombre AddressSanitizer
Test cloud ou distribué AddressSanitizer
Intégration du débogueur AddressSanitizer
Exemples d’erreur AddressSanitizer