1 /* Test different kinds of addressability and definedness */
2 #include "../memcheck.h"
3 #include "tests/sys_mman.h"
5 #include <sys/resource.h>
15 static char *mm(char *addr
, int size
, int prot
)
17 int flags
= MAP_PRIVATE
| MAP_ANONYMOUS
;
23 ret
= mmap(addr
, size
, prot
, flags
, -1, 0);
24 if (ret
== (char *)-1) {
25 perror("mmap failed");
32 /* Case 1 - mmaped memory is defined */
35 char *m
= mm(0, pgsz
* 5, PROT_READ
);
37 (void) VALGRIND_CHECK_MEM_IS_DEFINED(m
, pgsz
*5); /* all defined */
40 /* Case 2 - unmapped memory is unaddressable+undefined */
43 char *m
= mm(0, pgsz
* 5, PROT_READ
|PROT_WRITE
);
44 (void) VALGRIND_CHECK_MEM_IS_DEFINED(m
, pgsz
*5); /* all OK */
46 munmap(&m
[pgsz
*2], pgsz
);
48 (void) VALGRIND_CHECK_MEM_IS_DEFINED(&m
[pgsz
*2], pgsz
); /* undefined */
50 /* XXX need a memcheck request to test addressability */
51 m
[pgsz
*2] = 'x'; /* unmapped fault */
54 /* Case 3 - memory definedness doesn't survive remapping */
57 char *m
= mm(0, pgsz
* 5, PROT_READ
|PROT_WRITE
);
59 (void) VALGRIND_MAKE_MEM_UNDEFINED(&m
[pgsz
], pgsz
);
60 mm(&m
[pgsz
], pgsz
, PROT_READ
);
61 (void) VALGRIND_CHECK_MEM_IS_DEFINED(&m
[pgsz
], pgsz
); /* OK */
64 /* Case 4 - mprotect doesn't affect addressability */
67 char *m
= mm(0, pgsz
* 5, PROT_READ
|PROT_WRITE
);
69 mprotect(m
, pgsz
, PROT_WRITE
);
70 (void) VALGRIND_CHECK_MEM_IS_DEFINED(m
, pgsz
); /* OK */
73 mprotect(m
, pgsz
*5, PROT_NONE
);
74 m
[55] = 'x'; /* permission fault, but no tool complaint */
77 /* Case 5 - mprotect doesn't affect definedness */
80 char *m
= mm(0, pgsz
* 5, PROT_READ
|PROT_WRITE
);
82 (void) VALGRIND_MAKE_MEM_UNDEFINED(m
, pgsz
*5);
84 (void) VALGRIND_CHECK_MEM_IS_DEFINED(m
, 10); /* OK */
85 (void) VALGRIND_CHECK_MEM_IS_DEFINED(m
+10, 10); /* BAD */
87 mprotect(m
, pgsz
*5, PROT_NONE
);
88 mprotect(m
, pgsz
*5, PROT_READ
);
90 (void) VALGRIND_CHECK_MEM_IS_DEFINED(m
, 10); /* still OK */
91 (void) VALGRIND_CHECK_MEM_IS_DEFINED(m
+20, 10); /* BAD */
104 static const int n_tests
= sizeof(tests
)/sizeof(*tests
);
108 static const struct rlimit zero
= { 0, 0 };
111 pgsz
= getpagesize();
112 setvbuf(stdout
, NULL
, _IOLBF
, 0);
114 setrlimit(RLIMIT_CORE
, &zero
);
116 for(i
= 0; i
< n_tests
; i
++) {
131 printf("Test %d: ", i
+1);
134 while((ret
= waitpid(pid
, &status
, 0)) != pid
) {
135 if (errno
!= EINTR
) {
140 if (WIFSIGNALED(status
)) {
141 assert(WTERMSIG(status
) != 0);
143 if (1 == tests
[i
].faults
&&
144 (WTERMSIG(status
) == SIGSEGV
||
145 WTERMSIG(status
) == SIGBUS
))
148 printf("died with unexpected signal %d\n",
150 } else if (WIFEXITED(status
)) {
151 if (WEXITSTATUS(status
) == 0) {
152 if (tests
[i
].faults
== 0)
155 printf("exited without expected SIGSEGV or SIGBUS signal\n");
157 printf("exited with unexpected status %d\n",
158 WEXITSTATUS(status
));
160 printf("strange status %x?\n", status
);