Какой механизм обнаруживает доступ к нераспределенной памяти? - PullRequest
4 голосов
/ 10 декабря 2011

Время от времени у меня будет ошибка, например, следующая:

unsigned int* x = calloc(2000, sizeof(unsigned int));

printf("%d", x[2000]);

Я вышел за пределы выделенной области, поэтому я получаю сигнал EXC_BAD_ACCESS во время выполнения. Мой вопрос: как это обнаружено? Кажется, что это просто бесшумно вернуло бы мусор, так как у меня только один байт, а не, скажем, полная страница. Какая часть системы мешает мне просто вернуть мусорный байт в x + 2000?

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Система памяти имеет значения стража в начале и конце своих полей памяти, помимо ваших выделенных байтов.Когда вы освобождаете память, она проверяет, не повреждены ли эти значения.Если нет, это говорит вам.

0 голосов
/ 10 декабря 2011

Возможно, вам просто повезло, потому что вы используете 2000 в качестве размера. В зависимости от размера int общий размер делится на 32 или 64, поэтому велика вероятность того, что его окончание действительно завершит «реальное» распределение. Попробуйте использовать нечетное количество байтов (для этого лучше использовать массив char) и посмотрите, все ли системы обнаруживают его.

В любом случае вы не должны полагаться на поиск этих ошибок таким образом. Всегда используйте valgrind или подобное для проверки доступа к памяти.

...