89 lines
1.9 KiB
C
89 lines
1.9 KiB
C
|
// This is a program that leaks memory, used for memory leak detector testing.
|
||
|
|
||
|
#include <fcntl.h>
|
||
|
#include <malloc.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
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 <kind-of-leak> [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;
|
||
|
}
|