Compartilhar via


Erro: heap-buffer-overflow

Erro do Sanitizador de Endereço: estouro de buffer de heap

Este exemplo demonstra o erro que ocorre quando um acesso à memória ocorre fora dos limites de um objeto alocado em heap.

Exemplo – estouro de buffer de heap clássico

// example1.cpp
// heap-buffer-overflow error
#include <stdlib.h>
#include <string.h>

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

    char *x = (char*)malloc(10 * sizeof(char));
    memset(x, 0, 10);
    int res = x[argc * 10];  // Boom!

    free(x);
    return res;
}

Para compilar e testar esse exemplo, execute estes comandos em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior:

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

Erro resultante

Captura de tela do depurador exibindo erro de estouro de buffer de heap no exemplo 1.

Exemplo – conversão de redução incorreta

// example2.cpp
// heap-buffer-overflow error
class Parent {
public:
    int field;
};

class Child : public Parent {
public:
    int extra_field;
};

int main(void) {
    Parent *p = new Parent;
    Child *c = (Child*)p;  // Intentional error here!
    c->extra_field = 42;

    return 0;
}

Para compilar e testar esse exemplo, execute estes comandos em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior:

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

Exemplo resultante – conversão de redução incorreta

Captura de tela do depurador exibindo erro de estouro de buffer de heap no exemplo 2.

Exemplo – strncpy em heap

// example3.cpp
// heap-buffer-overflow error
#include <string.h>
#include <stdlib.h>

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

    char *hello = (char*)malloc(6);
    strcpy(hello, "hello");

    char *short_buffer = (char*)malloc(9);
    strncpy(short_buffer, hello, 10);  // Boom!

    return short_buffer[8];
}

Para compilar e testar esse exemplo, execute estes comandos em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior:

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

Erro resultante – strncpy em heap

Captura de tela do depurador exibindo erro de estouro de buffer de heap no exemplo 3.

Confira também

Visão geral do AddressSanitizer
Problemas conhecidos do AddressSanitizer
Referência de linguagem e build do AddressSanitizer
Referência de runtime do AddressSanitizer
Bytes de sombra de AddressSanitizer
Nuvem do AddressSanitizer ou teste distribuído
Integração do depurador do AddressSanitizer
Exemplos de erro do AddressSanitizer