2015-06-15 3 views
4

Является ли чтение из случайного адреса безопасным? Я знаю, что писать - это неопределенное поведение, но как насчет чтения?Является ли чтение из нераспределенной памяти безопасным?

Ну, во многих визуальных отладчиках я могу видеть содержимое памяти в произвольном адресе. Как это делается?

+1

нет. он не определен и, вероятно, вызовет segfault. он показывает, потому что текущая страница фактически распределена процессу, в смысле ОС. – HuStmpHrrr

+6

Нет. Чтение на случайном адресе в большинстве случаев вызывает ошибку сегментации, поскольку она будет за пределами границ сегментов, которые операционные системы зарезервировали для выполнения вашего процесса. –

+0

Отладчик может знать больше о базовой системе, чем вы можете смело предположить в коде C. Или вы просто получите «повезло». Чтение с произвольного адреса * может случиться «работать». –

ответ

5

Поскольку поведение не определено, ответ не определен - или, по крайней мере, неустойчивый.

Если вам повезет, а случайный адрес - within the memory bounds вашей программы, было бы нормально читать, и вы просто получите случайный барахло.

Если это вне области действия (то есть 0x0/NULL), вы, скорее всего, получите segmentation fault (хотя это опять же не гарантировано), что прекратит вашу программу - если вы считаете это безопасным «тогда да, иначе нет.

+2

Нет гарантии (на языке C), что доступ к недопустимому адресу приведет к ошибке сегментации. –

+0

@KeithThompson true - отредактирован соответственно –

+0

Как программа может найти свои «границы памяти»? – cubrr

3

Нет, это не безопасно. Даже если вы не заботитесь о том, чтобы значение было определено или точным, есть такая вещь, как память, отображаемая IO, поэтому случайный адрес может взаимодействовать с периферийным оборудованием. Я сделал это за несколько дней до защищенной памяти, и да, это может сбить систему.

В настоящее время, в зависимости от вашей системы, я ожидаю увидеть segfault для адресов вне вашего пространства процесса. Без этой защиты плохое приложение может получить доступ к ценным данным, таким как пароли, данные кредитной карты и т. Д., Когда используется в хорошем приложении.

Кроме того, адреса, которые вы видите в отладчике, скорее всего, не являются реальными физическими адресами. Вместо этого вы, вероятно, видите только адреса виртуальной памяти.

Смежные вопросы