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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour