Bagikan melalui


Kesalahan: stack-buffer-underflow

Kesalahan Penyanitasi Alamat: Aliran bawah buffer tumpukan

Komentar

Pesan kesalahan ini menunjukkan akses memori ke suatu tempat sebelum awal variabel tumpukan.

Contoh - aliran bawah array lokal

// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>

int main() {

    int subscript = -1;
    char buffer[42];
    buffer[subscript] = 42; // Boom!
   
    return 0;
}

Untuk membuat dan menguji contoh ini, jalankan perintah ini di perintah Visual Studio 2019 versi 16.9 atau yang lebih baru:

cl example1.cpp /fsanitize=address /Zi /Od
devenv /debugexe example1.exe

ASAN adalah bentuk analisis dinamis, yang berarti hanya dapat mendeteksi kode buruk yang benar-benar dijalankan. Pengoptimal akan menghapus tugas buffer[subscript] karena buffer[subscript] tidak pernah dibaca. Akibatnya, contoh ini memerlukan /Od bendera.

Kesalahan yang dihasilkan

Cuplikan layar debugger yang menampilkan kesalahan stack-buffer-underflow dalam contoh 1.

Contoh - tumpukan aliran bawah pada utas

// 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;
}

Untuk membuat dan menguji contoh ini, jalankan perintah ini di perintah Visual Studio 2019 versi 16.9 atau yang lebih baru:

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

Kesalahan yang dihasilkan - stack underflow pada utas

Cuplikan layar debugger yang menampilkan kesalahan stack-buffer-underflow dalam contoh 2.

Lihat juga

Gambaran umum AddressSanitizer
Masalah yang diketahui AddressSanitizer
Referensi bahasa dan build AddressSanitizer
Referensi runtime AddressSanitizer
Byte bayangan AddressSanitizer
AddressSanitizer cloud atau pengujian terdistribusi
Integrasi debugger AddressSanitizer
Contoh kesalahan AddressSanitizer