Обновить

Откуда берётся мусор? Рассмотрим следующую программу: #include <stdio.h> int main () { int a [100]; int i; ...

Время на прочтение1 мин
Охват и читатели430
Всего голосов 4: ↑3 и ↓1+2
Комментарии13

Комментарии 13

ЗакрепленныеЗакреплённые комментарии

Можно выключить ASLR тогда будет выделяться память каждый раз в одном месте если это возможно.
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

Какие виртуальные адреса? В примере память выделяется на стеке.

А стек находится в виртуальном адресном пространстве.

Да всё равно где он находится. До main() его уже потрогал тот код, который в main() передаёт управление. И там будет мусор.

Секундочку. В main передаёт управление загрузчик, который при каждом вызове исполняемого файла делает в точности одно и то же. И также одно и то же делает bash (даже если не учитывать, что он находится в другом адресном пространстве). Даже если загрузчик использует с какой-то целью память процесса (например, стек), то у него нет никаких оснований делать это с разными результатами при разных вызовах. Вот я и спрашиваю, где именно возникают эти байты и различие в них?

У меня при этом достаточно оперативной памяти и нет вытеснения страниц, которое могло бы привести к перераспределению физических адресов.

Даже если взять, что загрузчик каждый раз делает идентичные вычисления и сохраняет одинаковые данные в стекле, объявление "int a [100]" на них все равно не попадает, а размещается выше по стеклу.

Моё предположение в том, что выдаваемое программе при загрузке адресное пространство уже было ранее использовано другими процессами (и естественно чистить его никто не будет). Вот так и получается, что мы читаем мусорные данные, которые на самом деле являются фактом жизни в этих физических адресах других процессов

Моя версия в "int a [100];" каждый раз память выделяется в разных местах.

Но почему?

Можно выключить ASLR тогда будет выделяться память каждый раз в одном месте если это возможно.
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

О!!!

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

а содержимое буфера теперь всегда одинаковое?

Да.

попробуйте запустить этот код на какой-нибудь железке, без внешней сети и внешних сенсоров, и желательно чтобы была однопоточная.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации