#include #include #include #include #include #include #include volatile size_t i; void sig(int s) { printf("boom %zu\n", i); exit(1); } void compute(unsigned char *v) { int j = 0; for (i = 0; i < 12000; i++) j += v[i]; printf("%d\n", j); } int main(int argc, char *argv[]) { int fd = open(argv[1], O_RDONLY); if (fd == -1) err(1, "open %s", argv[1]); signal(SIGSEGV, sig); unsigned char *v = mmap(0, 12000, PROT_READ, MAP_FILE, fd, 0); if (v == MAP_FAILED) err(1, "mmap"); printf("go1\n"); compute(v); truncate(argv[1], 0); printf("go2\n"); compute(v); return 0; }