blob: 89e3cadf311e4fa8e56cb78e1cf5c9b401d5296f [file] [log] [blame]
sewardjcbdddcf2005-03-10 23:23:45 +00001/*
2 Make sure that leak-check's pointer tracing avoids traps
3 */
4
5#include <stdio.h>
6#include "memcheck/memcheck.h"
7#include <sys/mman.h>
8#include <stdlib.h>
9#include <fcntl.h>
10#include <unistd.h>
11
12int main()
13{
14 const int ptrbits = sizeof(void *) * 8;
15 const int stepbits = 14;
16 const int stepsize = (1 << stepbits);
17 const int nptrs = 1 << (ptrbits - stepbits);
18
19 char **volatile ptrs;
20 int i;
21 int fd;
22 char *map;
23
24 ptrs = malloc(nptrs * sizeof(char *));
25 for(i = 0; i < nptrs; i++)
26 ptrs[i] = (char *)(i << stepbits);
27
28 /* lay some traps */
29 map = mmap(0, stepsize * 2, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
30 if (map == (char *)-1)
31 perror("trap 1 failed");
32
33 map = mmap(0, stepsize * 2, PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
34 if (map == (char *)-1)
35 perror("trap 2 failed");
36
37 /* non-zero mmap of a zero-length file -> SIGBUS */
38 fd = open("./pointer-trace-test-file", O_RDWR | O_CREAT | O_EXCL, 0600);
39 unlink("./pointer-trace-test-file");
40
41 map = mmap(0, stepsize * 2, PROT_WRITE|PROT_READ, MAP_PRIVATE, fd, 0);
42 if (map == (char *)-1)
43 perror("trap 3 failed");
44 //printf("trap 3 = %p-%p\n", map, map+stepsize*2);
45
46 map = mmap(0, 256*1024, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
47 if (map == (char *)-1)
48 perror("trap 4 failed");
49 else {
50 munmap(map, 256*1024);
51 VALGRIND_MAKE_READABLE(map, 256*1024); /* great big fat lie */
52 }
53
54 VALGRIND_DO_LEAK_CHECK;
55
56 ptrs = 0;
57
58 return 0;
59}