Udostępnij przez


Błąd: alloc-dealloc-mismatch

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

Uwagi

Umożliwia wykrywanie w czasie wykonywania niezgodnych operacji pamięci, które mogą prowadzić do niezdefiniowanego zachowania, takiego jak:

  • malloc musi być sparowana z parametrem free, nie delete lub delete[].
  • new musi być sparowana z parametrem delete, nie free lub delete[].
  • new[] musi być sparowana z parametrem delete[], nie delete lub free.

W systemie Windows alloc-dealloc-mismatch wykrywanie błędów jest domyślnie wyłączone. Aby ją włączyć, ustaw zmienną środowiskową set ASAN_OPTIONS=alloc_dealloc_mismatch=1 przed uruchomieniem programu.

Przykład

// example1.cpp
// Demonstrate 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;
}

W wierszu polecenia dla deweloperów programu Visual Studio 2019 w wersji 16.9 lub nowszej uruchom następujące polecenia, aby zobaczyć przykład alloc_dealloc_mismatch:

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

Wynik

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