Erreur : stack-buffer-overflow
Erreur d’assainissement de l’adresse : dépassement de mémoire tampon de la pile
Un dépassement de mémoire tampon de pile peut se produire de nombreuses façons en C ou C++. Nous fournissons plusieurs exemples pour cette catégorie d’erreur que vous pouvez intercepter par une recompilation simple.
Exemple : dépassement de mémoire tampon de pile
// example1.cpp
// stack-buffer-overflow error
#include <string.h>
int main(int argc, char **argv) {
char x[10];
memset(x, 0, 10);
int res = x[argc * 10]; // Boom! Classic stack buffer overflow
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 example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Erreur résultante
Exemple : calcul de la mémoire tampon de pile
// example2.cpp
// stack-buffer-overflow error
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(int argc, char **argv) {
assert(argc >= 2);
int idx = atoi(argv[1]);
char AAA[10], BBB[10], CCC[10];
memset(AAA, 0, sizeof(AAA));
memset(BBB, 0, sizeof(BBB));
memset(CCC, 0, sizeof(CCC));
int res = 0;
char *p = AAA + idx;
printf("AAA: %p\ny: %p\nz: %p\np: %p\n", AAA, BBB, CCC, p);
return *(short*)(p) + BBB[argc % 2] + CCC[argc % 2]; // Boom! ... when argument is 9
}
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 9
Erreur résultante - Calcul de la mémoire tampon de pile
Exemple : cast incorrect sur la pile
// example3.cpp
// stack-buffer-overflow error
class Parent {
public:
int field;
};
class Child : public Parent {
public:
volatile int extra_field;
};
int main(void) {
Parent p;
Child *c = (Child*)&p;
c->extra_field = 42; // Boom !
return (c->extra_field == 42);
}
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 : cast incorrect sur la pile
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