2014-03-01 2 views
0

Я скопировал и вставил пример malloc__hook из: http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.htmlНе удается скомпилировать пример GNU для malloc__hooks

но когда когда-либо я пытаюсь скомпилировать его, есть ошибка:

hooks.c: 17 : 8: ошибка: конфликтующие типы классификаторов для '__malloc_initialize_hook' В файле, включенном из hooks.c: 4: 0: /usr/include/malloc.h:170:38: примечание: предыдущая декларация '__malloc_initialize_hook' была здесь

Любые идеи о том, что может быть неправильным?

вот мой код:

/* Prototypes for __malloc_hook, __free_hook */ 
#include <stdio.h> 
#include <malloc.h> 

/* Prototypes for our hooks. */ 
static void my_init_hook (void); 
static void *my_malloc_hook (size_t, const void *); 
static void my_free_hook (void*, const void *); 
static void test(); 

/* Variables to save original hooks. */ 
static void *(*old_malloc_hook) (size_t, const void *); 
static void *(*old_free_hook) (void*, const void *); 

/* Override initializing hook from the C library. */ 
void (*__malloc_initialize_hook) (void) = my_init_hook; 

static void my_init_hook (void) 
{ 
    old_malloc_hook = __malloc_hook; 
    old_free_hook = __free_hook; 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
} 

static void * my_malloc_hook (size_t size, const void *caller) 
{ 
    void *result; 
    /* Restore all old hooks */ 
    __malloc_hook = old_malloc_hook; 
    __free_hook = old_free_hook; 
    /* Call recursively */ 
    result = malloc (size); 
    test(); 
    /* Save underlying hooks */ 
    old_malloc_hook = __malloc_hook; 
    old_free_hook = __free_hook; 
    /* printf might call malloc, so protect it too. */ 
    printf ("malloc (%u) returns %p\n", (unsigned int) size, result); 
    /* Restore our own hooks */ 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
    return result; 
} 

static void my_free_hook (void *ptr, const void *caller) 
{ 
    /* Restore all old hooks */ 
    __malloc_hook = old_malloc_hook; 
    __free_hook = old_free_hook; 
    /* Call recursively */ 
    free (ptr); 
    /* Save underlying hooks */ 
    old_malloc_hook = __malloc_hook; 
    old_free_hook = __free_hook; 
    /* printf might call free, so protect it too. */ 
    printf ("freed pointer %p\n", ptr); 
    test(); 
    /* Restore our own hooks */ 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
} 


static void test(){ 
    printf("\ntest function called\n"); 
} 

int main(void) 
{ 
    char *p; 
    p = malloc(10); 
    free(p); 
    return 0; 
} 
+1

Проверьте использование функции на прототипе. – brokenfoot

ответ

0

Я считаю, что вы должны написать:

void (*__MALLOC_HOOK_VOLATILE __malloc_initialize_hook) (void) = my_init_hook; 

Вместо:

void (*__malloc_initialize_hook) (void) = my_init_hook; 

Я испытал это на Debian свистящих и компилирует в настоящее время.

+0

Спасибо, что сработал! – user3369317

Смежные вопросы