// uaf.c — uso después de liberar (use-after-free).
// p queda como puntero colgante (dangling pointer) tras free().
//   valgrind ./uaf
#include <stdio.h>
#include <stdlib.h>

struct account {
    int id;
    int balance;
};

static void close_account(struct account *a) {
    free(a);   // libera, pero el llamador conserva el puntero
}

int main(void) {
    struct account *a = malloc(sizeof(*a));
    if (a == NULL)
        return 1;
    a->id = 1;
    a->balance = 100;
    close_account(a);
    printf("saldo: %d\n", a->balance);   // lectura de memoria liberada
    return 0;
}
