Last time I asked how can I generate segmentation
fault in a program by bypassing the compiler’s promise of not overwriting the const
memory. User Marco Bonelli described the following way, which worked perfectly.
const static int global = 123; int main(void) { int *ptr = (int *)&global; *ptr = 456; // or, equivalent const int *ptr2 = &global; *(int *)ptr2 = 456; }
Either way I was able to generate segmentation fault.
-
int *ptr = (int *)&global; *ptr = 456;
-
const int *ptr2 = &global; *(int *)ptr2 = 456;
Now my question is what is it that is preventing the pointer from writing to a global const
block of memory but not to the local const
block of memory. For example, in the below code I was able to write to the const
block of memory without any issue.
#include <stdio.h> int main(void) { const int local = 123; int *ptr = (int *)&local; *ptr = 456; // how come this be possible? printf("%dn", local); // -> 456 // or, equivalent const int *ptr2 = &local; *(int *)ptr2 = 512; // how come this be possible? printf("%dn", local); // -> 512 }
I’m curious about knowing how this happened. Please enlighten me.
If it matters, I’m using gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
.