Поделиться через


Ошибка: alloc-dealloc-mismatch

Ошибка санитизатора адресов: несоответствие между api распределения и размещением сделки

alloc/dealloc Функции несоответствия в AddressSanitizer по умолчанию отключены для Windows. Чтобы включить его, запустите set ASAN_OPTIONS=alloc_dealloc_mismatch=1 перед запуском программы. Эта переменная среды проверяется во время выполнения, чтобы сообщить об ошибках malloc/deleteв ,free/new а также .new/delete[]

Пример

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

Чтобы создать и проверить этот пример, выполните следующие команды в командной строке разработчика Visual Studio 2019 версии 16.9 или более поздней:

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

Результирующая ошибка

Снимок экрана: отладчик, отображающий ошибку alloc-dealloc-mismatch в примере 1.

См. также

Обзор AddressSanitizer
Известные проблемы AddressSanitizer
Справочник по сборке и языку AddressSanitizer
Справочник по среде выполнения AddressSanitizer
Теневой байт AddressSanitizer
Облачное или распределенное тестирование AddressSanitizer
Интеграция отладчика AddressSanitizer
Примеры ошибок AddressSanitizer