2010-04-17 7 views
2
int myInt; 
cout << myInt; // Garbage like 429948, etc 

Si je génère et/ou travaille avec des variables non initialisées en C++, quelles sont leurs valeurs supposées?C++: Variables non initialisées garbage

  • Les valeurs réelles dans la mémoire du "dernier utilisateur"?

par exemple: programme A est fermé, il y avait un int avec la valeur 1234 à 0x1234 -> Je lance mon programme, myInt obtient l'adresse 0x1234, je sortie comme ci-dessus -> 1234

  • Est-ce juste une poubelle aléatoire?
+6

Ordures aléatoires. – Joe

+0

N'existe-t-il pas de systèmes d'exploitation sécurisés qui initialisent la totalité de la mémoire d'initialisation afin de ne pas voir ce qui a été laissé par un autre processus ou un autre utilisateur? –

+0

Garbage, oui, mais esp. pour empiler des variables plus dangereuses que juste "aléatoire". Puisque la valeur est déterminée par le chemin d'exécution précédent, vous vous retrouvez avec des bogues vraiment bizarres. – peterchen

Répondre

4

Sa valeur est indéterminée. (§8.5/9)

Il n'y a pas d'essayer d'obtenir des données significatives de celui-ci. En pratique, c'est juste ce qui s'est passé.

La plupart des compilateurs emballeront des données de débogage « significatives » là-dedans dans une version de débogage. Par exemple, MSVC va initialiser les choses à 0xCCCCCCCC. Ceci est supprimé dans une construction optimisée, bien sûr.

+3

0xCCCCCC est intéressant car en x86, 0xCC est l'instruction d'interruption de débogage (int3).Par conséquent, si le programme essayait d'exécuter des instructions à partir de la mémoire unitialisée (par exemple en raison d'un dépassement de tampon ou d'un autre bogue), il déboguerait immédiatement dans un débogueur, autoriserait le débogage, le vidage du noyau ou d'autres Fonction dépendante du système d'exploitation. –

11

"Poubelle aléatoire" mais en mettant l'accent sur "poubelle", pas "" sur "aléatoire" - ie, ordures absolument arbitraire sans même aucune garantie de "caractère aléatoire" - les systèmes de compilation et d'exécution sont autorisés à avoir absolument quoi que ce soit (certains systèmes peuvent toujours donner des zéros, d'autres peuvent donner des valeurs différentes arbitraires, etc.).

+0

ordures arbitraires est certainement une meilleure description –

2

le nombre entier est une variable sur la pile, car il est une variable locale. Tant qu'il n'a pas été initialisé, les données sur la pile sont telles quelles. C'est (partie de) une donnée précédemment utilisée. Donc c'est du garbage, mais ce n'est pas aléatoire puisque étant donné l'exécutable et un état begin, la valeur est prévisible. Prédire est difficile car il faut prendre en compte le système d'exploitation, le compilateur, etc. et de plus c'est très inutile.

5

Il n'y a même pas garanti d'être une valeur. En essayant de lire l'int, tout peut arriver (comme un signal envoyé entraînant la fin de votre programme). Avec une importance particulière dans la programmation réelle de la vie, la mise sous tension d'un non initialisé bool peut causer vous frapper ni true ni false cas.

+1

Je ne suis pas sûr que la première partie de ce soit vrai. Certes, la valeur de l'int est indéterminée, mais elle a un emplacement bien défini sur la pile auquel le programme peut accéder légalement, donc je ne vois aucune circonstance dans laquelle l'accès est un comportement indéfini. –

+4

@Tyler le standard dit que c'est un comportement indéfini s'il n'est pas initialisé (voir 4.1/1). Il peut contenir n'importe quel motif binaire, y compris une représentation de piège. –

+0

Comment cela segfault. J'ai du mal à croire cette partie. – Tim

2

Programme A est fermé, il y avait un int avec la valeur 1234 à 0x1234 -> je lance mon programme, myInt obtient le 0x1234 adresse ...

Notez également qu'en raison de la mémoire virtuelle système d'exploitation moderne ce que le programme A appelé adresse 0x1234 est peu susceptible de se référer réellement au même espace dans la mémoire physique que ce que votre programme appelle l'adresse 0x1234.

Questions connexes