Sdílet prostřednictvím


Chyba: alloc-dealloc-mismatch

Chyba sanitizátoru: Neshoda mezi rozhraními API přidělení a přidělením

Funkce alloc/dealloc neshody v AddressSanitizeru je ve výchozím nastavení pro Windows vypnutá. Pokud ho chcete povolit, spusťte set ASAN_OPTIONS=alloc_dealloc_mismatch=1 ho před spuštěním programu. Tato proměnná prostředí je kontrolována za běhu za účelem hlášení chyb na mallocnewfreedelete//, a .new/delete[]

Příklad

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

Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:

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

Výsledná chyba

Snímek obrazovky ladicího programu zobrazující chybu neshody přidělení přidělení v příkladu 1

Viz také

Přehled AddressSanitizer
Známé problémy s addressSanitizerem
Referenční dokumentace k sestavení a jazyku AddressSanitizer
Referenční informace k modulu runtime AddressSanitizer
Stínové bajty AddressSanitizer
AddressSanitizer – cloud nebo distribuované testování
Integrace ladicího programu AddressSanitizer
Příklady chyb AddressSanitizer