Udostępnij za pośrednictwem


Błąd: alloc-dealloc-mismatch

Błąd narzędzia do oczyszczania adresu: niezgodność między interfejsami API alokacji i cofania alokacji

Niezgodność alloc/dealloc funkcji w narzędziu AddressSanitizer jest domyślnie wyłączona dla systemu Windows. Aby ją włączyć, uruchom polecenie set ASAN_OPTIONS=alloc_dealloc_mismatch=1 przed uruchomieniem programu. Ta zmienna środowiskowa jest sprawdzana w czasie wykonywania, aby zgłaszać błędy w systemach malloc/delete,free/new i .new/delete[]

Przykład

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

Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia programu Visual Studio 2019 w wersji 16.9 lub nowszej:

cl example1.cpp /fsanitize=address /Zi
set ASAN_OPTIONS=alloc_dealloc_mismatch=1
devenv /debugexe example1.exe 2

Wynikowy błąd

Zrzut ekranu debugera z wyświetlonym błędem alloc-dealloc-mismatch w przykładzie 1.

Zobacz też

AddressSanitizer — omówienie
Rozwiązywanie znanych problemów z programemSanitizer
Dokumentacja języka i kompilacji narzędzia AddressSanitizer
AddressSanitizer runtime reference (Dokumentacja środowiska uruchomieniowego AddressSanitizer)
Bajty w tle addressSanitizer
AddressSanitizer — chmura lub testowanie rozproszone
Integracja debugera AddressSanitizer
Przykłady błędów addressSanitizer