Я заметил, что мой компилятор C (gcc) позволит мне делать такие вещи, как:
#include <stdio.h>
main(){
short m[32768];
short y = -1;
short z = -1;
printf("%u\n", y);
m[y] = 12;
printf("%d\n%d\n", y, m[z]);
}
Когда я запускаю его, он выплевывает:
4294967295
12
12
Что мне кажется немного озадаченным.
Прежде всего, безопасно ли мне запускать такие программы? Есть ли вероятность, что я случайно напишу поверх операционной системы (я использую OS X в случае, если это актуально)?
Кроме того, я ожидал, по крайней мере, какой-то ошибки segfault, с которой я столкнулся в прошлом, но тихо игнорируя такую ошибку, действительно меня пугает. Почему эта программа не меняет на меня?
И, наконец, из любопытства (это может быть самый глупый вопрос), есть ли метод безумия? Могу ли я ожидать, что все компиляторы ANSI C будут работать таким образом? Как насчет gcc на разных платформах? Является ли макет памяти четко определенным, что он может быть использован (возможно, если вы собираетесь писать кросс-платформенный обфускационный код)?