Erreur : stack-buffer-underflow
Erreur d’assainissement de l’adresse : sous-flux de mémoire tampon de pile
Ces messages d’erreur indiquent un accès en mémoire à quelque part avant le début d’une variable de pile.
Exemple : sous-flux de tableau local
// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>
int main() {
int subscript = -1;
char buffer[42];
buffer[subscript] = 42; // Boom!
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 /Od
devenv /debugexe example1.exe
ASAN est une forme d’analyse dynamique, ce qui signifie qu’il ne peut détecter que le code incorrect qui est réellement exécuté. Un optimiseur supprime l’affectation car buffer[subscript]
buffer[subscript]
il n’est jamais lu. Par conséquent, cet exemple nécessite l’indicateur /Od
.
Erreur résultante
Exemple : sous-flux de pile sur le thread
// example2.cpp
// stack-buffer-underflow error
#include <windows.h>
DWORD WINAPI thread_proc(void *) {
int subscript = -1;
volatile char stack_buffer[42];
stack_buffer[subscript] = 42;
return 0;
}
int main() {
HANDLE thr = CreateThread(NULL, 0, thread_proc, NULL, 0, NULL);
if (thr == 0) return 0;
WaitForSingleObject(thr, INFINITE);
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 example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
Erreur résultante : sous-flux de pile sur le thread
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