Frage

Für C ++ Entwicklung für 32-Bit-Systeme (sei es Linux, Mac OS oder Windows PowerPC oder x86) Ich habe Zeiger initialisiert, dass sonst undefiniert sein würde (zum Beispiel können sie nicht sofort einen richtigen Wert erhalten) wie folgt:

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

(Zum Speichern der Eingabe und sein DRY die rechte Seite normalerweise würde wird in einem konstanten, z.B. BAD_PTR.)

Wenn pInt dereferenziert, bevor es einen richtigen Wert wird dann es stürzt ab sofort auf den meisten Systemen (statt Absturz viel später, wenn ein Teil des Speichers überschrieben oder gehen in eine sehr lange Schleife).

Natürlich ist das Verhalten abhängig von der zugrunde liegenden Hardware (immer eine 4-Byte-Ganzzahl von den ungeraden 0xDEADBEEF von einem Benutzerprozess ansprechen kann perfekt sein gültig), aber hat das Krachen für alle 100% zuverlässig gewesen Systeme Ich habe bisher (Mac OS 68xxx , Mac OS entwickelt PowerPC, Linux Redhat Pentium, Pentium Windows-GUI Windows Konsole Pentium). Zum Beispiel auf PowerPC ist es illegal, (Bus Fehler) eine 4-Byte-Ganzzahl von einer ungeraden Adresse zu holen.

Was ist ein guter Wert für das auf 64-Bit-Systemen?

War es hilfreich?

Lösung

Im Allgemeinen ist es egal, genau , welches Muster Sie schreiben, es wichtig ist, dass Sie das Muster, um zu identifizieren, um zu bestimmen, wo Probleme auftreten. Es ist einfach so passiert, dass in der Linux-Kernel diese oft so gewählt werden, dass sie, wenn die Adressen dereferenziert werden gefangen werden können.

Haben Sie einen Blick in den Linux-Kernel unter include / linux / poison.h . Diese Datei enthält verschiedene Giftwerte für die vielen verschiedenen Kernel-Subsysteme. Es gibt keinen, Gift Wert, der angemessen ist.

Auch könnte man pro-Architektur überprüft Dateien im Linux-Kernel-Quellbaum enthält für Informationen über was auf bestimmte Architekturen verwendet wird.

Andere Tipps

0xBADC0FFEE0DDF00D

Laut Wikipedia wird BADC0FFEE0DDF00D auf IBM RS verwendet / 6000 64-Bit-Systeme uninitialized CPU-Register, um anzuzeigen.

Die meisten aktuellen 64-Bit-Systemen können Sie verwenden nur die niedrigste 2 48 -2 52 Bits des Adressraums; höhere Bits der Adresse müssen alle Nullen sein. Einige Chips (z amd64) auch lassen Sie die höchste 2 48 -2 52 . Adressen außerhalb dieser Bereiche können nicht immer auf zugängliche Speicher abgebildet werden; die Hardware einfach wird es nicht zulassen.

ich empfehlen Ihnen daher einen Wert verwenden Nähe von 2 63 , die bei weitem nicht eine der beiden möglicherweise verwendbaren Räume ist. Wenn die führenden vier hexadezimalen Ziffern 7FF8 sind, wird der Wert mit doppelter Genauigkeit wird Gleitkommazahlen NaN, was bequem ist. Also mein vorgeschlagener nette hexadezimaler Ausdruck ist 0x7FF8BADFBADFBADF.

Durch die Art und Weise, die Sie wirklich nicht wollen, einen Wert nahe 0 verwenden, denn das macht es schwer, eine sagen Offset dereferenzieren von NULL - ein Strukturelement Zugang, zum Beispiel - von ein dereferenzieren des Giftes Muster.

Ich nehme an, Sie bereits NULL (das heißt 0 ohne Typumwandlung) diskontiert haben. Es ist definitiv die sicherste Wahl, als in der Theorie ein gültiger Zeiger könnte Punkt auf die Speicheradresse 0xDEADBEEF (oder irgendeine andere nicht-NULL-Speicheradresse).

0xDEADBEEFBAADF00D funktionieren könnte.

Ich habe keine gute Wahl für Sie, aber hier ist eine Liste von Hex-Wörter dass Sie verwenden, um Ihre Phrase zu machen.

Zwei 0xDEADBEEFs genug sein sollte, denke ich ..

ich mehr Antworten sehen behaupten NULL ist eine gute Wahl, aber ich nicht zustimmen.

NULL wird oft als ein gültiger Rückgabewert von Funktionen verwendet. Es zeigt einen Fehler Rückkehr oder einen unbekannten Wert. Dies ist eine andere Bedeutung als „nicht initialisierte Zeiger.“

Mit NULL einen Debugger auf dem Code und zu sehen, würde dann zwei Möglichkeiten lassen: Der Zeiger wurde nie initialisiert oder es hatte eine Speicherzuordnung fehlgeschlagen

.

Einstellen der Zeiger auf nicht initialisierten 0xDEADBEEF oder die 64-Bit-Äquivalent bedeutet, dass ein NULL-Zeiger einen gewollten Wert zeigt.

Es hängt von dem O und der Umwelt, natürlich. Ich glaube nicht, 0xDEADBEEF ist unbedingt ein schlechter Zeiger in einem beliebigen 32-Bit-System, auch nicht.

Realistisch betrachtet, sollte jedes modernes O zugriffs Schutz sein, die ersten paar Seiten von Prozessspeichern, so NULL ein guter ungültiger Zeigerwert sein sollte. Günstig genug, ist es für Sie schon vordefiniert.

0x42 kann arbeiten beide auf 32-Bit- und 64-Bit? (Es soll immer noch einen Absturz auslösen, da sie nahe genug an den NULL-Zeiger ist, und da es ist ziemlich groß, die Chancen sind Sie es innerhalb einer regelmäßigen dereferenzieren einer Struktur Feld mit dem Strukturzeiger ist NULL nicht habe).

Da das System ich im Grunde gearbeitet läuft auf x86_64-Plattform, der Wert ich benutze, ist:

0xDEADBEEFDEADBEEF

Die Gründe dafür sind:

  • Auf x86_64-Plattform, nur die niedrige Ordnung 48 Bits für virtuelle Speicheradresse in der aktuellen Implementierung verwendet werden, ein beliebigen Wertes Bedeutung> 2 ^ 48 arbeiten sollte: https://en.wikipedia.org/wiki/X86-64
  • Wie 0xDEADBEEF zu diesem Zweck in 32bit bereits sehr gut bekannt ist, 0xDEADBEEFDEADBEEF in 64-Bit ist nur mehr ‚abwärtskompatibel‘
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top