mcheck, mcheck_check_all, mcheck_pedantic, mprobe -
проверяет
целостность
кучи
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]