Provided by: manpages-ru-dev_4.18.1-1_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(),              │ Безвредность в нитях │ MT-Unsafe race:mcheck │
       │mcheck_check_all(), 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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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