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
, free
et 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
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
Exemple - Double Windows HeapCreate
HeapFree
// 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 HeapCreate
HeapFree
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