• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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