void *malloc(size_t size) { // Ces 2 variables sont déclarées, initialisées et utilisées dans tests.c // Afin de pouvoir y accéder, on y ajoute le mot-clé extern extern int nb_times_malloc_used; extern int let_malloc_fail; nb_times_malloc_used++; //On enregistre le nombre d'utilisations de malloc if (let_malloc_fail) //Si let_malloc_fail != 0, on impose que malloc échoue return NULL; // On déclare un pointeur vers une fonction qui a le même prototype void *(*original_malloc) (size_t size); // On crée une copie du pointeur vers la fonction malloc originale original_malloc = dlsym(RTLD_NEXT, "malloc"); // On exécute la fonction malloc originale, car exécuter malloc(size) // reviendrait à faire un appel récursif infini ... void *ptr = original_malloc(size); if (ptr == NULL) // Dans le cas où malloc aurait réellement échoué return NULL; // On impose que le bloc mémoire n'ait pas déjà des valeurs nulles memset(ptr, 42, size); return ptr; }
void *malloc (size_t size){ void *mem = original_malloc(size); if(fileo==1){ locs[max]=mem; sizes[max]=size; max++; } return mem; }
void *my_malloc(const int size) { void *ret; int siz; if (size <= 0) allocs_fatal("my_malloc size is <= 0"); ret = original_malloc(size); if (!ret) allocs_fatal("malloc failed"); bzero(ret, size); siz = malloc_usable_size(ret); if (size < siz) bzero(ret + size, siz - size); #ifdef DEBUG register_atexit(); RSTree_put_val(allocs_tree, (int)ret, siz); memop++; #endif /* DEBUG */ return ret; }
/* Interposed malloc which optionally calls another function. */ void * malloc (size_t size) { interposed_malloc_called = true; static void *(*original_malloc) (size_t); if (original_malloc == NULL) { static bool in_initialization; if (in_initialization) { const char *message = "error: malloc called recursively during initialization\n"; (void) write (STDOUT_FILENO, message, strlen (message)); _exit (2); } in_initialization = true; original_malloc = (__typeof (original_malloc)) dlsym (RTLD_NEXT, "malloc"); if (original_malloc == NULL) { const char *message = "error: dlsym for malloc failed\n"; (void) write (STDOUT_FILENO, message, strlen (message)); _exit (2); } } if (call_function) { call_function = false; call_func (DSO1, FUNC1); call_function = true; } return original_malloc (size); }