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

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

Замечания

Включает обнаружение несогласованных операций памяти во время выполнения, которые могут привести к неопределенному поведению, например:

  • mallocдолжен быть связан с free, а не delete .delete[]
  • newдолжен быть связан с delete, а не free .delete[]
  • new[]должен быть связан с delete[], а не delete .free

В Windows alloc-dealloc-mismatch обнаружение ошибок по умолчанию отключено. Чтобы включить ее, задайте переменную set ASAN_OPTIONS=alloc_dealloc_mismatch=1 среды перед запуском программы.

Пример

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

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

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