blob: 89e3cadf311e4fa8e56cb78e1cf5c9b401d5296f [file] [log] [blame]
/*
Make sure that leak-check's pointer tracing avoids traps
*/
#include <stdio.h>
#include "memcheck/memcheck.h"
#include <sys/mman.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
const int ptrbits = sizeof(void *) * 8;
const int stepbits = 14;
const int stepsize = (1 << stepbits);
const int nptrs = 1 << (ptrbits - stepbits);
char **volatile ptrs;
int i;
int fd;
char *map;
ptrs = malloc(nptrs * sizeof(char *));
for(i = 0; i < nptrs; i++)
ptrs[i] = (char *)(i << stepbits);
/* lay some traps */
map = mmap(0, stepsize * 2, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
if (map == (char *)-1)
perror("trap 1 failed");
map = mmap(0, stepsize * 2, PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
if (map == (char *)-1)
perror("trap 2 failed");
/* non-zero mmap of a zero-length file -> SIGBUS */
fd = open("./pointer-trace-test-file", O_RDWR | O_CREAT | O_EXCL, 0600);
unlink("./pointer-trace-test-file");
map = mmap(0, stepsize * 2, PROT_WRITE|PROT_READ, MAP_PRIVATE, fd, 0);
if (map == (char *)-1)
perror("trap 3 failed");
//printf("trap 3 = %p-%p\n", map, map+stepsize*2);
map = mmap(0, 256*1024, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
if (map == (char *)-1)
perror("trap 4 failed");
else {
munmap(map, 256*1024);
VALGRIND_MAKE_READABLE(map, 256*1024); /* great big fat lie */
}
VALGRIND_DO_LEAK_CHECK;
ptrs = 0;
return 0;
}