0xDEADBEEF équivalent pour le développement 64 bits?

Pour le développement C ++ pour les systèmes 32 bits (que ce soit Linux, Mac OS ou Windows, PowerPC ou x86), j’ai des pointeurs initialisés qui ne seraient pas définis (par exemple, ils ne peuvent pas obtenir immédiatement une valeur correcte) comme ceci:

 int *pInt = reinterpret_cast(0xDEADBEEF); 

(Pour enregistrer la saisie et être DRY, le côté droit devrait normalement être une constante, par exemple BAD_PTR.)

Si pInt est déréférencé avant d’obtenir une valeur correcte, il se bloquera immédiatement sur la plupart des systèmes (au lieu de se bloquer beaucoup plus tard lorsque de la mémoire est écrasée ou passe dans une très longue boucle).

Bien sûr, le comportement dépend du matériel sous-jacent (obtenir un entier de 4 octets à partir de l’adresse impaire 0xDEADBEEF à partir d’un processus utilisateur peut être parfaitement valide), mais le crash a été fiable à 100% pour tous les systèmes développés jusqu’à présent ( Mac OS 68xxx , Mac OS PowerPC, Linux Redhat Pentium, Interface utilisateur graphique Pentium Windows, Console Windows Pentium). Par exemple, sur PowerPC, il est illégal (erreur de bus) de récupérer un entier de 4 octets à partir d’une adresse impaire.

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

En général, peu importe le modèle que vous écrivez, il est important que vous puissiez identifier le modèle afin de déterminer où les problèmes se produisent. Il se trouve que dans le kernel Linux, ils sont souvent choisis de manière à pouvoir être piégés si les adresses sont déréférencées.

Jetez un œil dans le kernel Linux à l’ adresse include / linux / poison.h . Ce fichier contient différentes valeurs de poison pour de nombreux sous-systèmes du kernel. Il n’y a pas une seule valeur de poison appropriée.

Vous pouvez également vérifier les fichiers d’inclusion par architecture dans l’arborescence des sources du kernel Linux pour obtenir des informations sur ce qui est utilisé sur des architectures spécifiques.

0xBADC0FFEE0DDF00D

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

La plupart des systèmes 64 bits actuels vous permettent d’utiliser uniquement les 2 48 à 52 52 bits inférieurs de l’espace d’adressage. les bits supérieurs de l’adresse doivent être à zéro. Certaines puces (par exemple amd64) vous permettent également d’utiliser les valeurs les plus élevées 2 48 –2 52 . Les adresses en dehors de ces plages ne peuvent jamais être associées à la mémoire accessible; le matériel ne le permet tout simplement pas.

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

En passant, vous ne voulez vraiment pas utiliser une valeur proche de 0, car cela rend difficile de déréférencer un déréférencement de NULL – un access de membre de structure, par exemple – à une déréférence du motif de poison.

Je suppose que vous avez déjà actualisé NULL (c’est-à-dire 0 sans le cast transcrit). C’est certainement le choix le plus sûr, car, en théorie, un pointeur valide pourrait indiquer l’adresse mémoire 0xDEADBEEF (ou toute autre adresse mémoire non NULL).

0xDEADBEEFBAADF00D pourrait fonctionner.

Je n’ai pas un bon choix pour vous, mais voici une liste de mots hexadécimaux que vous pouvez utiliser pour créer votre phrase.

Deux 0xDEADBEEF devraient suffire, je pense ..

Je vois plusieurs réponses affirmant que NULL est un bon choix, mais je ne suis pas d’accord.

NULL est souvent utilisé comme valeur de retour valide pour les fonctions. Il indique un retour d’échec ou une valeur inconnue. C’est un sens différent de “pointeur non initialisé”.

Utiliser un débogueur sur le code et voir NULL laisserait alors deux possibilités: le pointeur n’a jamais été initialisé ou une allocation mémoire a échoué.

Définir le pointeur non initialisé sur 0xDEADBEEF ou l’équivalent 64 bits signifie qu’un pointeur NULL indique une valeur intentionnelle.

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

De manière réaliste, tout système d’exploitation moderne devrait protéger l’access aux premières pages de la mémoire de processus, donc NULL devrait être une bonne valeur de pointeur non valide. Assez bien, il est déjà pré-défini pour vous.

0x42 pourrait-il fonctionner sur 32 bits et 64 bits? (Il devrait toujours déclencher un plantage car il est assez proche du pointeur NULL, et étant donné qu’il est plutôt volumineux, il est probable que vous ne l’ayez pas dans une déréférence régulière d’un champ de structure avec le pointeur de structure NULL).