对于32位系统(无论是Linux, 苹果系统 或Windows, PowerPC 或x86)我的初始指针原本是不确定的(例如他们无法立即获得适当的价值)这样:

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

(为了节省打字和被 干燥 右侧通常会处于常数,例如BAD_PTR。)

如果品脱在获得适当的值之前先将其删除,则它将在大多数系统上立即崩溃(而不是在某些内存被覆盖或进入很长的循环时崩溃)。

当然,该行为取决于基础硬件(从奇数地址从用户流程中获取4个字节整数可能是完全有效的),但是崩溃对于我到目前为止开发的所有系统都是100%可靠的(苹果系统 68xxx, ,Mac OS PowerPC,Linux Redhat Pentium,W​​indows GUI Pentium,W​​indows Console Pentium)。例如,在PowerPC上,从奇数地址获取4个字节整数是非法的(总线故障)。

在 64 位系统上,这个值有什么好处?

有帮助吗?

解决方案

一般情况下是没有关系的 确切地 无论您编写什么模式,重要的是您可以识别该模式以确定问题发生的位置。碰巧的是,在 Linux 内核中,通常会选择这些地址,以便在取消引用地址时可以捕获它们。

查看 Linux 内核: 包括/linux/poison.h. 。该文件包含许多不同内核子系统的不同毒害值。没有一种毒药值是合适的。

此外,您还可以检查 Linux 内核源代码树中每个体系结构的包含文件,以获取有关特定体系结构上使用的内容的信息。

其他提示

0xBADC0FFEE0DDF00D

根据维基百科,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内存地址)。

0xDEADBEEFBAADF00D可能工作。

我没有给你一个不错的选择,但这里的十六进制字列表你可以用它让你的短语。

二0xDEADBEEFs应该够了,我想..

我看到几个答案自称NULL是一个不错的选择,但我不同意。

NULL常被用作从功能有效的返回值。它表明一个失败返回或未知值。这比不同的含义“未初始化的指针。”

在代码中使用调试器,看到NULL会再离开两种可能性:指针永远不会初始化或者它未能分配内存

的未初始化的指针设置为0xDEADBEEF或64位等效意味着一个NULL指针指示的有意值。

这取决于过程的OS和环境上。我不认为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 位只是更“向后兼容”
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top