Provided by: manpages-ru-dev_4.18.1-1_all
ИМЯ
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⟩.