mcheck(3)

НАИМЕНОВАНИЕ
mcheck, mcheck_check_all, mcheck_pedantic, mprobe - проверяет целостность кучи

БИБЛИОТЕКА
Standard C library (libc, -lc)

ОБЗОР
#include <mcheck.h>

int mcheck(typeof(void (enum mcheck_status mstatus)) *abortfunc);
int mcheck_pedantic(
           typeof(void (enum mcheck_status mstatus)) *abortfunc);
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.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
mcheck(), mcheck_pedantic(), mcheck_check_all(), mprobe() | Безвредность в нитях | MT-Unsafe race:mcheck const:malloc_hooks

СТАНДАРТЫ
GNU.

ИСТОРИЯ

mcheck_pedantic()
mcheck_check_all()
    glibc 2.2.

mcheck()
mprobe()
    glibc 2.0.

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

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

    $ ./a.out
    About to free

    About to free a second time
    block freed twice
    Aborted (core dumped)

  Исходный код программы
    #include <mcheck.h>
    #include <stdio.h>
    #include <stdlib.h>

    int
    main(void)
    {
        char *p;

        if (mcheck(NULL) != 0) {
            fprintf(stderr, "mcheck() failed\n");

            exit(EXIT_FAILURE);
        }

        p = malloc(1000);

        fprintf(stderr, "About to free\n");
        free(p);
        fprintf(stderr, "\nAbout to free a second time\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> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).