ИМЯ

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(), mprobe() Безвредность в нитях MT-Unsafe race:mcheck 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 <[email protected]>, Alexey <[email protected]>, Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Dmitry Bolkhovskikh <[email protected]>, ITriskTI <[email protected]>, Max Is <[email protected]>, Yuri Kozlov <[email protected]>, Иван Павлов <[email protected]> и Малянов Евгений Викторович <[email protected]>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]

Recommended readings

Pages related to mcheck you should read also: