Partilhar via


Erro: alloc-dealloc-mismatch

Erro do sanitizador de endereço: incompatibilidade entre APIs de alocação e desalocação

A funcionalidade de incompatibilidade alloc/dealloc no AddressSanitizer está desativada por padrão para o Windows. Para habilitá-la, execute set ASAN_OPTIONS=alloc_dealloc_mismatch=1 antes de executar o programa. Essa variável de ambiente é verificada em runtime para relatar erros em malloc/delete, new/free e new/delete[].

Exemplo

// example1.cpp
// alloc-dealloc-mismatch error
#include <stdio.h>
#include <stdlib.h>

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

    if (argc != 2) return -1;

    switch (atoi(argv[1])) {

    case 1:
        delete[](new int[10]);
        break;
    case 2:
        delete (new int[10]);      // Boom!
        break;
    default:
        printf("arguments: 1: no error 2: runtime error\n");
        return -1;
    }

    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 example1.cpp /fsanitize=address /Zi
set ASAN_OPTIONS=alloc_dealloc_mismatch=1
devenv /debugexe example1.exe 2

Erro resultante

Captura de tela do depurador exibindo o erro alloc-dealloc-mismatch no exemplo 1.

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