2013-06-20 11 views
5

Supponiamo di dichiarare una variabile x e di lasciarla non inizializzata. Vado a stampare il suo valore. Vedo un po 'di spazzatura.In che modo una variabile non inizializzata ottiene un valore casuale?

Da dove viene? Inoltre, perché non viene utilizzato per generare numeri casuali? Intendo invece di usare un generatore pseudo-casuale.

+2

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

+0

Basta provarlo, lanciare più volte il tuo programma stampando il valore della variabile: vedrai che è lungi dall'essere utilizzabile come valore casuale – Antonio

+0

che ho fatto. E mi dà lo stesso valore ogni volta. Come funziona la deallocazione della memoria C? –

risposta

7

Il valore "casuale" è semplicemente ciò che è rimasto in memoria in quella posizione. Di solito la memoria non viene cancellata/azzerata quando viene liberata, quindi tutto ciò che è presente rimarrà fino a quando non viene sovrascritto.

+1

Vedere [il mio commento sopra] (http://stackoverflow.com/questions/17216663/ how-does-an-uninitialized-variable-get-a-random-value # comment51503431_17216663) ... si dovrebbe notare che questo comportamento non è definito. –

1

La spazzatura può provenire da due posti:

  • Quando RAM dinamica viene acceso, le cellule rimangono in stato arbitrario fino inizializzato; questa è una proprietà della maggior parte delle implementazioni hardware della memoria
  • Quando il programma viene eseguito, lascia i valori delle variabili che sono state utilizzate in precedenza ma che non sono più in ambito. Questa proprietà può essere utilizzata per gli attacchi: l'analisi della posta indesiderata lasciata dal tuo programma può fornire informazioni a scrittori senza scrupoli di plug-in o altre librerie che usi.
0

Il valore di una variabile non inizializzata è il valore presente nell'area di memoria corrispondente prima che sia stato assegnato a questa variabile. Il più delle volte è imprevedibile e dipende da qualsiasi cosa sia accaduta prima in questa area di memoria.

Questo è talvolta usato come entropia aggiuntiva per generare numeri pseudo-casuali. Anni fa, uno sviluppatore Debian pensava che una variabile non inizializzata fosse un bug in OpenSSL e lo impostasse a zero. Quindi le chiavi generate sono diventate in qualche modo ipotizzabili e ora ogni utente Debian deve installare una lunga lista di chiavi nere elencate sulle loro macchine.

0

La risposta breve? Dipende dal compilatore, ma non farlo.

La risposta lunga:
Accesso al valore di un inizializzati POD (vecchi dati semplici, come int) Tipo richiama comportamento indefinito, il che significa che lo standard C non pone requisiti su un conforme attuazione in questa situazione. Pertanto, un compilatore è autorizzato a emettere codice macchina che avvia nethack, formatta il disco rigido o non esegue affatto, pur rimanendo conforme allo standard C, purché possa dimostrare che un comportamento indefinito si verifica in qualsiasi punto del programma.

(Leggi anche: What Every C Programmer Should Know About Undefined Behavior)

Quindi, ciò che in realtà (probabilmente) succede?
Nella maggior parte dei compilatori moderni senza ottimizzazione abilitata, il compilatore assegnerà semplicemente uno slot nello stack (o un registro) alla variabile, quindi accederà a ciò che era in quella posizione prima di quando richiesto. Il risultato è ciò che sembra essere "memoria casuale", sebbene in realtà sia it's not very random at all.

Che cosa succede se abilitato le ottimizzazioni?
Se poi si va a compilare il codice su un livello di ottimizzazione più elevato (o il compilatore viene aggiornato e ora si ottimizza in modo più aggressivo), tutte le scommesse sono disattivate.Ad esempio, il compilatore può rimuovere qualsiasi chiamata che coinvolge x, assegnare x alla stessa posizione di alcune altre variabili (sostenendo che non è possibile utilizzare x, poiché non è ancora inizializzato) o any other combination of strange effects.

In altre parole, nel momento in cui si accede a tale variabile non inizializzata, il proprio programma può iniziare a fare qualsiasi cosa che sia fuori dal proprio controllo. Non farlo - ecco i draghi.

Problemi correlati