質問

C++開発のための32ビットのシステムでLinux、 Mac OS または Windowsでは、 PowerPC またはx86していまinitialisedポインタのこと することで未定義の例できるまでには、さまざまな の取得は適切な値)のように:

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

(保存を打ついて ドライ 右側は通常 する定例BAD_PTR.)

場合にパイントが逆参照される前に取得し、適切な値を でクラッシュすぐにほとんどのシステムの代わりに、 ぶのは当たり前だけど、そこがメモリ上書きされたいと思ってい 非常に長いループ).

もちろんの行動に依存基 ハードウェアとしては、4バイトの整数から奇 住所0xDEADBEEFユーザからのプロセスに完全に 有効)ですが、ぶって100%の信頼性のためのすべての システムの開発を行っていたこれまでに(Mac OS 68xxx, Mac OS PowerPC、Redhat Linux Pentium、Windows GUI Pentium、Windows コンソールPentium).のためのインスタンスにPowerPCさせたりすることも法令で禁止(バス 断層)を取得する4バイトの整数から奇ます。

何が良い値64ビットのシステム?

役に立ちましたか?

解決

一般的に、それはあなたが書くの正確のどのようなパターンは重要ではありません

、あなたが問題が発生している場所を決定するために、パターンを識別できることを重要。それはちょうどので、Linuxのカーネル内のアドレスを間接参照している場合、彼らは捕捉できるように、これらの多くの場合、選択されていることが起こるます。

<のhref = "http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=include/linuxでのLinuxカーネルで見てください/poison.h;hb=HEAD」のrel = "noreferrerは"> / linuxに/ poison.h を含んでいます。このファイルには、多くの異なるカーネル・サブシステムごとに異なる毒の値が含まれています。適切である誰も毒値はありません。

また、あなたは、アーキテクチャごとに固有のアーキテクチャで使用されているかについての情報のためのLinuxカーネルソースツリー内のファイルを含めるかどうかをチェックできます。

他のヒント

0xBADC0FFEE0DDF00D

ウィキペディアするによれば、BADC0FFEE0DDF00Dは、IBM RS / 6000の64ビットシステムで使用されています初期化されていないCPUのレジスタを示します。

ほとんどの現在の64ビット・システムでは、アドレス空間のみ最低2 48 -2 52 ビットを使用してみましょう。アドレスの上位ビットがすべてゼロでなければなりません。いくつかのチップは、(例えば、AMD64)また、あなたが使用してみましょう。の最高の2 48 -2 52 。これらの範囲外のアドレスは、これまでにアクセス可能なメモリにマッピングすることはできません。ハードウェアは、単にそれを許可しません。

私は、したがって、あなたはどこにもおそらく利用可能なスペースのいずれかの近くではありません2に近い値 63 を、使用をお勧めします。主要4進数字が7ff8ある場合、値が便利である倍精度浮動小数点NaNに、あろう。だから私の提案のかわいい進数フレーズが0x7FF8BADFBADFBADFです。

例えば、構造体メンバへのアクセス、 - - から

ところで、あなたは本当にそれはそれは難しいNULLののオフセットのデリファレンスを伝えるためになるため、0に近い値を使用したくありません毒パターンのデリファレンスています。

私はあなたがすでに(型キャストすることなく、すなわち、0)NULLを割り引いてきたと仮定しています。それは、間違いなく最も安全な選択肢だとして、理論的には、有効なポインタの可能性のメモリアドレス0xdeadbeefが(またはその他の非NULLメモリアドレス)。ポイント

0xDEADBEEFBAADF00Dが動作する可能性があります。

私はあなたのために良い選択を持っていないが、ここでは、六角語のリストですのあなたのフレーズを作るために使用することができます。

二つ0xDEADBEEFsは十分なはずです、私が思う..

私はいくつかの答えはNULLを主張参照することは良い選択ですが、私は反対します。

NULLは、多くの場合、関数からの有効な戻り値として使用されています。これは、障害の返品または未知の値を示しています。これは、より違った意味で「初期化されていないポインタ。」

コードにデバッガを使用してNULLを見ることは、2つの可能性を残して:ポインタが初期化されなかったか、それはメモリの割り当てに失敗した。

0xdeadbeefがに初期化されていないポインタを設定または64ビットの同等物は、NULLポインタが意図的な値を示すことを意味する。

これはもちろん、OSや環境に依存します。私はどちらか、0xdeadbeefが、必ずしも任意の32ビットシステムでは悪いのポインタであるとは思いません。

NULLが良い無効なポインタ値でなければなりませんので、

現実的には、現代の任意のOSは、プロセスメモリの最初の数ページのアクセス保護する必要があります。便利なことに、それはあなたのために、すでに事前に定義されます。

0x42は、32ビットと64ビットの両方で動作するだろうか? (それはNULLポインタに十分近いので、それはまだクラッシュを誘発する必要があり、それはかなり大きいということを考えると、チャンスはあなたが構造体ポインタがNULLであることで構造体フィールドの定期的な間接参照以内にそれを持っていないです)。

としてのシステムというのは基本的には走りx86_64のプラットフォームの値を使うには:

0xDEADBEEFDEADBEEF

理由は:

  • にx86_64、みた48ビットの使用のための仮想メモリアドレスに現在の実装は、value>2^48べき: https://en.wikipedia.org/wiki/X86-64
  • として 0xDEADBEEF 既に知られてこの目的のために32bit版、 0xDEADBEEFDEADBEEF で64bitありますので後方互換性の'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top