Skip to content

Instantly share code, notes, and snippets.

@FdelMazo
Last active August 1, 2018 13:42
Show Gist options
  • Save FdelMazo/2d22aead6acc46df35a53c331d6272be to your computer and use it in GitHub Desktop.
Save FdelMazo/2d22aead6acc46df35a53c331d6272be to your computer and use it in GitHub Desktop.
Emulador de falsos mallocs. Un wrapper para poder variar entre un malloc normal y uno que devuelva solo NULL
#include "fake_malloc.h"
bool trucho = false;
int MALLOC_TRUCHO(void) { return trucho; }
void *malloc(size_t size) {
if (MALLOC_TRUCHO()) return NULL;
static void * (*func)();
if(!func) func = (void *(*)()) dlsym(RTLD_NEXT, "malloc");
return(func(size));
}
void usar_malloc_trucho() {trucho = true;}
void usar_malloc_original() {trucho = false;}
// Snippet para poder variar entre el uso normal de malloc y un malloc que solo devuelva nulo (emulando que fallo el pedir memoria)
// Compilar sin flag -pedantic y con flag -ldl después de especificar los archivos .c
// No funciona si se compila por separado con objetos. Todo archivo que quiera usar el malloc trucho va a tener que ser compilado junto a fake_malloc.c
// Al usar valgrind no se pueden overridear funciones de la libreria, asi que dara perdida de memoria
// Ejemplo: gcc fake_malloc.c main.c -ldl
// Utilizacion:
// Hacer include de fake_malloc.h
// Para activar el malloc 'trucho', invocar la funcion usar_malloc_trucho(). Todo malloc usado despues de esta funcion devolvera NULL
// Luego, revertir con usar_malloc_original() para dejar todo como estaba. El malloc utilizado luego de esto será el original
#ifndef FAKE_MALLOC_H
#define FAKE_MALLOC_H
#define _GNU_SOURCE
#include <stdbool.h>
#include <dlfcn.h>
#include <stdlib.h>
void usar_malloc_trucho();
void usar_malloc_original();
#endif
// gcc fake_malloc.c main_ejemplo.c -ldl
// ./a.out
#include "fake_malloc.h"
#include <stdio.h>
#include <stdlib.h>
int main (){
void* puntero_real = malloc(10);
usar_malloc_trucho(); // 'Activo' el trucho malloc
void* puntero_falso = malloc(10);
usar_malloc_original(); // 'Desactivo', para utilizar el malloc normal en el resto del archivo
printf("Puntero real apunta a memoria dinámica: %s \n", puntero_real ? "OK" : "ERROR");
printf("Puntero falso apunta a NULL: %s \n", !puntero_falso ? "OK" : "ERROR");
free(puntero_real);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment