Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       mcheck, mcheck_check_all, mcheck_pedantic, mprobe - проверяет целостность кучи

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <mcheck.h>

       int mcheck(void (*abortfunc)(enum mcheck_status mstatus));
       int mcheck_pedantic(void (*abortfunc)(enum mcheck_status mstatus));
       void mcheck_check_all(void);

       enum mcheck_status mprobe(void *ptr);

ОПИСАНИЕ

       Функция  mcheck()  устанавливает  набор  отладочных ловушек (hooks) на семейство функций выделения памяти
       malloc(3).  Эти  ловушки  выполняют  определённые  проверки  целостности   состояния   кучи.   Проверками
       обнаруживаются  следующие  ошибки  приложения: многократное освобождение одного блока памяти, повреждение
       структур данных служебной информации, расположенных непосредственно перед блоком выделенной памяти.

       Для эффективной работы функция mcheck() должна вызываться перед первым  вызовом  malloc(3)  или  подобной
       функции.  В  случаях,  когда  это  трудно проверить, компоновка программы с параметром -lmcheck вставляет
       неявный вызов mcheck() (с аргументом NULL) перед первым вызовом функции выделения памяти.

       Функция mcheck_pedantic() похожа на mcheck(), но выполняет проверку всех выделенных  блоков  каждый  раз,
       когда вызывается функция выделения памяти. Она может работать очень медленно!

       Функция  mcheck_check_all()  выполняет немедленную проверку всех выделенных блоков. Этот вызов эффективно
       работает только, если перед этим была вызвана mcheck().

       Если система обнаруживает целостность кучи, то вызывается функция, которую указал вызывающий в  abortfunc
       с  единственным  аргументом  mstatus,  который  показывает,  какой тип рассогласованности обнаружен. Если
       abortfunc равно NULL, то функция по умолчанию печатает сообщение об ошибке в stderr и вызывает abort(3).

       Функция mprobe() выполняет проверку целостности блока выделенной памяти, на который указывает ptr.  Перед
       этим должна вызываться функция mcheck() (в противном случае mprobe() возвращает MCHECK_DISABLED).

       Далее  перечислены  значения,  возвращаемые  mprobe()  или  передаваемые  в  аргументе mstatus при вызове
       abortfunc:

       MCHECK_DISABLED (только mprobe())
              Не вызвана функция mcheck() до первого вызова функции выделения  памяти.  Проверка  несоответствий
              невозможна.

       MCHECK_OK (только mprobe())
              Никаких несоответствий не обнаружено.

       MCHECK_HEAD
              Память, предшествующая выделенному блоку, была затёрта.

       MCHECK_TAIL
              Память после выделенного блока была затёрта.

       MCHECK_FREE
              Блок памяти был освобожден дважды.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении mcheck()  и mcheck_pedantic() возвращают 0, а в случае ошибки возвращают -1.

ВЕРСИИ

       Функции  mcheck_pedantic() и mcheck_check_all() доступны начиная с glibc 2.2. Функции mcheck() и mprobe()
       появились, как минимум, начиная с glibc 2.0.

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).
       ┌────────────────────────────────────────────────────────┬──────────────────────┬───────────────────────┐
       │ ИнтерфейсАтрибутЗначение              │
       ├────────────────────────────────────────────────────────┼──────────────────────┼───────────────────────┤
       │ mcheck(), mcheck_pedantic(), mcheck_check_all(),       │ Безвредность в нитях │ MT-Unsafe race:mcheck │
       │ mprobe()                                               │                      │ const:malloc_hooks    │
       └────────────────────────────────────────────────────────┴──────────────────────┴───────────────────────┘

СТАНДАРТЫ

       Эти функции являются расширениями GNU.

ЗАМЕЧАНИЯ

       Компоновка программы с -lmcheck и использование переменной окружения MALLOC_CHECK_ (описана в mallopt(3))
       обнаруживают ошибки схожим образом. Но при использовании  MALLOC_CHECK_  не  требуется  перекомпоновывать
       приложение.

ПРИМЕРЫ

       Программа,  представленная  ниже,  вызывает  mcheck() с аргументом NULL и затем освобождает один и тот же
       блок дважды. В следующем сеансе оболочки показано что случается при запуске программы:

           $ ./a.out
           Освобождаем

           Освобождаем второй раз
           блок освобождён дважды
           Aborted (core dumped)

   Исходный код программы

       #include <mcheck.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
           char *p;

           if (mcheck(NULL) != 0) {
               fprintf(stderr, "ошибка mcheck()\n");

               exit(EXIT_FAILURE);
           }

           p = malloc(1000);

           fprintf(stderr, "Освобождаем\n");
           free(p);
           fprintf(stderr, "\nОсвобождаем второй раз\n");
           free(p);

           exit(EXIT_SUCCESS);
       }

СМ. ТАКЖЕ

       malloc(3), mallopt(3), mtrace(3)

ПЕРЕВОД

       Русский  перевод   этой   страницы   руководства   был   сделан   aereiae   <aereiae@gmail.com>,   Alexey
       <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>,
       Dmitry  Bolkhovskikh  <d20052005@yandex.ru>,  ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>,
       Yuri  Kozlov  <yuray@komyakino.ru>,  Иван  Павлов  <pavia00@gmail.com>  и  Малянов   Евгений   Викторович
       <maljanow@outlook.com>

       Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
       или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
       на man-pages-ru-talks@lists.sourceforge.net.

Linux man-pages 6.03                           15 декабря 2022 г.                                      mcheck(3)