2013-06-20 2 views
5

Предположим, что я объявляю переменную x и оставьте ее неинициализированной. Я продолжаю печатать его значение. Я вижу какой-то хлам.Как неинициализированная переменная получает случайное значение?

Откуда он? Также почему он не используется для генерации случайных чисел? Я имею в виду вместо использования псевдослучайного генератора.

+2

http://research.swtch.com/openssl –

+0

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

+0

Я сделал. И это дает мне такую ​​же ценность каждый раз. Как работает функция освобождения памяти C? –

ответ

7

«Случайное» значение - это просто то, что осталось в памяти в этом месте. Обычно память не стирается/обнуляется, когда она освобождается, поэтому все, что там было, будет задерживаться до тех пор, пока оно не будет перезаписано.

+1

См. [Мой комментарий выше] (http://stackoverflow.com/questions/17216663/ how-does-an-uninitialized-variable-get-a-random-value # comment51503431_17216663) ... вы должны отметить, что это неопределенное поведение. –

1

Нежелательный может поступать из двух мест:

  • Когда динамические ОЗУ питание, клетки остаются в произвольном состоянии до тех пор, пока инициализируются; это свойство большинства аппаратных реализаций памяти
  • Когда ваша программа запускается, она оставляет значения переменных, которые использовались ранее, но больше не находятся в области видимости. Это свойство может использоваться для атак: анализ нежелательной информации, оставленной вашей программой, может предоставить информацию недобросовестным писателям подключаемых модулей или других библиотек, которые вы используете.
0

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

Это фактически иногда используется в качестве дополнительной энтропии для генерации псевдослучайных чисел. Несколько лет назад разработчики Debian считали, что неинициализированная переменная является ошибкой в ​​OpenSSL и устанавливает ее в ноль. Тогда сгенерированные ключи стали несколько догадки, и теперь каждый пользователь Debian должен установить длинный список черных перечисленных ключей на своих машинах.

0

Короткий ответ? Это зависит от вашего компилятора - но не делайте этого.

Длинный ответ:
Доступ значение неинициализированный POD (простые старые данные, такие как int) тип вызывает неопределенное поведение, что означает, что стандарт C не устанавливает каких-либо требований по соответствующей реализации в эта ситуация. Таким образом, компилятору разрешено испускать машинный код, который запускает nethack, форматирует ваш жесткий диск или вообще ничего не делает, при этом все еще соответствует стандарту C, если он может доказать, что неопределенное поведение происходит в любом месте вашей программы.

(Также читайте: What Every C Programmer Should Know About Undefined Behavior)

Итак, что же на самом деле (вероятно) происходит?
В большинстве современных компиляторов без оптимизации включен, компилятор просто назначит слот в стеке (или регистр) для переменной, а затем получит доступ к тому, что было в этом месте до того, как его спросят. В результате получается «случайная память», хотя на самом деле it's not very random at all.

Что может случиться, если я включил оптимизацию?
Если вы затем перейдете на компиляцию кода на более высоком уровне оптимизации (или компилятор обновлен и теперь оптимизирован более агрессивно), все ставки отключены.Например, компилятор может удалить любые вызовы, которые включают x, назначить x тому же месту, что и некоторая другая переменная (утверждая, что x не может быть использован, так как он еще не инициализирован) или any other combination of strange effects.

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