对于C ++开发的32位系统(无论是Linux的, 的Mac OS或Windows, PowerPC
或x86)我已初始化,否则将是不确定的指针(例如,它们不能立即得到适当的值),如下所示:
int *pInt = reinterpret_cast<int *>(0xDEADBEEF);
(为了节省打字和被DRY右手侧通常将在一个常数,例如BAD_PTR。)
如果它获得前一个合适的值,然后它会立即崩溃在大多数系统品脱解除引用(而不是当一些记忆被覆盖崩溃很久以后或进入一个很长的循环)。
当然行为取决于底层硬件(从一个用户进程得到从奇数地址0xDEADBEEF一个4字节整数可以是完全有效的)上,但崩溃已100%可靠,因为我已经为迄今开发的所有系统(的Mac OS 68xxx和Mac OS的PowerPC,Linux的红帽奔腾,Windows图形用户界面的奔腾,Windows控制台奔腾)。 例如在PowerPC它是非法的(总线故障),以从奇数地址取一个4字节整数。
究竟是什么在64位系统上物有所值?
一般不要紧到底是什么模式,你写的,它很重要,你可以识别以确定在问题发生的格局。 它只是恰巧,在Linux内核中,这些往往选择,使他们能够当地址解引用被困。
在Linux内核看看在include / linux / poison.h 。 该文件包含了很多不同的内核子系统不同的毒药值。 没有一个毒药值是合适的。
此外,您可能会检查每个架构包括在Linux内核源代码树对什么是特定的架构中使用的信息的文件。
根据维基百科 ,BADC0FFEE0DDF00D用在IBM RS / 6000 64位系统,以指示初始化CPU寄存器。
大多数当前的64位系统让你只使用地址空间的最低2 48 -2 52个比特; 地址的高位必须全部为零。 有些芯片(如AMD64)也让您使用最高 2 48 -2 52。 这些范围之外的地址永远不能被映射到访问的存储器; 硬件根本不会允许它。
因此,我建议你使用接近2 63的值,这是隔靴搔痒要么可能是可用空间。 如果四个主要的十六进制数字是7ff8,该值将是一个双精度浮点NaN的,这是方便。 所以我的建议可爱的十六进制短语0x7FF8BADFBADFBADF。
顺便说一句,你真的不想用接近0的值,因为这使得它很难说NULL的偏移提领-结构成员访问,例如-从毒模式的间接引用。
我假设你已经贴现NULL(即0无类型转换)。 这绝对是最安全的选择,因为,从理论上讲,一个有效的指针会指向内存地址0xDEADBEEF(或任何其他非NULL内存地址)。
我没有一个很好的选择你,但这里有一个十六进制单词列表 ,你可以用它让你的短语。
我看到几个答案自称NULL是一个不错的选择,但我不同意。
NULL常被用作从功能有效的返回值。 它表明一个失败返回或未知值。 这是一个比一个不同的含义“未初始化的指针。”
然后使用上的代码调试器,看空会留下两种可能性:指针永远不会初始化或者它没有一个内存分配。
设置未初始化指针0xDEADBEEF或64位等效意味着一个NULL指针指示的有意值。
这当然取决于操作系统和环境上。 我不认为0xDEADBEEF必然是一个任意的32位系统中的错误的指针,无论是。
实际上,任何现代的操作系统应该是访问保护进程内存的前几页,所以NULL应该是一个很好的无效指针值。 够方便的是,它已经为你预先定义。
0x42
可以在32位和64位工作? (应该还是引发崩溃,因为它是足够接近NULL指针,并赋予它的相当大的,机会是你不会的结构域与结构指针是NULL定期提领内有它)。
由于我的工作基本上运行在x86_64平台的系统,我用的值是:
0xDEADBEEFDEADBEEF
理由是:
- 在x86_64平台,仅低阶48个比特被用于在当前的实现虚拟存储器地址,这意味着任何值> 2 ^ 48应该工作: https://en.wikipedia.org/wiki/X86-64
- 由于
0xDEADBEEF
已经是非常有名为此,在32位, 0xDEADBEEFDEADBEEF
在64位只是更多的“向后兼容”