Partager via


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

Capture d’écran du débogueur affichant l’erreur stack-buffer-underflow dans l’exemple 1.

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

Capture d’écran du débogueur affichant l’erreur stack-buffer-underflow dans l’exemple 2.

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