NAME

mcheck, mcheck_check_all, mcheck_pedantic, mprobe - 힙 일관성 검사

SYNOPSIS

#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);

DESCRIPTION

mcheck() 함수는 malloc(3) 계열 메모리 할당 함수들에 디버깅 훅을 설치한다. 그러면 힙 상태에 대한 무모순성 검사 몇 가지를 수행하게 된다. 그 검사를 통해 메모리 블록을 여러 번 해제하거나 할당 메모리 블록 바로 앞의 관리용 자료 구조를 오염시키는 것 같은 응용 오류를 탐지할 수 있다.

효과가 있으려면 malloc(3) 내지 관련 함수를 처음 호출하기 전에 mcheck() 함수를 호출해야 한다. 그렇게 하는 게 어려운 경우에는 -lmcheck로 프로그램을 링크 하면 메모리 할당 함수 최초 호출 앞에 묵시적인 mcheck() 호출이 (NULL 인자로) 들어간다.

mcheck_pedantic() 함수는 mcheck()와 비슷하되 메모리 할당 함수들 중 하나를 호출할 때마다 모든 할당 블록에 대해 검사를 수행한다. 아주 느릴 수 있다!

mcheck_check_all() 함수는 모든 할당 블록에 대해 즉시 검사를 수행하게 한다. 이 호출은 앞서 mcheck()를 호출했을 때만 효과가 있다.

힙에서 모순성을 탐지하면 abortfunc가 가리키는 호출자 제공 함수를 시스템에서 부른다. 유일한 인자 mstatus는 탐지한 모순성 종류를 나타낸다. abortfunc가 NULL인 경우 기본 함수에서는 stderr로 오류 메시지를 찍고 abort(3)를 호출한다.

mprobe() 함수는 ptr이 가리키는 할당 메모리 블록에 대해 무모순성 검사를 수행한다. 앞서 mcheck() 함수를 호출했어야 한다. (안 그러면 mprobe()MCHECK_DISABLED를 반환한다.)

다음은 mprobe()가 반환하거나 abortfunc 호출 시 mstatus 인자로 전달되는 값들에 대한 설명이다.

MCHECK_DISABLED (mprobe() 한정)
메모리 할당 함수를 처음 호출하기 전에 mcheck()를 호출하지 않았다. 무모순성 검사가 불가능하다.
MCHECK_OK (mprobe() 한정)
모순성을 탐지하지 못했다.
MCHECK_HEAD
할당 블록 앞의 메모리가 손상됐다.
MCHECK_TAIL
할당 블록 뒤의 메모리가 손상됐다.
MCHECK_FREE
메모리 블록을 두 번 해제했다.

RETURN VALUE

mcheck()mcheck_pedantic()은 성공 시 0을 반환하고 오류 시 -1을 반환한다.

VERSIONS

glibc 2.2부터 mcheck_pedantic()mcheck_check_all() 함수가 사용 가능하다. 적어도 glibc 2.0부터 mcheck()mprobe() 함수가 존재한다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
mcheck(), mcheck_pedantic(),
mcheck_check_all(), mprobe()
스레드 안전성 MT-Unsafe race:mcheck
const:malloc_hooks

CONFORMING TO

이 함수들은 GNU 확장이다.

NOTES

프로그램을 -lmcheck로 링크 하는 방식과 MALLOC_CHECK_ 환경 변수(mallopt(3)에서 설명)를 쓰는 방식에서 탐지하는 오류 종류는 같다. 하지만 MALLOC_CHECK_ 방식에서는 응용을 다시 링크할 필요가 없다.

EXAMPLES

아래 프로그램은 NULL 인자로 mcheck()를 호출하고서 같은 메모리 블록을 두 번 해제한다. 다음 셸 세션은 프로그램이 돌 때 어떻게 되는지 보여 준다.

$ ./a.out
About to free

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

프로그램 소스

#include <stdlib.h>
#include <stdio.h>
#include <mcheck.h>

int
main(int argc, char *argv[])
{
    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);
}

SEE ALSO

malloc(3), mallopt(3), mtrace(3)


2021-03-22