1 const int size = 5;
2
3 #include <cstddef>
4 #include <cstdlib>
5 #include <sys/prctl.h>
6
func(int * ptr)7 void func(int *ptr) {
8 int *tmp;
9
10 #if defined __GNUC__ && !defined __INTEL_COMPILER
11 __builtin___bnd_store_ptr_bounds ((void**)&ptr, ptr);
12 #endif
13 tmp = ptr + size - 1;
14 #if defined __GNUC__ && !defined __INTEL_COMPILER
15 __builtin___bnd_store_ptr_bounds ((void**)&tmp, tmp);
16 #endif
17 tmp = (int*)0x2; // Break 2.
18
19 return; // Break 3.
20 }
21
22 int
main(int argc,char const * argv[])23 main(int argc, char const *argv[])
24 {
25 // This call returns 0 only if the CPU and the kernel support
26 // Intel(R) Memory Protection Extensions (Intel(R) MPX).
27 if (prctl(PR_MPX_ENABLE_MANAGEMENT, 0, 0, 0, 0) != 0)
28 return -1;
29
30 int* a = (int *) calloc(size, sizeof(int));
31 #if defined __GNUC__ && !defined __INTEL_COMPILER
32 __builtin___bnd_store_ptr_bounds ((void**)&a, a);
33 #endif
34 func(a); // Break 1.
35
36 free(a); // Break 4.
37
38 return 0;
39 }
40