Bagikan melalui


Kesalahan: dynamic-stack-buffer-overflow

Kesalahan Pembersih Alamat: dynamic-stack-buffer-overflow

Komentar

Contoh ini menunjukkan kesalahan yang dihasilkan dari akses buffer di luar batas objek yang dialokasikan tumpukan.

Contoh - alloca luapan (kanan)

// example1.cpp
// dynamic-stack-buffer-overflow error
#include <malloc.h>

__declspec(noinline)
void foo(int index, int len) {

    volatile char *str = (volatile char *)_alloca(len);

    //    reinterpret_cast<long>(str) & 31L;

    str[index] = '1'; // Boom !
}

int main(int argc, char **argv) {

    foo(33, 10);
    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
devenv /debugexe example1.exe

Kesalahan yang dihasilkan

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

Contoh - alloca luapan (kiri)

// example2.cpp
// dynamic-stack-buffer-overflow error
#include <malloc.h>

__declspec(noinline)
void foo(int index, int len) {

    volatile char *str = (volatile char *)_alloca(len);

    str[index] = '1';  // Boom!
}

int main(int argc, char **argv) {
    foo(-1, 10);
    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 - alloca luapan (kiri)

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

Contoh - beberapa panggilan ke alloca

// example3.cpp
// dynamic-stack-buffer-overflow error
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define SIZE 7
extern void nothing();
int x=13,*aa,*bb,y=0;
int fail = 0;
int tmp;

int main()
{
    int* cc;
    int i;
    int k = 17;
    __try {
        tmp = k;
        aa = (int*)_alloca(SIZE * sizeof(int));
        if (((int)aa) & 0x3)
            fail = 1;
        for (i = 0; i < SIZE; i++) {
            aa[i] = x + 1 + i;
        }
        bb = (int*)_alloca(x * sizeof(int));
        if (((int)bb) & 0x3)
            fail = 1;

        for (i = 0; i < x; i++) {
            bb[i] = 7;
            bb[i] = bb[i] + i;
        }
        {
            int s = 112728283;
            int ar[8];
            for (i = 0; i < 8; i++)
                ar[i] = s * 17 * i;
        }

        cc = (int*)_alloca(x);
        if (((int)cc) & 0x3)
            fail = 1;

        cc[0] = 0;
        cc[1] = 1;
        cc[2] = 2;
        cc[3] = 3;             // <--- Boom!
        for (i = 0; i < x; i++)
            if (bb[i] != (7 + i))
                fail = 1;
        if (tmp != k)
            fail = 1;
        if (fail) {
            printf("fail\n");
            exit(7);
        }
        printf("%d\n", (*cc) / y);
        printf("fail\n");
        exit(7);
    }
    __except (1)
    {
        for (i = 0; i < SIZE; i++)
            if (aa[i] != (x + i + 1))
                fail = 1;
        if (fail) {
            printf("fail\n");
            exit(7);
        }
        printf("pass\n");
        exit(0);
    }
}

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

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

Mengakibatkan kesalahan - beberapa panggilan ke alloca

Cuplikan layar debugger yang menampilkan kesalahan dynamic-stack-buffer-overflow dalam contoh 3.

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