// This is a program that leaks memory, used for memory leak detector testing. #include #include #include #include #include #include #include #include static void generate_leak(const char *kind, int amount) { void *ptr = NULL; if (strcmp(kind, "malloc") == 0) { printf("leaking via malloc, %p\n", malloc(amount)); return; } if (strcmp(kind, "calloc") == 0) { printf("leaking via calloc, %p\n", calloc(amount, 1)); return; } if (strcmp(kind, "realloc") == 0) { printf("leaking via realloc, %p\n", realloc(malloc(10), amount)); return; } if (strcmp(kind, "posix_memalign") == 0) { posix_memalign(&ptr, 512, amount); printf("leaking via posix_memalign, %p\n", ptr); return; } if (strcmp(kind, "valloc") == 0) { printf("leaking via valloc, %p\n", valloc(amount)); return; } if (strcmp(kind, "memalign") == 0) { printf("leaking via memalign, %p\n", memalign(512, amount)); return; } if (strcmp(kind, "pvalloc") == 0) { printf("leaking via pvalloc, %p\n", pvalloc(amount)); return; } if (strcmp(kind, "aligned_alloc") == 0) { printf("leaking via aligned_alloc, %p\n", aligned_alloc(512, amount)); return; } if (strcmp(kind, "no_leak") == 0) { void *ptr = malloc(amount); printf("ptr = %p\n", ptr); free(ptr); return; } printf("unknown leak type '%s'\n", kind); } int main(int argc, char *argv[]) { if (argc < 2) { printf("usage: leak-userspace [amount]\n"); return EXIT_SUCCESS; } const char *kind = argv[1]; int amount = 30; if (argc > 2) { amount = atoi(argv[2]); if (amount < 1) amount = 1; } // Wait for something in stdin to give external detector time to attach. char c; read(0, &c, sizeof(c)); // Do the work. generate_leak(kind, amount); return EXIT_SUCCESS; }