Question

Pour le développement de C pour les systèmes 32 bits (que ce soit Linux, Mac OS ou Windows, PowerPC ou x86) J'ai initialisées pointeurs serait autrement non défini (par exemple, ils ne peuvent pas immédiatement obtenir une valeur correcte) comme ceci:

int *pInt = reinterpret_cast<int *>(0xDEADBEEF);

(Pour la frappe et être la droite normalement être dans une constante, par exemple, BAD_PTR.)

Si pInt est déréférencé avant qu'il ne devienne une valeur appropriée puis il se bloque immédiatement sur la plupart des systèmes (au lieu de écraser beaucoup plus tard, quand une mémoire est écrasé ou aller dans une boucle très long).

Bien sûr, le comportement dépend du sous-jacent matériel (obtention d'un nombre entier de 4 octets à partir de la cote adresse 0xDEADBEEF d'un processus utilisateur peut être parfaitement valide), mais le plantage est fiable à 100% pour tous les systèmes I ont mis au point pour ce jour (Mac OS 68xxx , Mac OS PowerPC, Linux Redhat Pentium, Windows GUI Pentium, Windows console Pentium). Par exemple, sur PowerPC, il est illégal (bus faute) pour aller chercher un nombre entier de 4 octets à partir d'une adresse impaire.

Quelle est une bonne valeur pour cela sur les systèmes 64 bits?

Était-ce utile?

La solution

En général, il n'a pas d'importance exactement quel modèle vous écrivez, il importe que vous pouvez identifier le modèle afin de déterminer où les problèmes se produisent. Il se trouve que dans le noyau Linux ce sont souvent choisis de manière à pouvoir être pris au piège si les adresses sont déréférencé.

Regardez dans le noyau Linux include / linux / poison.h . Ce fichier contient différentes valeurs de poison pour beaucoup de différents sous-systèmes du noyau. Il n'y a pas une valeur de poison qui est approprié.

En outre, vous pouvez vérifier par l'architecture inclure des fichiers dans l'arborescence des sources du noyau Linux pour plus d'informations sur ce qui est utilisé sur des architectures spécifiques.

Autres conseils

0xBADC0FFEE0DDF00D

Selon Wikipedia , BADC0FFEE0DDF00D est utilisé sur RS / 6000 systèmes 64 bits IBM pour indiquer les registres CPU non initialisées.

La plupart des systèmes 64 bits actuels vous permettent d'utiliser uniquement le plus bas 2 48 -2 52 bits de l'espace d'adressage; les bits supérieurs de l'adresse doit être tout à zéro. Certaines puces (par exemple amd64) vous permettent également d'utiliser le plus haut 2 48 -2 52 . Adresses en dehors de ces plages ne peuvent jamais être mis en correspondance avec la mémoire accessible; le matériel simplement ne le permettra pas.

Je recommande donc d'utiliser une valeur proche de 2 63 , ce qui est loin d'être soit des espaces éventuellement utilisables. Si les quatre premiers chiffres hexadécimaux sont 7ff8, la valeur sera une double précision à virgule flottante NaN, ce qui est pratique. Donc, ma phrase hexadécimal mignon est suggéré 0x7FF8BADFBADFBADF.

Par ailleurs, vous ne voulez vraiment pas utiliser une valeur proche de 0, parce que il est difficile de dire un Impression offset déréférencer NULL - un accès membre de la structure, par exemple - de un déréférencement du motif de poison.

Je suppose que vous avez déjà NULL réduit (à savoir 0 sans typecast). Il est sans aucun doute le choix le plus sûr, comme, en théorie, un pointeur valide peut point à l'adresse de mémoire 0xDEADBEEF (ou toute autre adresse de mémoire non NULL).

0xDEADBEEFBAADF00D pourrait fonctionner.

Je n'ai pas un bon choix pour vous, mais voici une liste des mots hexagonaux que vous pouvez utiliser pour faire votre phrase.

Deux 0xDEADBEEFs devrait être suffisant, je pense ..

Je vois plusieurs réponses NULL est un réclame bon choix, mais je suis en désaccord.

NULL est souvent utilisé comme une valeur de retour valide des fonctions. Il indique un retour d'échec ou d'une valeur inconnue. Ceci est un sens différent de « pointeur non initialisé. »

L'utilisation d'un débogueur sur le code et voir NULL alors laisser deux possibilités: le pointeur n'a jamais été initialisé ou il avait échoué une allocation de mémoire

.

Définition du pointeur non initialisé à 0xDEADBEEF ou l'équivalent de 64 bits signifie qu'un pointeur NULL indique une valeur intentionnelle.

Cela dépend du système d'exploitation et l'environnement, bien sûr. Je ne pense pas 0xDEADBEEF est nécessairement un mauvais pointeur dans un système 32 bits arbitraire, que ce soit.

De façon réaliste, tout système d'exploitation moderne devrait être protégeant l'accès aux premières pages de mémoire du processus, donc NULL devrait être une bonne valeur de pointeur non valide. assez pratique, il est déjà pré-défini pour vous.

0x42 pourrait travailler à la fois 32 bits et 64 bits? (Il devrait encore déclencher un accident car il est assez proche du pointeur NULL, et étant donné qu'il est assez grand, les chances sont que vous ne l'avoir dans un déréférencement régulier d'un champ de structure avec le pointeur de la structure étant NULL).

Le système que je travaillais sur la plate-forme fonctionne essentiellement sur x86_64, la valeur que je l'utilise est:

0xDEADBEEFDEADBEEF

Les raisons sont les suivantes:

  • Sur la plateforme x86_64, seul le poids faible 48 bits sont utilisés pour l'adresse de mémoire virtuelle mise en œuvre actuelle, ce qui signifie une valeur> 2 ^ 48 devrait fonctionner: https://en.wikipedia.org/wiki/X86-64
  • Comme 0xDEADBEEF est déjà très bien connu à cet effet dans 32bit, 0xDEADBEEFDEADBEEF en 64bit est un peu plus « rétrocompatible »
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top