#include #include #include "memory.h" /* valeur du canary poru la question 2.1 */ #define CANARY_VALUE 0x42 /* calcule l'offset du champ 'r' dans la structure 'type' */ #define OFFSET(type, r) ((size_t)(&((type*)0)->r)) /* calcule la taille du champ 'r' dans la structure 'type' */ #define SIZEOF(type, r) (sizeof(((type*)0)->r)) /* calcule ptr + offset */ #define COMPUTE_ADDRESS(ptr, offset) (((unsigned char*)(ptr))+(offset)) struct memory_block { size_t buffer_size; /* taille du buffer demande par l'application */ char canary; int data; /* debut du buffer de l'application */ }; /* chaque bloc mémoire alloué est organisé ainsi : * ------------------------------------------------- *| buffer_size | data | *| | (ou buffer) | * ------------------------------------------------- */ void* monMalloc(size_t size) { /* taille a allouer = taille demandée + taille des données utilisées par libmemory */ size_t total_size = size + OFFSET(struct memory_block, data); struct memory_block * ptr = malloc(total_size); ptr->buffer_size = size; ptr->canary = CANARY_VALUE; fprintf(stderr, "[Memory] allocation d'un bloc de %ld octets\n", ptr->buffer_size); /* le buffer retourné commence à l'adresse du champs data */ return &ptr->data; } void monFree(void* ptr) { /* on recupère l'adresse du buffer retourné par malloc*/ size_t header_size = OFFSET(struct memory_block, data); struct memory_block *p_buffer = (struct memory_block *) COMPUTE_ADDRESS(ptr, -header_size); fprintf(stderr, "[Memory] liberation d'un bloc de %ld octets\n", p_buffer->buffer_size); if(p_buffer->canary != CANARY_VALUE) { fprintf(stderr, "[Memory] attention! canary écrasé (%x au lieu de %x)\n", p_buffer->canary, CANARY_VALUE); abort(); } free(p_buffer); }