1 #include <testing/memchk.h>
4 #include <lunaix/ds/llist.h>
6 extern void *malloc(size_t);
7 extern void *calloc(size_t, size_t);
8 extern void free(void*);
10 struct valloc_stats valloc_stat = { };
11 static DEFINE_LLIST(records);
14 struct llist_header link;
20 memchk_log_alloc(unsigned long addr, unsigned long size)
22 valloc_stat.alloced += size;
23 valloc_stat.nr_valloc_calls++;
25 struct addr_record *record;
27 record = malloc(sizeof(struct addr_record));
31 llist_append(&records, &record->link);
35 memchk_log_free(unsigned long addr)
37 valloc_stat.nr_vfree_calls++;
39 struct addr_record *pos, *n;
40 llist_for_each(pos, n, &records, link)
42 if (pos->addr == addr) {
43 valloc_stat.freed += pos->size;
44 llist_delete(&pos->link);
51 printf("[\x1b[33;49mWARN\x1b[0m] freeing undefined pointer: 0x%lx\n", addr);
60 leaked = valloc_stat.alloced - valloc_stat.freed;
61 printf("valloc() statistics:\n");
62 printf(" allocated: %lu bytes\n", valloc_stat.alloced);
63 printf(" freed: %lu bytes\n", valloc_stat.freed);
64 printf(" leaked: %lu bytes\n", leaked);
65 printf(" vfree_call: %u times\n", valloc_stat.nr_vfree_calls);
66 printf(" valloc_call: %u times\n", valloc_stat.nr_valloc_calls);
70 printf("[\x1b[33;49mWARN\x1b[0m] memory leakage detected\n");